@voyantjs/availability 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-pickups.d.ts","sourceRoot":"","sources":["../src/routes-pickups.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,GAAG,EAIT,MAAM,oBAAoB,CAAA;AAwC3B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA0XjC,CAAA"}
@@ -0,0 +1,264 @@
1
+ import { Hono } from "hono";
2
+ import { batchIdsSchema, createBatchUpdateSchema, handleBatchDelete, handleBatchUpdate, notFound, } from "./routes-shared.js";
3
+ import { availabilityService } from "./service.js";
4
+ import { availabilityPickupPointListQuerySchema, availabilitySlotPickupListQuerySchema, customPickupAreaListQuerySchema, insertAvailabilityPickupPointSchema, insertAvailabilitySlotPickupSchema, insertCustomPickupAreaSchema, insertLocationPickupTimeSchema, insertPickupGroupSchema, insertPickupLocationSchema, insertProductMeetingConfigSchema, locationPickupTimeListQuerySchema, pickupGroupListQuerySchema, pickupLocationListQuerySchema, productMeetingConfigListQuerySchema, updateAvailabilityPickupPointSchema, updateAvailabilitySlotPickupSchema, updateCustomPickupAreaSchema, updateLocationPickupTimeSchema, updatePickupGroupSchema, updatePickupLocationSchema, updateProductMeetingConfigSchema, } from "./validation.js";
5
+ const batchUpdateAvailabilityPickupPointSchema = createBatchUpdateSchema(updateAvailabilityPickupPointSchema);
6
+ const batchUpdateAvailabilitySlotPickupSchema = createBatchUpdateSchema(updateAvailabilitySlotPickupSchema);
7
+ const batchUpdateProductMeetingConfigSchema = createBatchUpdateSchema(updateProductMeetingConfigSchema);
8
+ const batchUpdatePickupGroupSchema = createBatchUpdateSchema(updatePickupGroupSchema);
9
+ const batchUpdatePickupLocationSchema = createBatchUpdateSchema(updatePickupLocationSchema);
10
+ const batchUpdateLocationPickupTimeSchema = createBatchUpdateSchema(updateLocationPickupTimeSchema);
11
+ const batchUpdateCustomPickupAreaSchema = createBatchUpdateSchema(updateCustomPickupAreaSchema);
12
+ export const availabilityPickupRoutes = new Hono()
13
+ .get("/pickup-points", async (c) => {
14
+ const query = availabilityPickupPointListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
15
+ return c.json(await availabilityService.listPickupPoints(c.get("db"), query));
16
+ })
17
+ .post("/pickup-points", async (c) => c.json({
18
+ data: await availabilityService.createPickupPoint(c.get("db"), insertAvailabilityPickupPointSchema.parse(await c.req.json())),
19
+ }, 201))
20
+ .post("/pickup-points/batch-update", async (c) => {
21
+ const body = batchUpdateAvailabilityPickupPointSchema.parse(await c.req.json());
22
+ return c.json(await handleBatchUpdate({
23
+ db: c.get("db"),
24
+ ids: body.ids,
25
+ patch: body.patch,
26
+ update: availabilityService.updatePickupPoint,
27
+ }));
28
+ })
29
+ .post("/pickup-points/batch-delete", async (c) => {
30
+ const body = batchIdsSchema.parse(await c.req.json());
31
+ return c.json(await handleBatchDelete({
32
+ db: c.get("db"),
33
+ ids: body.ids,
34
+ remove: availabilityService.deletePickupPoint,
35
+ }));
36
+ })
37
+ .get("/pickup-points/:id", async (c) => {
38
+ const row = await availabilityService.getPickupPointById(c.get("db"), c.req.param("id"));
39
+ return row ? c.json({ data: row }) : notFound(c, "Availability pickup point not found");
40
+ })
41
+ .patch("/pickup-points/:id", async (c) => {
42
+ const row = await availabilityService.updatePickupPoint(c.get("db"), c.req.param("id"), updateAvailabilityPickupPointSchema.parse(await c.req.json()));
43
+ return row ? c.json({ data: row }) : notFound(c, "Availability pickup point not found");
44
+ })
45
+ .delete("/pickup-points/:id", async (c) => {
46
+ const row = await availabilityService.deletePickupPoint(c.get("db"), c.req.param("id"));
47
+ return row ? c.json({ success: true }) : notFound(c, "Availability pickup point not found");
48
+ })
49
+ .get("/slot-pickups", async (c) => {
50
+ const query = availabilitySlotPickupListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
51
+ return c.json(await availabilityService.listSlotPickups(c.get("db"), query));
52
+ })
53
+ .post("/slot-pickups", async (c) => c.json({
54
+ data: await availabilityService.createSlotPickup(c.get("db"), insertAvailabilitySlotPickupSchema.parse(await c.req.json())),
55
+ }, 201))
56
+ .post("/slot-pickups/batch-update", async (c) => {
57
+ const body = batchUpdateAvailabilitySlotPickupSchema.parse(await c.req.json());
58
+ return c.json(await handleBatchUpdate({
59
+ db: c.get("db"),
60
+ ids: body.ids,
61
+ patch: body.patch,
62
+ update: availabilityService.updateSlotPickup,
63
+ }));
64
+ })
65
+ .post("/slot-pickups/batch-delete", async (c) => {
66
+ const body = batchIdsSchema.parse(await c.req.json());
67
+ return c.json(await handleBatchDelete({
68
+ db: c.get("db"),
69
+ ids: body.ids,
70
+ remove: availabilityService.deleteSlotPickup,
71
+ }));
72
+ })
73
+ .get("/slot-pickups/:id", async (c) => {
74
+ const row = await availabilityService.getSlotPickupById(c.get("db"), c.req.param("id"));
75
+ return row ? c.json({ data: row }) : notFound(c, "Availability slot pickup not found");
76
+ })
77
+ .patch("/slot-pickups/:id", async (c) => {
78
+ const row = await availabilityService.updateSlotPickup(c.get("db"), c.req.param("id"), updateAvailabilitySlotPickupSchema.parse(await c.req.json()));
79
+ return row ? c.json({ data: row }) : notFound(c, "Availability slot pickup not found");
80
+ })
81
+ .delete("/slot-pickups/:id", async (c) => {
82
+ const row = await availabilityService.deleteSlotPickup(c.get("db"), c.req.param("id"));
83
+ return row ? c.json({ success: true }) : notFound(c, "Availability slot pickup not found");
84
+ })
85
+ .get("/meeting-configs", async (c) => {
86
+ const query = productMeetingConfigListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
87
+ return c.json(await availabilityService.listMeetingConfigs(c.get("db"), query));
88
+ })
89
+ .post("/meeting-configs", async (c) => c.json({
90
+ data: await availabilityService.createMeetingConfig(c.get("db"), insertProductMeetingConfigSchema.parse(await c.req.json())),
91
+ }, 201))
92
+ .post("/meeting-configs/batch-update", async (c) => {
93
+ const body = batchUpdateProductMeetingConfigSchema.parse(await c.req.json());
94
+ return c.json(await handleBatchUpdate({
95
+ db: c.get("db"),
96
+ ids: body.ids,
97
+ patch: body.patch,
98
+ update: availabilityService.updateMeetingConfig,
99
+ }));
100
+ })
101
+ .post("/meeting-configs/batch-delete", async (c) => {
102
+ const body = batchIdsSchema.parse(await c.req.json());
103
+ return c.json(await handleBatchDelete({
104
+ db: c.get("db"),
105
+ ids: body.ids,
106
+ remove: availabilityService.deleteMeetingConfig,
107
+ }));
108
+ })
109
+ .get("/meeting-configs/:id", async (c) => {
110
+ const row = await availabilityService.getMeetingConfigById(c.get("db"), c.req.param("id"));
111
+ return row ? c.json({ data: row }) : notFound(c, "Product meeting config not found");
112
+ })
113
+ .patch("/meeting-configs/:id", async (c) => {
114
+ const row = await availabilityService.updateMeetingConfig(c.get("db"), c.req.param("id"), updateProductMeetingConfigSchema.parse(await c.req.json()));
115
+ return row ? c.json({ data: row }) : notFound(c, "Product meeting config not found");
116
+ })
117
+ .delete("/meeting-configs/:id", async (c) => {
118
+ const row = await availabilityService.deleteMeetingConfig(c.get("db"), c.req.param("id"));
119
+ return row ? c.json({ success: true }) : notFound(c, "Product meeting config not found");
120
+ })
121
+ .get("/pickup-groups", async (c) => {
122
+ const query = pickupGroupListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
123
+ return c.json(await availabilityService.listPickupGroups(c.get("db"), query));
124
+ })
125
+ .post("/pickup-groups", async (c) => c.json({
126
+ data: await availabilityService.createPickupGroup(c.get("db"), insertPickupGroupSchema.parse(await c.req.json())),
127
+ }, 201))
128
+ .post("/pickup-groups/batch-update", async (c) => {
129
+ const body = batchUpdatePickupGroupSchema.parse(await c.req.json());
130
+ return c.json(await handleBatchUpdate({
131
+ db: c.get("db"),
132
+ ids: body.ids,
133
+ patch: body.patch,
134
+ update: availabilityService.updatePickupGroup,
135
+ }));
136
+ })
137
+ .post("/pickup-groups/batch-delete", async (c) => {
138
+ const body = batchIdsSchema.parse(await c.req.json());
139
+ return c.json(await handleBatchDelete({
140
+ db: c.get("db"),
141
+ ids: body.ids,
142
+ remove: availabilityService.deletePickupGroup,
143
+ }));
144
+ })
145
+ .get("/pickup-groups/:id", async (c) => {
146
+ const row = await availabilityService.getPickupGroupById(c.get("db"), c.req.param("id"));
147
+ return row ? c.json({ data: row }) : notFound(c, "Pickup group not found");
148
+ })
149
+ .patch("/pickup-groups/:id", async (c) => {
150
+ const row = await availabilityService.updatePickupGroup(c.get("db"), c.req.param("id"), updatePickupGroupSchema.parse(await c.req.json()));
151
+ return row ? c.json({ data: row }) : notFound(c, "Pickup group not found");
152
+ })
153
+ .delete("/pickup-groups/:id", async (c) => {
154
+ const row = await availabilityService.deletePickupGroup(c.get("db"), c.req.param("id"));
155
+ return row ? c.json({ success: true }) : notFound(c, "Pickup group not found");
156
+ })
157
+ .get("/pickup-locations", async (c) => {
158
+ const query = pickupLocationListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
159
+ return c.json(await availabilityService.listPickupLocations(c.get("db"), query));
160
+ })
161
+ .post("/pickup-locations", async (c) => c.json({
162
+ data: await availabilityService.createPickupLocation(c.get("db"), insertPickupLocationSchema.parse(await c.req.json())),
163
+ }, 201))
164
+ .post("/pickup-locations/batch-update", async (c) => {
165
+ const body = batchUpdatePickupLocationSchema.parse(await c.req.json());
166
+ return c.json(await handleBatchUpdate({
167
+ db: c.get("db"),
168
+ ids: body.ids,
169
+ patch: body.patch,
170
+ update: availabilityService.updatePickupLocation,
171
+ }));
172
+ })
173
+ .post("/pickup-locations/batch-delete", async (c) => {
174
+ const body = batchIdsSchema.parse(await c.req.json());
175
+ return c.json(await handleBatchDelete({
176
+ db: c.get("db"),
177
+ ids: body.ids,
178
+ remove: availabilityService.deletePickupLocation,
179
+ }));
180
+ })
181
+ .get("/pickup-locations/:id", async (c) => {
182
+ const row = await availabilityService.getPickupLocationById(c.get("db"), c.req.param("id"));
183
+ return row ? c.json({ data: row }) : notFound(c, "Pickup location not found");
184
+ })
185
+ .patch("/pickup-locations/:id", async (c) => {
186
+ const row = await availabilityService.updatePickupLocation(c.get("db"), c.req.param("id"), updatePickupLocationSchema.parse(await c.req.json()));
187
+ return row ? c.json({ data: row }) : notFound(c, "Pickup location not found");
188
+ })
189
+ .delete("/pickup-locations/:id", async (c) => {
190
+ const row = await availabilityService.deletePickupLocation(c.get("db"), c.req.param("id"));
191
+ return row ? c.json({ success: true }) : notFound(c, "Pickup location not found");
192
+ })
193
+ .get("/location-pickup-times", async (c) => {
194
+ const query = locationPickupTimeListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
195
+ return c.json(await availabilityService.listLocationPickupTimes(c.get("db"), query));
196
+ })
197
+ .post("/location-pickup-times", async (c) => c.json({
198
+ data: await availabilityService.createLocationPickupTime(c.get("db"), insertLocationPickupTimeSchema.parse(await c.req.json())),
199
+ }, 201))
200
+ .post("/location-pickup-times/batch-update", async (c) => {
201
+ const body = batchUpdateLocationPickupTimeSchema.parse(await c.req.json());
202
+ return c.json(await handleBatchUpdate({
203
+ db: c.get("db"),
204
+ ids: body.ids,
205
+ patch: body.patch,
206
+ update: availabilityService.updateLocationPickupTime,
207
+ }));
208
+ })
209
+ .post("/location-pickup-times/batch-delete", async (c) => {
210
+ const body = batchIdsSchema.parse(await c.req.json());
211
+ return c.json(await handleBatchDelete({
212
+ db: c.get("db"),
213
+ ids: body.ids,
214
+ remove: availabilityService.deleteLocationPickupTime,
215
+ }));
216
+ })
217
+ .get("/location-pickup-times/:id", async (c) => {
218
+ const row = await availabilityService.getLocationPickupTimeById(c.get("db"), c.req.param("id"));
219
+ return row ? c.json({ data: row }) : notFound(c, "Location pickup time not found");
220
+ })
221
+ .patch("/location-pickup-times/:id", async (c) => {
222
+ const row = await availabilityService.updateLocationPickupTime(c.get("db"), c.req.param("id"), updateLocationPickupTimeSchema.parse(await c.req.json()));
223
+ return row ? c.json({ data: row }) : notFound(c, "Location pickup time not found");
224
+ })
225
+ .delete("/location-pickup-times/:id", async (c) => {
226
+ const row = await availabilityService.deleteLocationPickupTime(c.get("db"), c.req.param("id"));
227
+ return row ? c.json({ success: true }) : notFound(c, "Location pickup time not found");
228
+ })
229
+ .get("/custom-pickup-areas", async (c) => {
230
+ const query = customPickupAreaListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
231
+ return c.json(await availabilityService.listCustomPickupAreas(c.get("db"), query));
232
+ })
233
+ .post("/custom-pickup-areas", async (c) => c.json({
234
+ data: await availabilityService.createCustomPickupArea(c.get("db"), insertCustomPickupAreaSchema.parse(await c.req.json())),
235
+ }, 201))
236
+ .post("/custom-pickup-areas/batch-update", async (c) => {
237
+ const body = batchUpdateCustomPickupAreaSchema.parse(await c.req.json());
238
+ return c.json(await handleBatchUpdate({
239
+ db: c.get("db"),
240
+ ids: body.ids,
241
+ patch: body.patch,
242
+ update: availabilityService.updateCustomPickupArea,
243
+ }));
244
+ })
245
+ .post("/custom-pickup-areas/batch-delete", async (c) => {
246
+ const body = batchIdsSchema.parse(await c.req.json());
247
+ return c.json(await handleBatchDelete({
248
+ db: c.get("db"),
249
+ ids: body.ids,
250
+ remove: availabilityService.deleteCustomPickupArea,
251
+ }));
252
+ })
253
+ .get("/custom-pickup-areas/:id", async (c) => {
254
+ const row = await availabilityService.getCustomPickupAreaById(c.get("db"), c.req.param("id"));
255
+ return row ? c.json({ data: row }) : notFound(c, "Custom pickup area not found");
256
+ })
257
+ .patch("/custom-pickup-areas/:id", async (c) => {
258
+ const row = await availabilityService.updateCustomPickupArea(c.get("db"), c.req.param("id"), updateCustomPickupAreaSchema.parse(await c.req.json()));
259
+ return row ? c.json({ data: row }) : notFound(c, "Custom pickup area not found");
260
+ })
261
+ .delete("/custom-pickup-areas/:id", async (c) => {
262
+ const row = await availabilityService.deleteCustomPickupArea(c.get("db"), c.req.param("id"));
263
+ return row ? c.json({ success: true }) : notFound(c, "Custom pickup area not found");
264
+ });
@@ -0,0 +1,49 @@
1
+ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ import type { Context } from "hono";
3
+ import { z } from "zod";
4
+ export type Env = {
5
+ Variables: {
6
+ db: PostgresJsDatabase;
7
+ userId?: string;
8
+ };
9
+ };
10
+ export declare const batchIdsSchema: z.ZodObject<{
11
+ ids: z.ZodArray<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ export declare const createBatchUpdateSchema: <TPatch extends z.ZodTypeAny>(patchSchema: TPatch) => z.ZodObject<{
14
+ ids: z.ZodArray<z.ZodString>;
15
+ patch: TPatch;
16
+ }, z.core.$strip>;
17
+ export declare function handleBatchUpdate<TPatch, TRow>({ db, ids, patch, update, }: {
18
+ db: PostgresJsDatabase;
19
+ ids: string[];
20
+ patch: TPatch;
21
+ update: (db: PostgresJsDatabase, id: string, patch: TPatch) => Promise<TRow | null>;
22
+ }): Promise<{
23
+ data: NonNullable<Awaited<TRow>>[];
24
+ total: number;
25
+ succeeded: number;
26
+ failed: {
27
+ id: string;
28
+ error: string;
29
+ }[];
30
+ }>;
31
+ export declare function handleBatchDelete({ db, ids, remove, }: {
32
+ db: PostgresJsDatabase;
33
+ ids: string[];
34
+ remove: (db: PostgresJsDatabase, id: string) => Promise<{
35
+ id: string;
36
+ } | null>;
37
+ }): Promise<{
38
+ deletedIds: string[];
39
+ total: number;
40
+ succeeded: number;
41
+ failed: {
42
+ id: string;
43
+ error: string;
44
+ }[];
45
+ }>;
46
+ export declare function notFound(c: Context<Env>, message: string): Response & import("hono").TypedResponse<{
47
+ error: string;
48
+ }, 404, "json">;
49
+ //# sourceMappingURL=routes-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-shared.d.ts","sourceRoot":"","sources":["../src/routes-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,MAAM,GAAG,GAAG;IAChB,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc;;iBAEzB,CAAA;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,SAAS,CAAC,CAAC,UAAU,EAAE,aAAa,MAAM;;;iBAMpF,CAAA;AAEJ,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,EACpD,EAAE,EACF,GAAG,EACH,KAAK,EACL,MAAM,GACP,EAAE;IACD,EAAE,EAAE,kBAAkB,CAAA;IACtB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CACpF;;;;;;;;GAmBA;AAED,wBAAsB,iBAAiB,CAAC,EACtC,EAAE,EACF,GAAG,EACH,MAAM,GACP,EAAE;IACD,EAAE,EAAE,kBAAkB,CAAA;IACtB,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,MAAM,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;CAC/E;;;;;;;;GAmBA;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM;;gBAExD"}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ export const batchIdsSchema = z.object({
3
+ ids: z.array(z.string()).min(1).max(200),
4
+ });
5
+ export const createBatchUpdateSchema = (patchSchema) => z.object({
6
+ ids: batchIdsSchema.shape.ids,
7
+ patch: patchSchema.refine((value) => Object.keys(value).length > 0, {
8
+ message: "Patch payload is required",
9
+ }),
10
+ });
11
+ export async function handleBatchUpdate({ db, ids, patch, update, }) {
12
+ const results = await Promise.all(ids.map(async (id) => {
13
+ const row = await update(db, id, patch);
14
+ return row ? { id, row } : { id, row: null };
15
+ }));
16
+ const data = results.flatMap((result) => (result.row ? [result.row] : []));
17
+ const failed = results
18
+ .filter((result) => result.row === null)
19
+ .map((result) => ({ id: result.id, error: "Not found" }));
20
+ return {
21
+ data,
22
+ total: ids.length,
23
+ succeeded: data.length,
24
+ failed,
25
+ };
26
+ }
27
+ export async function handleBatchDelete({ db, ids, remove, }) {
28
+ const results = await Promise.all(ids.map(async (id) => {
29
+ const row = await remove(db, id);
30
+ return row ? { id } : { id, error: "Not found" };
31
+ }));
32
+ const deletedIds = results.flatMap((result) => ("error" in result ? [] : [result.id]));
33
+ const failed = results
34
+ .filter((result) => "error" in result)
35
+ .map((result) => ({ id: result.id, error: result.error }));
36
+ return {
37
+ deletedIds,
38
+ total: ids.length,
39
+ succeeded: deletedIds.length,
40
+ failed,
41
+ };
42
+ }
43
+ export function notFound(c, message) {
44
+ return c.json({ error: message }, 404);
45
+ }