@voyantjs/resources 0.1.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.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAyBjE,KAAK,GAAG,GAAG;IACT,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAoFD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA0WxB,CAAA;AAEJ,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAA"}
package/dist/routes.js ADDED
@@ -0,0 +1,330 @@
1
+ import { Hono } from "hono";
2
+ import { z } from "zod";
3
+ import { resourcesService } from "./service.js";
4
+ import { insertResourceCloseoutSchema, insertResourcePoolMemberSchema, insertResourcePoolSchema, insertResourceRequirementSchema, insertResourceSchema, insertResourceSlotAssignmentSchema, resourceCloseoutListQuerySchema, resourceListQuerySchema, resourcePoolListQuerySchema, resourcePoolMemberListQuerySchema, resourceRequirementListQuerySchema, resourceSlotAssignmentListQuerySchema, updateResourceCloseoutSchema, updateResourcePoolSchema, updateResourceRequirementSchema, updateResourceSchema, updateResourceSlotAssignmentSchema, } from "./validation.js";
5
+ const batchIdsSchema = z.object({
6
+ ids: z.array(z.string()).min(1).max(200),
7
+ });
8
+ const createBatchUpdateSchema = (patchSchema) => z.object({
9
+ ids: batchIdsSchema.shape.ids,
10
+ patch: patchSchema.refine((value) => Object.keys(value).length > 0, {
11
+ message: "Patch payload is required",
12
+ }),
13
+ });
14
+ const batchUpdateResourceSchema = createBatchUpdateSchema(updateResourceSchema);
15
+ const batchUpdateResourcePoolSchema = createBatchUpdateSchema(updateResourcePoolSchema);
16
+ const batchUpdateResourceRequirementSchema = createBatchUpdateSchema(updateResourceRequirementSchema);
17
+ const batchUpdateResourceSlotAssignmentSchema = createBatchUpdateSchema(updateResourceSlotAssignmentSchema);
18
+ const batchUpdateResourceCloseoutSchema = createBatchUpdateSchema(updateResourceCloseoutSchema);
19
+ async function handleBatchUpdate({ db, ids, patch, update, }) {
20
+ const results = await Promise.all(ids.map(async (id) => {
21
+ const row = await update(db, id, patch);
22
+ return row ? { id, row } : { id, row: null };
23
+ }));
24
+ const data = results.flatMap((result) => (result.row ? [result.row] : []));
25
+ const failed = results
26
+ .filter((result) => result.row === null)
27
+ .map((result) => ({ id: result.id, error: "Not found" }));
28
+ return {
29
+ data,
30
+ total: ids.length,
31
+ succeeded: data.length,
32
+ failed,
33
+ };
34
+ }
35
+ async function handleBatchDelete({ db, ids, remove, }) {
36
+ const results = await Promise.all(ids.map(async (id) => {
37
+ const row = await remove(db, id);
38
+ return row ? { id } : { id, error: "Not found" };
39
+ }));
40
+ const deletedIds = results.flatMap((result) => ("error" in result ? [] : [result.id]));
41
+ const failed = results
42
+ .filter((result) => "error" in result)
43
+ .map((result) => ({ id: result.id, error: result.error }));
44
+ return {
45
+ deletedIds,
46
+ total: ids.length,
47
+ succeeded: deletedIds.length,
48
+ failed,
49
+ };
50
+ }
51
+ export const resourcesRoutes = new Hono()
52
+ .get("/resources", async (c) => {
53
+ const query = resourceListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
54
+ return c.json(await resourcesService.listResources(c.get("db"), query));
55
+ })
56
+ .post("/resources", async (c) => {
57
+ return c.json({
58
+ data: await resourcesService.createResource(c.get("db"), insertResourceSchema.parse(await c.req.json())),
59
+ }, 201);
60
+ })
61
+ .post("/resources/batch-update", async (c) => {
62
+ const body = batchUpdateResourceSchema.parse(await c.req.json());
63
+ return c.json(await handleBatchUpdate({
64
+ db: c.get("db"),
65
+ ids: body.ids,
66
+ patch: body.patch,
67
+ update: resourcesService.updateResource,
68
+ }));
69
+ })
70
+ .post("/resources/batch-delete", async (c) => {
71
+ const body = batchIdsSchema.parse(await c.req.json());
72
+ return c.json(await handleBatchDelete({
73
+ db: c.get("db"),
74
+ ids: body.ids,
75
+ remove: resourcesService.deleteResource,
76
+ }));
77
+ })
78
+ .get("/resources/:id", async (c) => {
79
+ const row = await resourcesService.getResourceById(c.get("db"), c.req.param("id"));
80
+ if (!row)
81
+ return c.json({ error: "Resource not found" }, 404);
82
+ return c.json({ data: row });
83
+ })
84
+ .patch("/resources/:id", async (c) => {
85
+ const row = await resourcesService.updateResource(c.get("db"), c.req.param("id"), updateResourceSchema.parse(await c.req.json()));
86
+ if (!row)
87
+ return c.json({ error: "Resource not found" }, 404);
88
+ return c.json({ data: row });
89
+ })
90
+ .delete("/resources/:id", async (c) => {
91
+ const row = await resourcesService.deleteResource(c.get("db"), c.req.param("id"));
92
+ if (!row)
93
+ return c.json({ error: "Resource not found" }, 404);
94
+ return c.json({ success: true });
95
+ })
96
+ .get("/pools", async (c) => {
97
+ const query = resourcePoolListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
98
+ return c.json(await resourcesService.listPools(c.get("db"), query));
99
+ })
100
+ .post("/pools", async (c) => {
101
+ return c.json({
102
+ data: await resourcesService.createPool(c.get("db"), insertResourcePoolSchema.parse(await c.req.json())),
103
+ }, 201);
104
+ })
105
+ .post("/pools/batch-update", async (c) => {
106
+ const body = batchUpdateResourcePoolSchema.parse(await c.req.json());
107
+ return c.json(await handleBatchUpdate({
108
+ db: c.get("db"),
109
+ ids: body.ids,
110
+ patch: body.patch,
111
+ update: resourcesService.updatePool,
112
+ }));
113
+ })
114
+ .post("/pools/batch-delete", async (c) => {
115
+ const body = batchIdsSchema.parse(await c.req.json());
116
+ return c.json(await handleBatchDelete({
117
+ db: c.get("db"),
118
+ ids: body.ids,
119
+ remove: resourcesService.deletePool,
120
+ }));
121
+ })
122
+ .get("/pools/:id", async (c) => {
123
+ const row = await resourcesService.getPoolById(c.get("db"), c.req.param("id"));
124
+ if (!row)
125
+ return c.json({ error: "Resource pool not found" }, 404);
126
+ return c.json({ data: row });
127
+ })
128
+ .patch("/pools/:id", async (c) => {
129
+ const row = await resourcesService.updatePool(c.get("db"), c.req.param("id"), updateResourcePoolSchema.parse(await c.req.json()));
130
+ if (!row)
131
+ return c.json({ error: "Resource pool not found" }, 404);
132
+ return c.json({ data: row });
133
+ })
134
+ .delete("/pools/:id", async (c) => {
135
+ const row = await resourcesService.deletePool(c.get("db"), c.req.param("id"));
136
+ if (!row)
137
+ return c.json({ error: "Resource pool not found" }, 404);
138
+ return c.json({ success: true });
139
+ })
140
+ .get("/pool-members", async (c) => {
141
+ const query = resourcePoolMemberListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
142
+ return c.json(await resourcesService.listPoolMembers(c.get("db"), query));
143
+ })
144
+ .post("/pool-members", async (c) => {
145
+ return c.json({
146
+ data: await resourcesService.createPoolMember(c.get("db"), insertResourcePoolMemberSchema.parse(await c.req.json())),
147
+ }, 201);
148
+ })
149
+ .delete("/pool-members/:id", async (c) => {
150
+ const row = await resourcesService.deletePoolMember(c.get("db"), c.req.param("id"));
151
+ if (!row)
152
+ return c.json({ error: "Resource pool member not found" }, 404);
153
+ return c.json({ success: true });
154
+ })
155
+ .get("/requirements", async (c) => {
156
+ const query = resourceRequirementListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
157
+ return c.json(await resourcesService.listRequirements(c.get("db"), query));
158
+ })
159
+ .post("/requirements", async (c) => {
160
+ return c.json({
161
+ data: await resourcesService.createRequirement(c.get("db"), insertResourceRequirementSchema.parse(await c.req.json())),
162
+ }, 201);
163
+ })
164
+ .post("/requirements/batch-update", async (c) => {
165
+ const body = batchUpdateResourceRequirementSchema.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: resourcesService.updateRequirement,
171
+ }));
172
+ })
173
+ .post("/requirements/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: resourcesService.deleteRequirement,
179
+ }));
180
+ })
181
+ .get("/requirements/:id", async (c) => {
182
+ const row = await resourcesService.getRequirementById(c.get("db"), c.req.param("id"));
183
+ if (!row)
184
+ return c.json({ error: "Resource requirement not found" }, 404);
185
+ return c.json({ data: row });
186
+ })
187
+ .patch("/requirements/:id", async (c) => {
188
+ const row = await resourcesService.updateRequirement(c.get("db"), c.req.param("id"), updateResourceRequirementSchema.parse(await c.req.json()));
189
+ if (!row)
190
+ return c.json({ error: "Resource requirement not found" }, 404);
191
+ return c.json({ data: row });
192
+ })
193
+ .delete("/requirements/:id", async (c) => {
194
+ const row = await resourcesService.deleteRequirement(c.get("db"), c.req.param("id"));
195
+ if (!row)
196
+ return c.json({ error: "Resource requirement not found" }, 404);
197
+ return c.json({ success: true });
198
+ })
199
+ .get("/allocations", async (c) => {
200
+ const query = resourceRequirementListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
201
+ return c.json(await resourcesService.listRequirements(c.get("db"), query));
202
+ })
203
+ .post("/allocations", async (c) => {
204
+ return c.json({
205
+ data: await resourcesService.createRequirement(c.get("db"), insertResourceRequirementSchema.parse(await c.req.json())),
206
+ }, 201);
207
+ })
208
+ .post("/allocations/batch-update", async (c) => {
209
+ const body = batchUpdateResourceRequirementSchema.parse(await c.req.json());
210
+ return c.json(await handleBatchUpdate({
211
+ db: c.get("db"),
212
+ ids: body.ids,
213
+ patch: body.patch,
214
+ update: resourcesService.updateRequirement,
215
+ }));
216
+ })
217
+ .post("/allocations/batch-delete", async (c) => {
218
+ const body = batchIdsSchema.parse(await c.req.json());
219
+ return c.json(await handleBatchDelete({
220
+ db: c.get("db"),
221
+ ids: body.ids,
222
+ remove: resourcesService.deleteRequirement,
223
+ }));
224
+ })
225
+ .get("/allocations/:id", async (c) => {
226
+ const row = await resourcesService.getRequirementById(c.get("db"), c.req.param("id"));
227
+ if (!row)
228
+ return c.json({ error: "Resource allocation not found" }, 404);
229
+ return c.json({ data: row });
230
+ })
231
+ .patch("/allocations/:id", async (c) => {
232
+ const row = await resourcesService.updateRequirement(c.get("db"), c.req.param("id"), updateResourceRequirementSchema.parse(await c.req.json()));
233
+ if (!row)
234
+ return c.json({ error: "Resource allocation not found" }, 404);
235
+ return c.json({ data: row });
236
+ })
237
+ .delete("/allocations/:id", async (c) => {
238
+ const row = await resourcesService.deleteRequirement(c.get("db"), c.req.param("id"));
239
+ if (!row)
240
+ return c.json({ error: "Resource allocation not found" }, 404);
241
+ return c.json({ success: true });
242
+ })
243
+ .get("/slot-assignments", async (c) => {
244
+ const query = resourceSlotAssignmentListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
245
+ return c.json(await resourcesService.listSlotAssignments(c.get("db"), query));
246
+ })
247
+ .post("/slot-assignments", async (c) => {
248
+ return c.json({
249
+ data: await resourcesService.createSlotAssignment(c.get("db"), insertResourceSlotAssignmentSchema.parse(await c.req.json())),
250
+ }, 201);
251
+ })
252
+ .post("/slot-assignments/batch-update", async (c) => {
253
+ const body = batchUpdateResourceSlotAssignmentSchema.parse(await c.req.json());
254
+ return c.json(await handleBatchUpdate({
255
+ db: c.get("db"),
256
+ ids: body.ids,
257
+ patch: body.patch,
258
+ update: resourcesService.updateSlotAssignment,
259
+ }));
260
+ })
261
+ .post("/slot-assignments/batch-delete", async (c) => {
262
+ const body = batchIdsSchema.parse(await c.req.json());
263
+ return c.json(await handleBatchDelete({
264
+ db: c.get("db"),
265
+ ids: body.ids,
266
+ remove: resourcesService.deleteSlotAssignment,
267
+ }));
268
+ })
269
+ .get("/slot-assignments/:id", async (c) => {
270
+ const row = await resourcesService.getSlotAssignmentById(c.get("db"), c.req.param("id"));
271
+ if (!row)
272
+ return c.json({ error: "Resource slot assignment not found" }, 404);
273
+ return c.json({ data: row });
274
+ })
275
+ .patch("/slot-assignments/:id", async (c) => {
276
+ const row = await resourcesService.updateSlotAssignment(c.get("db"), c.req.param("id"), updateResourceSlotAssignmentSchema.parse(await c.req.json()));
277
+ if (!row)
278
+ return c.json({ error: "Resource slot assignment not found" }, 404);
279
+ return c.json({ data: row });
280
+ })
281
+ .delete("/slot-assignments/:id", async (c) => {
282
+ const row = await resourcesService.deleteSlotAssignment(c.get("db"), c.req.param("id"));
283
+ if (!row)
284
+ return c.json({ error: "Resource slot assignment not found" }, 404);
285
+ return c.json({ success: true });
286
+ })
287
+ .get("/closeouts", async (c) => {
288
+ const query = resourceCloseoutListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
289
+ return c.json(await resourcesService.listCloseouts(c.get("db"), query));
290
+ })
291
+ .post("/closeouts", async (c) => {
292
+ return c.json({
293
+ data: await resourcesService.createCloseout(c.get("db"), insertResourceCloseoutSchema.parse(await c.req.json())),
294
+ }, 201);
295
+ })
296
+ .post("/closeouts/batch-update", async (c) => {
297
+ const body = batchUpdateResourceCloseoutSchema.parse(await c.req.json());
298
+ return c.json(await handleBatchUpdate({
299
+ db: c.get("db"),
300
+ ids: body.ids,
301
+ patch: body.patch,
302
+ update: resourcesService.updateCloseout,
303
+ }));
304
+ })
305
+ .post("/closeouts/batch-delete", async (c) => {
306
+ const body = batchIdsSchema.parse(await c.req.json());
307
+ return c.json(await handleBatchDelete({
308
+ db: c.get("db"),
309
+ ids: body.ids,
310
+ remove: resourcesService.deleteCloseout,
311
+ }));
312
+ })
313
+ .get("/closeouts/:id", async (c) => {
314
+ const row = await resourcesService.getCloseoutById(c.get("db"), c.req.param("id"));
315
+ if (!row)
316
+ return c.json({ error: "Resource closeout not found" }, 404);
317
+ return c.json({ data: row });
318
+ })
319
+ .patch("/closeouts/:id", async (c) => {
320
+ const row = await resourcesService.updateCloseout(c.get("db"), c.req.param("id"), updateResourceCloseoutSchema.parse(await c.req.json()));
321
+ if (!row)
322
+ return c.json({ error: "Resource closeout not found" }, 404);
323
+ return c.json({ data: row });
324
+ })
325
+ .delete("/closeouts/:id", async (c) => {
326
+ const row = await resourcesService.deleteCloseout(c.get("db"), c.req.param("id"));
327
+ if (!row)
328
+ return c.json({ error: "Resource closeout not found" }, 404);
329
+ return c.json({ success: true });
330
+ });