@lcas58/esmi-api-types 1.0.6 → 1.0.8

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.
Files changed (43) hide show
  1. package/dist/src/app.d.ts +0 -1156
  2. package/dist/src/app.js +0 -1
  3. package/dist/src/routes/events/events.handlers.d.ts +20 -0
  4. package/dist/src/routes/events/events.handlers.js +177 -0
  5. package/dist/src/routes/events/events.index.d.ts +501 -0
  6. package/dist/src/routes/events/events.index.js +9 -0
  7. package/dist/src/routes/events/events.routes.d.ts +1375 -0
  8. package/dist/src/routes/events/events.routes.js +72 -0
  9. package/dist/src/routes/events/schemas/event.schemas.d.ts +896 -0
  10. package/dist/src/routes/events/schemas/event.schemas.js +49 -0
  11. package/dist/src/routes/events/schemas/index.d.ts +1 -0
  12. package/dist/src/routes/events/schemas/index.js +1 -0
  13. package/dist/src/routes/index.route.d.ts +13 -0
  14. package/dist/src/routes/index.route.js +19 -0
  15. package/dist/src/routes/leagues/leagues.handlers.d.ts +3 -0
  16. package/dist/src/routes/leagues/leagues.handlers.js +49 -0
  17. package/dist/src/routes/leagues/leagues.index.d.ts +53 -0
  18. package/dist/src/routes/leagues/leagues.index.js +6 -0
  19. package/dist/src/routes/leagues/leagues.routes.d.ts +137 -0
  20. package/dist/src/routes/leagues/leagues.routes.js +47 -0
  21. package/dist/src/routes/marketing/marketing.handlers.d.ts +4 -0
  22. package/dist/src/routes/marketing/marketing.handlers.js +20 -0
  23. package/dist/src/routes/marketing/marketing.index.d.ts +58 -0
  24. package/dist/src/routes/marketing/marketing.index.js +7 -0
  25. package/dist/src/routes/marketing/marketing.routes.d.ts +154 -0
  26. package/dist/src/routes/marketing/marketing.routes.js +27 -0
  27. package/dist/src/routes/organizations/organizations.handlers.d.ts +74 -0
  28. package/dist/src/routes/organizations/organizations.handlers.js +485 -0
  29. package/dist/src/routes/organizations/organizations.index.d.ts +517 -0
  30. package/dist/src/routes/organizations/organizations.index.js +12 -0
  31. package/dist/src/routes/organizations/organizations.routes.d.ts +1236 -0
  32. package/dist/src/routes/organizations/organizations.routes.js +137 -0
  33. package/dist/src/routes/organizations/tasks.test.d.ts +0 -0
  34. package/dist/src/routes/organizations/tasks.test.js +181 -0
  35. package/dist/src/routes/tags/tags.handlers.d.ts +3 -0
  36. package/dist/src/routes/tags/tags.handlers.js +15 -0
  37. package/dist/src/routes/tags/tags.index.d.ts +24 -0
  38. package/dist/src/routes/tags/tags.index.js +6 -0
  39. package/dist/src/routes/tags/tags.routes.d.ts +68 -0
  40. package/dist/src/routes/tags/tags.routes.js +25 -0
  41. package/dist/src/shared/client-types.d.ts +8 -3
  42. package/dist/src/shared/client-types.js +1 -1
  43. package/package.json +2 -2
