Skip to content
File

Blob: src/worker/objects/card-dav-object.ts

typescript136 lines
1import { DurableObject } from "cloudflare:workers";
2 
3import { createCardDavDoDb, type CardDavDoDb } from "@/worker/db/card-dav-do/client";
4import {
5 createAddressbook as createAddressbookOp,
6 deleteAddressbook as deleteAddressbookOp,
7 getAddressbook as getAddressbookOp,
8 listAddressbooks as listAddressbooksOp,
9 updateAddressbook as updateAddressbookOp,
10} from "@/worker/objects/card-dav/addressbooks";
11import {
12 addressbookMultiget as addressbookMultigetOp,
13 addressbookQuery as addressbookQueryOp,
14 deleteObject as deleteObjectOp,
15 getObject as getObjectOp,
16 putObject as putObjectOp,
17 syncCollection as syncCollectionOp,
18} from "@/worker/objects/card-dav/address-objects";
19import {
20 describe as describeOp,
21 ensureInitialized as ensureInitializedOp,
22 proppatch as proppatchOp,
23} from "@/worker/objects/card-dav/properties";
24import type {
25 AddressbookCreateInput,
26 AddressbookDeleteInput,
27 AddressbookGetInput,
28 AddressbookListInput,
29 AddressbookMultigetInput,
30 AddressbookQueryInput,
31 AddressbookUpdateInput,
32 DeleteAddressObjectInput,
33 DescribeInput,
34 EnsureInitializedInput,
35 GetAddressObjectInput,
36 ProppatchInput,
37 PutAddressObjectInput,
38 SyncCollectionInput,
39} from "@/worker/objects/card-dav/types";
40import { migrateCardDavObject } from "@/worker/objects/common/migrations";
41 
42export type {
43 AddressbookCreateInput,
44 AddressbookDeleteInput,
45 AddressbookGetInput,
46 AddressbookListInput,
47 AddressbookMultigetInput,
48 AddressbookQueryInput,
49 AddressbookRecord,
50 AddressbookUpdateInput,
51 CardDavError,
52 CardDavErrorCode,
53 CardDavResource,
54 DeleteAddressObjectInput,
55 DescribeInput,
56 EnsureInitializedInput,
57 GetAddressObjectInput,
58 ProppatchInput,
59 PutAddressObjectInput,
60 SearchFilter,
61 SyncCollectionInput,
62} from "@/worker/objects/card-dav/types";
63 
64export class CardDavObject extends DurableObject<Env> {
65 readonly db: CardDavDoDb;
66 
67 constructor(ctx: DurableObjectState, env: Env) {
68 super(ctx, env);
69 this.db = createCardDavDoDb(ctx.storage);
70 
71 ctx.blockConcurrencyWhile(async () => {
72 await migrateCardDavObject(this.db);
73 });
74 }
75 
76 async ping(): Promise<{ ok: true; object: "card-dav" }> {
77 return { ok: true, object: "card-dav" };
78 }
79 
80 async ensureInitialized(input: EnsureInitializedInput) {
81 return ensureInitializedOp(this.db, input);
82 }
83 
84 async listAddressbooks(input: AddressbookListInput) {
85 return listAddressbooksOp(this.db, input);
86 }
87 
88 async getAddressbook(input: AddressbookGetInput) {
89 return getAddressbookOp(this.db, input);
90 }
91 
92 async createAddressbook(input: AddressbookCreateInput) {
93 return createAddressbookOp(this.db, input);
94 }
95 
96 async updateAddressbook(input: AddressbookUpdateInput) {
97 return updateAddressbookOp(this.db, input);
98 }
99 
100 async deleteAddressbook(input: AddressbookDeleteInput) {
101 return deleteAddressbookOp(this.db, input);
102 }
103 
104 async describe(input: DescribeInput) {
105 return describeOp(this.db, input);
106 }
107 
108 async getObject(input: GetAddressObjectInput) {
109 return getObjectOp(this.db, input);
110 }
111 
112 async putObject(input: PutAddressObjectInput) {
113 return putObjectOp(this.db, input);
114 }
115 
116 async deleteObject(input: DeleteAddressObjectInput) {
117 return deleteObjectOp(this.db, input);
118 }
119 
120 async proppatch(input: ProppatchInput) {
121 return proppatchOp(this.db, input);
122 }
123 
124 async addressbookQuery(input: AddressbookQueryInput) {
125 return addressbookQueryOp(this.db, input);
126 }
127 
128 async addressbookMultiget(input: AddressbookMultigetInput) {
129 return addressbookMultigetOp(this.db, input);
130 }
131 
132 async syncCollection(input: SyncCollectionInput) {
133 return syncCollectionOp(this.db, input);
134 }
135}