1import * as zoneRrsetActions from "@distilled.cloud/hetzner/zone_rrset_actions";
2import * as zoneRrsets from "@distilled.cloud/hetzner/zone_rrsets";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5import { type DnsAuth, makeHttpDnsBinding } from "./DnsHttp.ts";
6import { WriteDns, type WriteDnsClient } from "./WriteDns.ts";
7
8/** Runtime layer for {@link WriteDns}. */
9export const WriteDnsHttp = Layer.effect(
10 WriteDns,
11 Effect.suspend(() =>
12 makeHttpDnsBinding({
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<number>,
22): WriteDnsClient => {
23 const authorize = auth.authorize;
24 return {
25 createRecordSet: Effect.fn("Hetzner.DNS.createRecordSet")(
26 function* (request) {
27 return yield* authorize(
28 zoneRrsets.createZoneRrset({
29 id_or_name: String(yield* zoneId),
30 ...request,
31 }),
32 );
33 },
34 ),
35 updateRecordSet: Effect.fn("Hetzner.DNS.updateRecordSet")(
36 function* (name, type, request) {
37 return yield* authorize(
38 zoneRrsets.updateZoneRrset({
39 id_or_name: String(yield* zoneId),
40 rr_name: name,
41 rr_type: type,
42 ...request,
43 }),
44 );
45 },
46 ),
47 deleteRecordSet: Effect.fn("Hetzner.DNS.deleteRecordSet")(
48 function* (name, type) {
49 return yield* authorize(
50 zoneRrsets.deleteZoneRrset({
51 id_or_name: String(yield* zoneId),
52 rr_name: name,
53 rr_type: type,
54 }),
55 );
56 },
57 ),
58 addRecordSetRecords: Effect.fn("Hetzner.DNS.addRecordSetRecords")(
59 function* (name, type, request) {
60 return yield* authorize(
61 zoneRrsetActions.addZoneRrsetRecords({
62 id_or_name: String(yield* zoneId),
63 rr_name: name,
64 rr_type: type,
65 ...request,
66 }),
67 );
68 },
69 ),
70 removeRecordSetRecords: Effect.fn("Hetzner.DNS.removeRecordSetRecords")(
71 function* (name, type, request) {
72 return yield* authorize(
73 zoneRrsetActions.removeZoneRrsetRecords({
74 id_or_name: String(yield* zoneId),
75 rr_name: name,
76 rr_type: type,
77 ...request,
78 }),
79 );
80 },
81 ),
82 setRecordSetRecords: Effect.fn("Hetzner.DNS.setRecordSetRecords")(
83 function* (name, type, request) {
84 return yield* authorize(
85 zoneRrsetActions.setZoneRrsetRecords({
86 id_or_name: String(yield* zoneId),
87 rr_name: name,
88 rr_type: type,
89 ...request,
90 }),
91 );
92 },
93 ),
94 updateRecordSetRecords: Effect.fn("Hetzner.DNS.updateRecordSetRecords")(
95 function* (name, type, request) {
96 return yield* authorize(
97 zoneRrsetActions.updateZoneRrsetRecords({
98 id_or_name: String(yield* zoneId),
99 rr_name: name,
100 rr_type: type,
101 ...request,
102 }),
103 );
104 },
105 ),
106 changeRecordSetTtl: Effect.fn("Hetzner.DNS.changeRecordSetTtl")(
107 function* (name, type, ttl) {
108 return yield* authorize(
109 zoneRrsetActions.changeZoneRrsetTtl({
110 id_or_name: String(yield* zoneId),
111 rr_name: name,
112 rr_type: type,
113 ttl,
114 }),
115 );
116 },
117 ),
118 changeRecordSetProtection: Effect.fn(
119 "Hetzner.DNS.changeRecordSetProtection",
120 )(function* (name, type, change) {
121 return yield* authorize(
122 zoneRrsetActions.changeZoneRrsetProtection({
123 id_or_name: String(yield* zoneId),
124 rr_name: name,
125 rr_type: type,
126 change,
127 }),
128 );
129 }),
130 };
131};