package/dist/src/app.js CHANGED
@@ -19,5 +19,4 @@ const routes = [
19
19
  routes.forEach((route) => {
20
20
  app.route("/", route);
21
21
  });
22
- export { routes };
23
22
  export default app;
@@ -0,0 +1,20 @@
1
+ import type { AppRouteHandler } from "../../lib/types.js";
2
+ import type { CreateRoute, GetCountStatsRoute, ListRoute, PatchRoute } from "./events.routes.js";
3
+ /**
4
+ * GET /events
5
+ * - Returns a list of events
6
+ */
7
+ export declare const list: AppRouteHandler<ListRoute>;
8
+ /**
9
+ * POST /events
10
+ * - Idempotently upserts the optional location
11
+ * - Inserts the event in a single transaction
12
+ * - Returns 201 + created entity
13
+ */
14
+ export declare const create: AppRouteHandler<CreateRoute>;
15
+ /**
16
+ * PATCH /events/{id}
17
+ * - Updates the event
18
+ */
19
+ export declare const patch: AppRouteHandler<PatchRoute>;
20
+ export declare const getCountStats: AppRouteHandler<GetCountStatsRoute>;
@@ -0,0 +1,177 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import * as HttpStatusCodes from "stoker/http-status-codes";
3
+ import * as HttpStatusPhrases from "stoker/http-status-phrases";
4
+ import { createDb } from "../../db/index.js";
5
+ import event from "../../db/schema/event.js";
6
+ import location from "../../db/schema/location.js";
7
+ import { ZOD_ERROR_CODES, ZOD_ERROR_MESSAGES } from "../../lib/constants.js";
8
+ /**
9
+ * GET /events
10
+ * - Returns a list of events
11
+ */
12
+ export const list = async (c) => {
13
+ const { db } = createDb(c.env);
14
+ const { type, organizationId, status } = c.req.valid("query");
15
+ // Build where conditions
16
+ const whereConditions = [];
17
+ if (type) {
18
+ whereConditions.push(eq(event.type, type));
19
+ }
20
+ if (status) {
21
+ whereConditions.push(eq(event.status, status));
22
+ }
23
+ if (organizationId) {
24
+ whereConditions.push(eq(event.organizationId, organizationId));
25
+ }
26
+ const events = await db.query.event.findMany({
27
+ where: whereConditions.length > 0 ? and(...whereConditions) : undefined,
28
+ with: {
29
+ creator: true,
30
+ organization: true,
31
+ location: true,
32
+ },
33
+ });
34
+ if (events.length === 0) {
35
+ return c.json({
36
+ message: HttpStatusPhrases.NOT_FOUND,
37
+ }, HttpStatusCodes.NOT_FOUND);
38
+ }
39
+ return c.json(events, HttpStatusCodes.OK);
40
+ };
41
+ /**
42
+ * POST /events
43
+ * - Idempotently upserts the optional location
44
+ * - Inserts the event in a single transaction
45
+ * - Returns 201 + created entity
46
+ */
47
+ export const create = async (c) => {
48
+ const { db } = createDb(c.env);
49
+ const data = c.req.valid("json");
50
+ const user = c.get("user");
51
+ if (!user) {
52
+ return c.json({ message: HttpStatusPhrases.UNAUTHORIZED }, HttpStatusCodes.UNAUTHORIZED);
53
+ }
54
+ try {
55
+ // Insert location first (if provided)
56
+ if (data.location) {
57
+ const loc = data.location;
58
+ await db
59
+ .insert(location)
60
+ .values({
61
+ id: loc.id,
62
+ provider: loc.provider,
63
+ name: loc.name,
64
+ formattedAddress: loc.formattedAddress,
65
+ city: loc.city,
66
+ state: loc.state,
67
+ country: loc.country,
68
+ postalCode: loc.postalCode,
69
+ latitude: loc.latitude ? Number.parseFloat(loc.latitude) : null,
70
+ longitude: loc.longitude ? Number.parseFloat(loc.longitude) : null,
71
+ })
72
+ .onConflictDoNothing({ target: location.id });
73
+ }
74
+ // Insert event
75
+ const [createdEvent] = await db
76
+ .insert(event)
77
+ .values({
78
+ name: data.name.trim(),
79
+ description: data.description ?? null,
80
+ locationId: data.location?.id ?? null,
81
+ type: data.type,
82
+ organizationId: data.organizationId,
83
+ creatorId: user.id,
84
+ mode: "ADULT",
85
+ ageGroup: data.ageGroup,
86
+ gender: data.gender,
87
+ status: "WIP",
88
+ })
89
+ .returning();
90
+ const eventWithRelations = await db.query.event.findFirst({
91
+ where: eq(event.id, createdEvent.id),
92
+ with: {
93
+ creator: true,
94
+ organization: true,
95
+ location: true,
96
+ },
97
+ });
98
+ return c.json(eventWithRelations, HttpStatusCodes.CREATED);
99
+ }
100
+ catch (err) {
101
+ console.error("Error creating event:", err);
102
+ return c.json({
103
+ success: false,
104
+ error: {
105
+ issues: [
106
+ {
107
+ code: "CREATE_EVENT_FAILED",
108
+ path: [],
109
+ message: err instanceof Error ? err.message : "Failed to create event.",
110
+ },
111
+ ],
112
+ name: "ValidationError",
113
+ },
114
+ }, HttpStatusCodes.UNPROCESSABLE_ENTITY);
115
+ }
116
+ };
117
+ /**
118
+ * PATCH /events/{id}
119
+ * - Updates the event
120
+ */
121
+ export const patch = async (c) => {
122
+ const { db } = createDb(c.env);
123
+ const { id } = c.req.valid("param");
124
+ const updates = c.req.valid("json");
125
+ if (Object.keys(updates).length === 0) {
126
+ return c.json({
127
+ success: false,
128
+ error: {
129
+ issues: [
130
+ {
131
+ code: ZOD_ERROR_CODES.INVALID_UPDATES,
132
+ path: [],
133
+ message: ZOD_ERROR_MESSAGES.NO_UPDATES,
134
+ },
135
+ ],
136
+ name: "ZodError",
137
+ },
138
+ }, HttpStatusCodes.UNPROCESSABLE_ENTITY);
139
+ }
140
+ const [updatedEvent] = await db.update(event)
141
+ .set(updates)
142
+ .where(eq(event.id, id))
143
+ .returning();
144
+ if (!updatedEvent) {
145
+ return c.json({
146
+ message: HttpStatusPhrases.NOT_FOUND,
147
+ }, HttpStatusCodes.NOT_FOUND);
148
+ }
149
+ // Fetch the updated event with relations
150
+ const eventWithRelations = await db.query.event.findFirst({
151
+ where: eq(event.id, updatedEvent.id),
152
+ with: {
153
+ creator: true,
154
+ organization: true,
155
+ location: true,
156
+ },
157
+ });
158
+ return c.json(eventWithRelations, HttpStatusCodes.OK);
159
+ };
160
+ export const getCountStats = async (c) => {
161
+ const { db } = createDb(c.env);
162
+ const { organizationId } = c.req.valid("query");
163
+ // Single optimized query to get all counts at once
164
+ const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
165
+ const oneYearAgo = new Date(Date.now() - 360 * 24 * 60 * 60 * 1000);
166
+ const [stats] = await db
167
+ .select({
168
+ total: sql `count(case when ${event.status} in ('IN_PROGRESS', 'PUBLISHED', 'COMPLETED') then 1 end)`,
169
+ thisMonth: sql `count(case when ${event.createdAt} >= ${thirtyDaysAgo} and ${event.status} in ('IN_PROGRESS', 'PUBLISHED', 'COMPLETED') then 1 end)`,
170
+ inProgress: sql `count(case when ${event.status} = 'IN_PROGRESS' then 1 end)`,
171
+ completed: sql `count(case when ${event.status} = 'COMPLETED' and ${event.createdAt} >= ${oneYearAgo} then 1 end)`,
172
+ upcoming: sql `count(case when ${event.status} = 'PUBLISHED' and ${event.createdAt} >= ${thirtyDaysAgo} then 1 end)`,
173
+ })
174
+ .from(event)
175
+ .where(eq(event.organizationId, organizationId));
176
+ return c.json(stats, HttpStatusCodes.OK);
177
+ };
@@ -0,0 +1,501 @@
1
+ declare const router: import("@hono/zod-openapi").OpenAPIHono<import("../../shared/index.js").AppBindings, {
2
+ "/events": {
3
+ $get: {
4
+ input: {
5
+ query: {
6
+ status?: string | string[] | undefined;
7
+ type?: string | string[] | undefined;
8
+ organizationId?: string | string[] | undefined;
9
+ };
10
+ };
11
+ output: {
12
+ id: string;
13
+ status: string;
14
+ type: string;
15
+ description: string | null;
16
+ name: string;
17
+ location: {
18
+ id: string;
19
+ name: string;
20
+ provider: string;
21
+ formattedAddress: string;
22
+ city: string | null;
23
+ state: string | null;
24
+ country: string | null;
25
+ postalCode: string | null;
26
+ latitude: string | null;
27
+ longitude: string | null;
28
+ } | null;
29
+ locationId: string | null;
30
+ organizationId: string;
31
+ organization: {
32
+ id: string;
33
+ status: string;
34
+ description: string;
35
+ name: string;
36
+ city: string | null;
37
+ state: string | null;
38
+ country: string | null;
39
+ createdAt: string | null;
40
+ updatedAt: string | null;
41
+ ownerId: string;
42
+ slug: string;
43
+ avatar: string | null;
44
+ stateCd: string | null;
45
+ } | null;
46
+ mode: string;
47
+ createdAt: string;
48
+ updatedAt: string;
49
+ creatorId: string | null;
50
+ ageGroup: string;
51
+ gender: string;
52
+ creator: {
53
+ image: string | null;
54
+ id: string;
55
+ name: string;
56
+ email: string;
57
+ emailVerified: boolean;
58
+ createdAt: string;
59
+ updatedAt: string;
60
+ } | null;
61
+ }[];
62
+ outputFormat: "text" | "json";
63
+ status: 200;
64
+ } | {
65
+ input: {
66
+ query: {
67
+ status?: string | string[] | undefined;
68
+ type?: string | string[] | undefined;
69
+ organizationId?: string | string[] | undefined;
70
+ };
71
+ };
72
+ output: {
73
+ message: string;
74
+ };
75
+ outputFormat: "text" | "json";
76
+ status: 404;
77
+ } | {
78
+ input: {
79
+ query: {
80
+ status?: string | string[] | undefined;
81
+ type?: string | string[] | undefined;
82
+ organizationId?: string | string[] | undefined;
83
+ };
84
+ };
85
+ output: {
86
+ error: {
87
+ issues: {
88
+ code: string;
89
+ path: (string | number)[];
90
+ message?: string | undefined;
91
+ }[];
92
+ name: string;
93
+ };
94
+ success: boolean;
95
+ };
96
+ outputFormat: "text" | "json";
97
+ status: 422;
98
+ };
99
+ };
100
+ } & {
101
+ "/events": {
102
+ $post: {
103
+ input: {
104
+ json: {
105
+ type: string;
106
+ description: string | null;
107
+ name: string;
108
+ location: {
109
+ id: string;
110
+ name: string;
111
+ provider: string;
112
+ formattedAddress: string;
113
+ city?: string | null | undefined;
114
+ state?: string | null | undefined;
115
+ country?: string | null | undefined;
116
+ postalCode?: string | null | undefined;
117
+ latitude?: string | null | undefined;
118
+ longitude?: string | null | undefined;
119
+ };
120
+ organizationId: string;
121
+ ageGroup: string;
122
+ gender: string;
123
+ };
124
+ };
125
+ output: {
126
+ error: {
127
+ issues: {
128
+ code: string;
129
+ path: (string | number)[];
130
+ message?: string | undefined;
131
+ }[];
132
+ name: string;
133
+ };
134
+ success: boolean;
135
+ };
136
+ outputFormat: "text" | "json";
137
+ status: 422;
138
+ } | {
139
+ input: {
140
+ json: {
141
+ type: string;
142
+ description: string | null;
143
+ name: string;
144
+ location: {
145
+ id: string;
146
+ name: string;
147
+ provider: string;
148
+ formattedAddress: string;
149
+ city?: string | null | undefined;
150
+ state?: string | null | undefined;
151
+ country?: string | null | undefined;
152
+ postalCode?: string | null | undefined;
153
+ latitude?: string | null | undefined;
154
+ longitude?: string | null | undefined;
155
+ };
156
+ organizationId: string;
157
+ ageGroup: string;
158
+ gender: string;
159
+ };
160
+ };
161
+ output: {
162
+ id: string;
163
+ status: string;
164
+ type: string;
165
+ description: string | null;
166
+ name: string;
167
+ location: {
168
+ id: string;
169
+ name: string;
170
+ provider: string;
171
+ formattedAddress: string;
172
+ city: string | null;
173
+ state: string | null;
174
+ country: string | null;
175
+ postalCode: string | null;
176
+ latitude: string | null;
177
+ longitude: string | null;
178
+ } | null;
179
+ locationId: string | null;
180
+ organizationId: string;
181
+ organization: {
182
+ id: string;
183
+ status: string;
184
+ description: string;
185
+ name: string;
186
+ city: string | null;
187
+ state: string | null;
188
+ country: string | null;
189
+ createdAt: string | null;
190
+ updatedAt: string | null;
191
+ ownerId: string;
192
+ slug: string;
193
+ avatar: string | null;
194
+ stateCd: string | null;
195
+ } | null;
196
+ mode: string;
197
+ createdAt: string;
198
+ updatedAt: string;
199
+ creatorId: string | null;
200
+ ageGroup: string;
201
+ gender: string;
202
+ creator: {
203
+ image: string | null;
204
+ id: string;
205
+ name: string;
206
+ email: string;
207
+ emailVerified: boolean;
208
+ createdAt: string;
209
+ updatedAt: string;
210
+ } | null;
211
+ };
212
+ outputFormat: "text" | "json";
213
+ status: 201;
214
+ } | {
215
+ input: {
216
+ json: {
217
+ type: string;
218
+ description: string | null;
219
+ name: string;
220
+ location: {
221
+ id: string;
222
+ name: string;
223
+ provider: string;
224
+ formattedAddress: string;
225
+ city?: string | null | undefined;
226
+ state?: string | null | undefined;
227
+ country?: string | null | undefined;
228
+ postalCode?: string | null | undefined;
229
+ latitude?: string | null | undefined;
230
+ longitude?: string | null | undefined;
231
+ };
232
+ organizationId: string;
233
+ ageGroup: string;
234
+ gender: string;
235
+ };
236
+ };
237
+ output: {
238
+ message: string;
239
+ };
240
+ outputFormat: "text" | "json";
241
+ status: 401;
242
+ };
243
+ };
244
+ } & {
245
+ "/events/:id": {
246
+ $patch: {
247
+ input: {
248
+ param: {
249
+ [x: string]: string;
250
+ };
251
+ } & {
252
+ json: {
253
+ description: string | null;
254
+ gender: string;
255
+ status?: string | undefined;
256
+ type?: string | undefined;
257
+ name?: string | undefined;
258
+ location?: {
259
+ id: string;
260
+ name: string;
261
+ provider: string;
262
+ formattedAddress: string;
263
+ city?: string | null | undefined;
264
+ state?: string | null | undefined;
265
+ country?: string | null | undefined;
266
+ postalCode?: string | null | undefined;
267
+ latitude?: string | null | undefined;
268
+ longitude?: string | null | undefined;
269
+ } | undefined;
270
+ organizationId?: string | undefined;
271
+ mode?: string | undefined;
272
+ ageGroup?: string | undefined;
273
+ };
274
+ };
275
+ output: {
276
+ message: string;
277
+ };
278
+ outputFormat: "text" | "json";
279
+ status: 404;
280
+ } | {
281
+ input: {
282
+ param: {
283
+ [x: string]: string;
284
+ };
285
+ } & {
286
+ json: {
287
+ description: string | null;
288
+ gender: string;
289
+ status?: string | undefined;
290
+ type?: string | undefined;
291
+ name?: string | undefined;
292
+ location?: {
293
+ id: string;
294
+ name: string;
295
+ provider: string;
296
+ formattedAddress: string;
297
+ city?: string | null | undefined;
298
+ state?: string | null | undefined;
299
+ country?: string | null | undefined;
300
+ postalCode?: string | null | undefined;
301
+ latitude?: string | null | undefined;
302
+ longitude?: string | null | undefined;
303
+ } | undefined;
304
+ organizationId?: string | undefined;
305
+ mode?: string | undefined;
306
+ ageGroup?: string | undefined;
307
+ };
308
+ };
309
+ output: {
310
+ error: {
311
+ issues: {
312
+ code: string;
313
+ path: (string | number)[];
314
+ message?: string | undefined;
315
+ }[];
316
+ name: string;
317
+ };
318
+ success: boolean;
319
+ };
320
+ outputFormat: "text" | "json";
321
+ status: 422;
322
+ } | {
323
+ input: {
324
+ param: {
325
+ [x: string]: string;
326
+ };
327
+ } & {
328
+ json: {
329
+ description: string | null;
330
+ gender: string;
331
+ status?: string | undefined;
332
+ type?: string | undefined;
333
+ name?: string | undefined;
334
+ location?: {
335
+ id: string;
336
+ name: string;
337
+ provider: string;
338
+ formattedAddress: string;
339
+ city?: string | null | undefined;
340
+ state?: string | null | undefined;
341
+ country?: string | null | undefined;
342
+ postalCode?: string | null | undefined;
343
+ latitude?: string | null | undefined;
344
+ longitude?: string | null | undefined;
345
+ } | undefined;
346
+ organizationId?: string | undefined;
347
+ mode?: string | undefined;
348
+ ageGroup?: string | undefined;
349
+ };
350
+ };
351
+ output: {
352
+ message: string;
353
+ };
354
+ outputFormat: "text" | "json";
355
+ status: 401;
356
+ } | {
357
+ input: {
358
+ param: {
359
+ [x: string]: string;
360
+ };
361
+ } & {
362
+ json: {
363
+ description: string | null;
364
+ gender: string;
365
+ status?: string | undefined;
366
+ type?: string | undefined;
367
+ name?: string | undefined;
368
+ location?: {
369
+ id: string;
370
+ name: string;
371
+ provider: string;
372
+ formattedAddress: string;
373
+ city?: string | null | undefined;
374
+ state?: string | null | undefined;
375
+ country?: string | null | undefined;
376
+ postalCode?: string | null | undefined;
377
+ latitude?: string | null | undefined;
378
+ longitude?: string | null | undefined;
379
+ } | undefined;
380
+ organizationId?: string | undefined;
381
+ mode?: string | undefined;
382
+ ageGroup?: string | undefined;
383
+ };
384
+ };
385
+ output: {
386
+ id: string;
387
+ status: string;
388
+ type: string;
389
+ description: string | null;
390
+ name: string;
391
+ location: {
392
+ id: string;
393
+ name: string;
394
+ provider: string;
395
+ formattedAddress: string;
396
+ city: string | null;
397
+ state: string | null;
398
+ country: string | null;
399
+ postalCode: string | null;
400
+ latitude: string | null;
401
+ longitude: string | null;
402
+ } | null;
403
+ locationId: string | null;
404
+ organizationId: string;
405
+ organization: {
406
+ id: string;
407
+ status: string;
408
+ description: string;
409
+ name: string;
410
+ city: string | null;
411
+ state: string | null;
412
+ country: string | null;
413
+ createdAt: string | null;
414
+ updatedAt: string | null;
415
+ ownerId: string;
416
+ slug: string;
417
+ avatar: string | null;
418
+ stateCd: string | null;
419
+ } | null;
420
+ mode: string;
421
+ createdAt: string;
422
+ updatedAt: string;
423
+ creatorId: string | null;
424
+ ageGroup: string;
425
+ gender: string;
426
+ creator: {
427
+ image: string | null;
428
+ id: string;
429
+ name: string;
430
+ email: string;
431
+ emailVerified: boolean;
432
+ createdAt: string;
433
+ updatedAt: string;
434
+ } | null;
435
+ };
436
+ outputFormat: "text" | "json";
437
+ status: 200;
438
+ };
439
+ };
440
+ } & {
441
+ "/events/count-stats": {
442
+ $get: {
443
+ input: {
444
+ query: {
445
+ organizationId: string | string[];
446
+ };
447
+ };
448
+ output: {
449
+ message: string;
450
+ };
451
+ outputFormat: "text" | "json";
452
+ status: 404;
453
+ } | {
454
+ input: {
455
+ query: {
456
+ organizationId: string | string[];
457
+ };
458
+ };
459
+ output: {
460
+ error: {
461
+ issues: {
462
+ code: string;
463
+ path: (string | number)[];
464
+ message?: string | undefined;
465
+ }[];
466
+ name: string;
467
+ };
468
+ success: boolean;
469
+ };
470
+ outputFormat: "text" | "json";
471
+ status: 422;
472
+ } | {
473
+ input: {
474
+ query: {
475
+ organizationId: string | string[];
476
+ };
477
+ };
478
+ output: {
479
+ message: string;
480
+ };
481
+ outputFormat: "text" | "json";
482
+ status: 401;
483
+ } | {
484
+ input: {
485
+ query: {
486
+ organizationId: string | string[];
487
+ };
488
+ };
489
+ output: {
490
+ total: number;
491
+ thisMonth: number;
492
+ upcoming: number;
493
+ inProgress: number;
494
+ completed: number;
495
+ };
496
+ outputFormat: "text" | "json";
497
+ status: 200;
498
+ };
499
+ };
500
+ }, "/">;
501
+ export default router;