1import * as dns from "@distilled.cloud/cloudflare/dns";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import { type DnsAuth, makeHttpDnsBinding } from "./DnsHttp.ts";
5import { WriteDns, type WriteDnsClient } from "./WriteDns.ts";
6
7/** Runtime layer for {@link WriteDns}. */
8export const WriteDnsHttp = Layer.effect(
9 WriteDns,
10 Effect.suspend(() =>
11 makeHttpDnsBinding({
12 permissionGroups: ["DNS Write"],
13 makeClient: dnsWriteClient,
14 }),
15 ),
16);
17
18/** Build the write client over an injectable auth and zone id. */
19export const dnsWriteClient = (
20 auth: DnsAuth,
21 zoneId: Effect.Effect<string>,
22): WriteDnsClient => {
23 const authorize = auth.authorize;
24 return {
25 createDnsRecord: Effect.fn("Cloudflare.DNS.createDnsRecord")(
26 function* (request) {
27 return yield* authorize(
28 dns.createRecord({ zoneId: yield* zoneId, ...request }),
29 );
30 },
31 ),
32 updateDnsRecord: Effect.fn("Cloudflare.DNS.updateDnsRecord")(
33 function* (dnsRecordId, request) {
34 return yield* authorize(
35 dns.updateRecord({ zoneId: yield* zoneId, dnsRecordId, ...request }),
36 );
37 },
38 ),
39 patchDnsRecord: Effect.fn("Cloudflare.DNS.patchDnsRecord")(
40 function* (dnsRecordId, request) {
41 return yield* authorize(
42 dns.patchRecord({ zoneId: yield* zoneId, dnsRecordId, ...request }),
43 );
44 },
45 ),
46 deleteDnsRecord: Effect.fn("Cloudflare.DNS.deleteDnsRecord")(
47 function* (dnsRecordId) {
48 return yield* authorize(
49 dns.deleteRecord({ zoneId: yield* zoneId, dnsRecordId }),
50 );
51 },
52 ),
53 batchDnsRecords: Effect.fn("Cloudflare.DNS.batchDnsRecords")(
54 function* (request) {
55 return yield* authorize(
56 dns.batchRecord({ zoneId: yield* zoneId, ...request }),
57 );
58 },
59 ),
60 };
61};