@msbci/form-server 1.3.0 → 1.3.1
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.
- package/README.md +11 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +26 -19
- package/dist/index.d.ts +26 -19
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +17 -17
- package/src/prisma/schema.prisma +18 -5
package/dist/index.d.mts
CHANGED
|
@@ -133,6 +133,7 @@ declare class FormService {
|
|
|
133
133
|
pageSize: number;
|
|
134
134
|
search?: string;
|
|
135
135
|
tenantId?: string;
|
|
136
|
+
scopeId?: string;
|
|
136
137
|
}): Promise<{
|
|
137
138
|
items: ({
|
|
138
139
|
formType: {
|
|
@@ -160,7 +161,6 @@ declare class FormService {
|
|
|
160
161
|
version: string;
|
|
161
162
|
isPublished: boolean;
|
|
162
163
|
formTypeId: string | null;
|
|
163
|
-
scopeId: string | null;
|
|
164
164
|
createdBy: string | null;
|
|
165
165
|
updatedBy: string | null;
|
|
166
166
|
})[];
|
|
@@ -176,6 +176,11 @@ declare class FormService {
|
|
|
176
176
|
createdAt: Date;
|
|
177
177
|
updatedAt: Date;
|
|
178
178
|
} | null;
|
|
179
|
+
scopes: {
|
|
180
|
+
order: number;
|
|
181
|
+
scopeId: string;
|
|
182
|
+
formId: string;
|
|
183
|
+
}[];
|
|
179
184
|
pages: ({
|
|
180
185
|
variables: {
|
|
181
186
|
id: string;
|
|
@@ -254,13 +259,13 @@ declare class FormService {
|
|
|
254
259
|
createdAt: Date;
|
|
255
260
|
updatedAt: Date;
|
|
256
261
|
order: number;
|
|
262
|
+
formId: string;
|
|
257
263
|
isRepeatable: boolean;
|
|
258
264
|
repeatMinInstances: number | null;
|
|
259
265
|
repeatMaxInstances: number | null;
|
|
260
266
|
repeatControlVarCode: string | null;
|
|
261
267
|
repeatInstanceLabel: string | null;
|
|
262
268
|
conditions: string | null;
|
|
263
|
-
formId: string;
|
|
264
269
|
})[];
|
|
265
270
|
} & {
|
|
266
271
|
id: string;
|
|
@@ -274,7 +279,6 @@ declare class FormService {
|
|
|
274
279
|
version: string;
|
|
275
280
|
isPublished: boolean;
|
|
276
281
|
formTypeId: string | null;
|
|
277
|
-
scopeId: string | null;
|
|
278
282
|
createdBy: string | null;
|
|
279
283
|
updatedBy: string | null;
|
|
280
284
|
}>;
|
|
@@ -286,7 +290,7 @@ declare class FormService {
|
|
|
286
290
|
isPublished?: boolean;
|
|
287
291
|
tenantId?: string;
|
|
288
292
|
formTypeId?: string;
|
|
289
|
-
|
|
293
|
+
scopeIds?: string[];
|
|
290
294
|
metadata?: Record<string, unknown>;
|
|
291
295
|
}, ctx?: IRequestContext): Promise<{
|
|
292
296
|
id: string;
|
|
@@ -300,7 +304,6 @@ declare class FormService {
|
|
|
300
304
|
version: string;
|
|
301
305
|
isPublished: boolean;
|
|
302
306
|
formTypeId: string | null;
|
|
303
|
-
scopeId: string | null;
|
|
304
307
|
createdBy: string | null;
|
|
305
308
|
updatedBy: string | null;
|
|
306
309
|
}>;
|
|
@@ -311,9 +314,15 @@ declare class FormService {
|
|
|
311
314
|
version: string;
|
|
312
315
|
isPublished: boolean;
|
|
313
316
|
formTypeId: string;
|
|
314
|
-
|
|
317
|
+
scopeIds: string[];
|
|
315
318
|
metadata: Record<string, unknown>;
|
|
316
|
-
}>, ctx?: IRequestContext): Promise<{
|
|
319
|
+
}>, ctx?: IRequestContext): Promise<({
|
|
320
|
+
scopes: {
|
|
321
|
+
order: number;
|
|
322
|
+
scopeId: string;
|
|
323
|
+
formId: string;
|
|
324
|
+
}[];
|
|
325
|
+
} & {
|
|
317
326
|
id: string;
|
|
318
327
|
code: string;
|
|
319
328
|
name: string;
|
|
@@ -325,10 +334,9 @@ declare class FormService {
|
|
|
325
334
|
version: string;
|
|
326
335
|
isPublished: boolean;
|
|
327
336
|
formTypeId: string | null;
|
|
328
|
-
scopeId: string | null;
|
|
329
337
|
createdBy: string | null;
|
|
330
338
|
updatedBy: string | null;
|
|
331
|
-
}>;
|
|
339
|
+
}) | null>;
|
|
332
340
|
/**
|
|
333
341
|
* Load a form by id and return it as a fully-resolved `IFormDefinition`
|
|
334
342
|
* (templates applied — Option B). Used by `GET /forms/:id/resolved` and
|
|
@@ -348,7 +356,6 @@ declare class FormService {
|
|
|
348
356
|
version: string;
|
|
349
357
|
isPublished: boolean;
|
|
350
358
|
formTypeId: string | null;
|
|
351
|
-
scopeId: string | null;
|
|
352
359
|
createdBy: string | null;
|
|
353
360
|
updatedBy: string | null;
|
|
354
361
|
}>;
|
|
@@ -371,13 +378,13 @@ declare class FormService {
|
|
|
371
378
|
createdAt: Date;
|
|
372
379
|
updatedAt: Date;
|
|
373
380
|
order: number;
|
|
381
|
+
formId: string;
|
|
374
382
|
isRepeatable: boolean;
|
|
375
383
|
repeatMinInstances: number | null;
|
|
376
384
|
repeatMaxInstances: number | null;
|
|
377
385
|
repeatControlVarCode: string | null;
|
|
378
386
|
repeatInstanceLabel: string | null;
|
|
379
387
|
conditions: string | null;
|
|
380
|
-
formId: string;
|
|
381
388
|
}>;
|
|
382
389
|
updateFormPage(id: string, data: Partial<{
|
|
383
390
|
code: string;
|
|
@@ -398,13 +405,13 @@ declare class FormService {
|
|
|
398
405
|
createdAt: Date;
|
|
399
406
|
updatedAt: Date;
|
|
400
407
|
order: number;
|
|
408
|
+
formId: string;
|
|
401
409
|
isRepeatable: boolean;
|
|
402
410
|
repeatMinInstances: number | null;
|
|
403
411
|
repeatMaxInstances: number | null;
|
|
404
412
|
repeatControlVarCode: string | null;
|
|
405
413
|
repeatInstanceLabel: string | null;
|
|
406
414
|
conditions: string | null;
|
|
407
|
-
formId: string;
|
|
408
415
|
}>;
|
|
409
416
|
deleteFormPage(id: string): Promise<{
|
|
410
417
|
id: string;
|
|
@@ -414,13 +421,13 @@ declare class FormService {
|
|
|
414
421
|
createdAt: Date;
|
|
415
422
|
updatedAt: Date;
|
|
416
423
|
order: number;
|
|
424
|
+
formId: string;
|
|
417
425
|
isRepeatable: boolean;
|
|
418
426
|
repeatMinInstances: number | null;
|
|
419
427
|
repeatMaxInstances: number | null;
|
|
420
428
|
repeatControlVarCode: string | null;
|
|
421
429
|
repeatInstanceLabel: string | null;
|
|
422
430
|
conditions: string | null;
|
|
423
|
-
formId: string;
|
|
424
431
|
}>;
|
|
425
432
|
createFormRoster(pageId: string, data: {
|
|
426
433
|
code: string;
|
|
@@ -773,7 +780,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
773
780
|
isPublished: z.ZodDefault<z.ZodBoolean>;
|
|
774
781
|
tenantId: z.ZodOptional<z.ZodString>;
|
|
775
782
|
formTypeId: z.ZodOptional<z.ZodString>;
|
|
776
|
-
|
|
783
|
+
scopeIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
777
784
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
778
785
|
}, "strip", z.ZodTypeAny, {
|
|
779
786
|
code: string;
|
|
@@ -784,7 +791,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
784
791
|
metadata?: Record<string, unknown> | undefined;
|
|
785
792
|
tenantId?: string | undefined;
|
|
786
793
|
formTypeId?: string | undefined;
|
|
787
|
-
|
|
794
|
+
scopeIds?: string[] | undefined;
|
|
788
795
|
}, {
|
|
789
796
|
code: string;
|
|
790
797
|
name: string;
|
|
@@ -794,7 +801,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
794
801
|
version?: string | undefined;
|
|
795
802
|
isPublished?: boolean | undefined;
|
|
796
803
|
formTypeId?: string | undefined;
|
|
797
|
-
|
|
804
|
+
scopeIds?: string[] | undefined;
|
|
798
805
|
}>;
|
|
799
806
|
declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
800
807
|
code: z.ZodOptional<z.ZodString>;
|
|
@@ -804,7 +811,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
804
811
|
isPublished: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
805
812
|
tenantId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
806
813
|
formTypeId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
807
|
-
|
|
814
|
+
scopeIds: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
808
815
|
metadata: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
809
816
|
}, "strip", z.ZodTypeAny, {
|
|
810
817
|
code?: string | undefined;
|
|
@@ -815,7 +822,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
815
822
|
version?: string | undefined;
|
|
816
823
|
isPublished?: boolean | undefined;
|
|
817
824
|
formTypeId?: string | undefined;
|
|
818
|
-
|
|
825
|
+
scopeIds?: string[] | undefined;
|
|
819
826
|
}, {
|
|
820
827
|
code?: string | undefined;
|
|
821
828
|
name?: string | undefined;
|
|
@@ -825,7 +832,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
825
832
|
version?: string | undefined;
|
|
826
833
|
isPublished?: boolean | undefined;
|
|
827
834
|
formTypeId?: string | undefined;
|
|
828
|
-
|
|
835
|
+
scopeIds?: string[] | undefined;
|
|
829
836
|
}>;
|
|
830
837
|
declare const createFormPageSchema: z.ZodObject<{
|
|
831
838
|
code: z.ZodString;
|
package/dist/index.d.ts
CHANGED
|
@@ -133,6 +133,7 @@ declare class FormService {
|
|
|
133
133
|
pageSize: number;
|
|
134
134
|
search?: string;
|
|
135
135
|
tenantId?: string;
|
|
136
|
+
scopeId?: string;
|
|
136
137
|
}): Promise<{
|
|
137
138
|
items: ({
|
|
138
139
|
formType: {
|
|
@@ -160,7 +161,6 @@ declare class FormService {
|
|
|
160
161
|
version: string;
|
|
161
162
|
isPublished: boolean;
|
|
162
163
|
formTypeId: string | null;
|
|
163
|
-
scopeId: string | null;
|
|
164
164
|
createdBy: string | null;
|
|
165
165
|
updatedBy: string | null;
|
|
166
166
|
})[];
|
|
@@ -176,6 +176,11 @@ declare class FormService {
|
|
|
176
176
|
createdAt: Date;
|
|
177
177
|
updatedAt: Date;
|
|
178
178
|
} | null;
|
|
179
|
+
scopes: {
|
|
180
|
+
order: number;
|
|
181
|
+
scopeId: string;
|
|
182
|
+
formId: string;
|
|
183
|
+
}[];
|
|
179
184
|
pages: ({
|
|
180
185
|
variables: {
|
|
181
186
|
id: string;
|
|
@@ -254,13 +259,13 @@ declare class FormService {
|
|
|
254
259
|
createdAt: Date;
|
|
255
260
|
updatedAt: Date;
|
|
256
261
|
order: number;
|
|
262
|
+
formId: string;
|
|
257
263
|
isRepeatable: boolean;
|
|
258
264
|
repeatMinInstances: number | null;
|
|
259
265
|
repeatMaxInstances: number | null;
|
|
260
266
|
repeatControlVarCode: string | null;
|
|
261
267
|
repeatInstanceLabel: string | null;
|
|
262
268
|
conditions: string | null;
|
|
263
|
-
formId: string;
|
|
264
269
|
})[];
|
|
265
270
|
} & {
|
|
266
271
|
id: string;
|
|
@@ -274,7 +279,6 @@ declare class FormService {
|
|
|
274
279
|
version: string;
|
|
275
280
|
isPublished: boolean;
|
|
276
281
|
formTypeId: string | null;
|
|
277
|
-
scopeId: string | null;
|
|
278
282
|
createdBy: string | null;
|
|
279
283
|
updatedBy: string | null;
|
|
280
284
|
}>;
|
|
@@ -286,7 +290,7 @@ declare class FormService {
|
|
|
286
290
|
isPublished?: boolean;
|
|
287
291
|
tenantId?: string;
|
|
288
292
|
formTypeId?: string;
|
|
289
|
-
|
|
293
|
+
scopeIds?: string[];
|
|
290
294
|
metadata?: Record<string, unknown>;
|
|
291
295
|
}, ctx?: IRequestContext): Promise<{
|
|
292
296
|
id: string;
|
|
@@ -300,7 +304,6 @@ declare class FormService {
|
|
|
300
304
|
version: string;
|
|
301
305
|
isPublished: boolean;
|
|
302
306
|
formTypeId: string | null;
|
|
303
|
-
scopeId: string | null;
|
|
304
307
|
createdBy: string | null;
|
|
305
308
|
updatedBy: string | null;
|
|
306
309
|
}>;
|
|
@@ -311,9 +314,15 @@ declare class FormService {
|
|
|
311
314
|
version: string;
|
|
312
315
|
isPublished: boolean;
|
|
313
316
|
formTypeId: string;
|
|
314
|
-
|
|
317
|
+
scopeIds: string[];
|
|
315
318
|
metadata: Record<string, unknown>;
|
|
316
|
-
}>, ctx?: IRequestContext): Promise<{
|
|
319
|
+
}>, ctx?: IRequestContext): Promise<({
|
|
320
|
+
scopes: {
|
|
321
|
+
order: number;
|
|
322
|
+
scopeId: string;
|
|
323
|
+
formId: string;
|
|
324
|
+
}[];
|
|
325
|
+
} & {
|
|
317
326
|
id: string;
|
|
318
327
|
code: string;
|
|
319
328
|
name: string;
|
|
@@ -325,10 +334,9 @@ declare class FormService {
|
|
|
325
334
|
version: string;
|
|
326
335
|
isPublished: boolean;
|
|
327
336
|
formTypeId: string | null;
|
|
328
|
-
scopeId: string | null;
|
|
329
337
|
createdBy: string | null;
|
|
330
338
|
updatedBy: string | null;
|
|
331
|
-
}>;
|
|
339
|
+
}) | null>;
|
|
332
340
|
/**
|
|
333
341
|
* Load a form by id and return it as a fully-resolved `IFormDefinition`
|
|
334
342
|
* (templates applied — Option B). Used by `GET /forms/:id/resolved` and
|
|
@@ -348,7 +356,6 @@ declare class FormService {
|
|
|
348
356
|
version: string;
|
|
349
357
|
isPublished: boolean;
|
|
350
358
|
formTypeId: string | null;
|
|
351
|
-
scopeId: string | null;
|
|
352
359
|
createdBy: string | null;
|
|
353
360
|
updatedBy: string | null;
|
|
354
361
|
}>;
|
|
@@ -371,13 +378,13 @@ declare class FormService {
|
|
|
371
378
|
createdAt: Date;
|
|
372
379
|
updatedAt: Date;
|
|
373
380
|
order: number;
|
|
381
|
+
formId: string;
|
|
374
382
|
isRepeatable: boolean;
|
|
375
383
|
repeatMinInstances: number | null;
|
|
376
384
|
repeatMaxInstances: number | null;
|
|
377
385
|
repeatControlVarCode: string | null;
|
|
378
386
|
repeatInstanceLabel: string | null;
|
|
379
387
|
conditions: string | null;
|
|
380
|
-
formId: string;
|
|
381
388
|
}>;
|
|
382
389
|
updateFormPage(id: string, data: Partial<{
|
|
383
390
|
code: string;
|
|
@@ -398,13 +405,13 @@ declare class FormService {
|
|
|
398
405
|
createdAt: Date;
|
|
399
406
|
updatedAt: Date;
|
|
400
407
|
order: number;
|
|
408
|
+
formId: string;
|
|
401
409
|
isRepeatable: boolean;
|
|
402
410
|
repeatMinInstances: number | null;
|
|
403
411
|
repeatMaxInstances: number | null;
|
|
404
412
|
repeatControlVarCode: string | null;
|
|
405
413
|
repeatInstanceLabel: string | null;
|
|
406
414
|
conditions: string | null;
|
|
407
|
-
formId: string;
|
|
408
415
|
}>;
|
|
409
416
|
deleteFormPage(id: string): Promise<{
|
|
410
417
|
id: string;
|
|
@@ -414,13 +421,13 @@ declare class FormService {
|
|
|
414
421
|
createdAt: Date;
|
|
415
422
|
updatedAt: Date;
|
|
416
423
|
order: number;
|
|
424
|
+
formId: string;
|
|
417
425
|
isRepeatable: boolean;
|
|
418
426
|
repeatMinInstances: number | null;
|
|
419
427
|
repeatMaxInstances: number | null;
|
|
420
428
|
repeatControlVarCode: string | null;
|
|
421
429
|
repeatInstanceLabel: string | null;
|
|
422
430
|
conditions: string | null;
|
|
423
|
-
formId: string;
|
|
424
431
|
}>;
|
|
425
432
|
createFormRoster(pageId: string, data: {
|
|
426
433
|
code: string;
|
|
@@ -773,7 +780,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
773
780
|
isPublished: z.ZodDefault<z.ZodBoolean>;
|
|
774
781
|
tenantId: z.ZodOptional<z.ZodString>;
|
|
775
782
|
formTypeId: z.ZodOptional<z.ZodString>;
|
|
776
|
-
|
|
783
|
+
scopeIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
777
784
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
778
785
|
}, "strip", z.ZodTypeAny, {
|
|
779
786
|
code: string;
|
|
@@ -784,7 +791,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
784
791
|
metadata?: Record<string, unknown> | undefined;
|
|
785
792
|
tenantId?: string | undefined;
|
|
786
793
|
formTypeId?: string | undefined;
|
|
787
|
-
|
|
794
|
+
scopeIds?: string[] | undefined;
|
|
788
795
|
}, {
|
|
789
796
|
code: string;
|
|
790
797
|
name: string;
|
|
@@ -794,7 +801,7 @@ declare const createFormDefinitionSchema: z.ZodObject<{
|
|
|
794
801
|
version?: string | undefined;
|
|
795
802
|
isPublished?: boolean | undefined;
|
|
796
803
|
formTypeId?: string | undefined;
|
|
797
|
-
|
|
804
|
+
scopeIds?: string[] | undefined;
|
|
798
805
|
}>;
|
|
799
806
|
declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
800
807
|
code: z.ZodOptional<z.ZodString>;
|
|
@@ -804,7 +811,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
804
811
|
isPublished: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
805
812
|
tenantId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
806
813
|
formTypeId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
|
807
|
-
|
|
814
|
+
scopeIds: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
808
815
|
metadata: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
809
816
|
}, "strip", z.ZodTypeAny, {
|
|
810
817
|
code?: string | undefined;
|
|
@@ -815,7 +822,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
815
822
|
version?: string | undefined;
|
|
816
823
|
isPublished?: boolean | undefined;
|
|
817
824
|
formTypeId?: string | undefined;
|
|
818
|
-
|
|
825
|
+
scopeIds?: string[] | undefined;
|
|
819
826
|
}, {
|
|
820
827
|
code?: string | undefined;
|
|
821
828
|
name?: string | undefined;
|
|
@@ -825,7 +832,7 @@ declare const updateFormDefinitionSchema: z.ZodObject<{
|
|
|
825
832
|
version?: string | undefined;
|
|
826
833
|
isPublished?: boolean | undefined;
|
|
827
834
|
formTypeId?: string | undefined;
|
|
828
|
-
|
|
835
|
+
scopeIds?: string[] | undefined;
|
|
829
836
|
}>;
|
|
830
837
|
declare const createFormPageSchema: z.ZodObject<{
|
|
831
838
|
code: z.ZodString;
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {serializeForm,deserializeForm,getPageVariables,getPageRosters,collectTemplateIds,resolveFormTemplates}from'@msbci/form-core';import {z as z$1}from'zod';var f=class d extends Error{constructor(n,i,p){super(i);this.statusCode=n;this.errors=p;this.name="ApiError";}static notFound(n="Resource not found"){return new d(404,n)}static badRequest(n,i){return new d(400,n,i)}static unauthorized(n="Unauthorized"){return new d(401,n)}static conflict(n){return new d(409,n)}};function v(d,e="Success"){return {status:200,message:e,data:d}}function E(d,e,n,i){return {status:200,message:"Success",data:{items:d,total:e,page:n,pageSize:i,totalPages:Math.ceil(e/i)}}}function m(d){return d==null?null:JSON.stringify(d)}function g(d){if(d)try{return JSON.parse(d)}catch{return}}function T(d){if(d!=null)return typeof d=="string"?d:JSON.stringify(d)}var x=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let n=await this.prisma.formType.findUnique({where:{id:e}});if(!n)throw f.notFound("FormType not found");return n}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:m(e.metadata)}})}async updateFormType(e,n){let{metadata:i,...p}=n;return this.prisma.formType.update({where:{id:e},data:{...p,...i!==void 0?{metadata:m(i)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let n={};e.tenantId&&(n.tenantId=e.tenantId),e.search&&(n.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[i,p]=await Promise.all([this.prisma.formDefinition.findMany({where:n,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:n})]);return {items:i,total:p}}async getFormDefinition(e){let n=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!n)throw f.notFound("FormDefinition not found");return n}async createFormDefinition(e,n){return this.prisma.formDefinition.create({data:{...e,metadata:m(e.metadata),createdBy:n?.userId,updatedBy:n?.userId}})}async updateFormDefinition(e,n,i){let{metadata:p,...r}=n;return this.prisma.formDefinition.update({where:{id:e},data:{...r,...p!==void 0?{metadata:m(p)}:{},updatedBy:i?.userId}})}async getResolvedFormDefinition(e){let n=await this.getFormDefinition(e);return this.dbToFormDefinition(n)}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,n){return this.prisma.formPage.create({data:{...n,formId:e,conditions:m(n.conditions),metadata:m(n.metadata)}})}async updateFormPage(e,n){let{conditions:i,metadata:p,...r}=n;return this.prisma.formPage.update({where:{id:e},data:{...r,...i!==void 0?{conditions:m(i)}:{},...p!==void 0?{metadata:m(p)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,n){return this.prisma.formRoster.create({data:{...n,pageId:e,options:m(n.options),conditions:m(n.conditions),metadata:m(n.metadata)}})}async updateFormRoster(e,n){let{options:i,conditions:p,metadata:r,...c}=n;return this.prisma.formRoster.update({where:{id:e},data:{...c,...i!==void 0?{options:m(i)}:{},...p!==void 0?{conditions:m(p)}:{},...r!==void 0?{metadata:m(r)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw f.badRequest("Variable must belong to a page or a roster");let{templateOverrides:n,...i}=e;return this.prisma.formVariable.create({data:{...i,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:m(e.options),validationRules:m(e.validationRules),conditions:m(e.conditions),dataSourceDependencies:m(e.dataSourceDependencies),style:m(e.style),metadata:m(e.metadata),templateOverrides:m(n)}})}async updateFormVariable(e,n){let{options:i,validationRules:p,conditions:r,dataSourceDependencies:c,style:s,metadata:l,defaultValue:S,templateOverrides:a,...o}=n;return this.prisma.formVariable.update({where:{id:e},data:{...o,...S!==void 0?{defaultValue:String(S)}:{},...i!==void 0?{options:m(i)}:{},...p!==void 0?{validationRules:m(p)}:{},...r!==void 0?{conditions:m(r)}:{},...c!==void 0?{dataSourceDependencies:m(c)}:{},...s!==void 0?{style:m(s)}:{},...l!==void 0?{metadata:m(l)}:{},...a!==void 0?{templateOverrides:m(a)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let n={formId:e.formId};e.status&&(n.status=e.status),e.tenantId&&(n.tenantId=e.tenantId);let[i,p]=await Promise.all([this.prisma.formSubmission.findMany({where:n,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:n})]);return {items:i,total:p}}async getSubmission(e){let n=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!n)throw f.notFound("Submission not found");return n}async createSubmission(e,n){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:m(e.metadata),createdBy:n?.userId,updatedBy:n?.userId}})}async updateSubmission(e,n,i){return this.prisma.formSubmission.update({where:{id:e},data:{...n.status?{status:n.status}:{},...n.data?{data:JSON.stringify(n.data)}:{},...n.metadata!==void 0?{metadata:m(n.metadata)}:{},updatedBy:i?.userId}})}async exportForm(e){let n=await this.getFormDefinition(e),i=await this.dbToFormDefinition(n);return serializeForm(i)}async importForm(e,n){let i=deserializeForm(e),p=await this.createFormDefinition({code:i.code,name:T(i.name)??"",description:T(i.description),version:i.version,isPublished:i.isPublished,tenantId:n,formTypeId:i.formTypeId,scopeId:i.scopeId});for(let r of i.pages){let c=await this.createFormPage(p.id,{code:r.code,name:T(r.name)??"",order:r.order,isRepeatable:r.isRepeatable,repeatMinInstances:r.repeatConfig?.min,repeatMaxInstances:r.repeatConfig?.max,repeatControlVarCode:r.repeatConfig?.controlVariableCode,repeatInstanceLabel:T(r.repeatConfig?.instanceLabel)});for(let s of getPageVariables(r))await this.createFormVariable(this.extractVariableData(s,c.id,void 0));for(let s of getPageRosters(r)){let l=await this.createFormRoster(c.id,{code:s.code,name:T(s.name)??"",rosterType:s.rosterType,order:s.order,pilotVariableCode:s.pilotVariableCode,options:s.options});for(let S of s.variables)await this.createFormVariable(this.extractVariableData(S,void 0,l.id));}}return p.id}extractVariableData(e,n,i){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:n,rosterId:i,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata,templateId:e.templateId,templateOverrides:e.templateOverrides}}async dbToFormDefinition(e,n=true){let i={id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,scopeId:e.scopeId??void 0,metadata:g(e.metadata),pages:(e.pages??[]).map(s=>({id:s.id,code:s.code,name:s.name,order:s.order,isRepeatable:s.isRepeatable,repeatConfig:s.isRepeatable?{min:s.repeatMinInstances??void 0,max:s.repeatMaxInstances??void 0,controlVariableCode:s.repeatControlVarCode??void 0,instanceLabel:s.repeatInstanceLabel??void 0}:void 0,conditions:g(s.conditions)??[],variables:(s.variables??[]).map(l=>this.dbToVariable(l)),rosters:(s.rosters??[]).map(l=>({id:l.id,code:l.code,name:l.name,rosterType:l.rosterType,order:l.order,pilotVariableCode:l.pilotVariableCode??void 0,options:g(l.options),conditions:g(l.conditions)??[],variables:(l.variables??[]).map(S=>this.dbToVariable(S))}))}))};if(!n)return i;let p=collectTemplateIds(i);if(p.size===0)return i;let r=await this.prisma.variableTemplate.findMany({where:{id:{in:[...p]}}}),c=new Map(r.map(s=>[s.id,this.dbToTemplate(s)]));return resolveFormTemplates(i,c)}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:g(e.options),validationRules:g(e.validationRules),conditions:g(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:g(e.dataSourceDependencies),style:g(e.style),metadata:g(e.metadata),templateId:e.templateId??void 0,templateOverrides:g(e.templateOverrides)}}dbToTemplate(e){return {id:e.id,code:e.code,name:B(e.name)??"",scopeId:e.scopeId,tenantId:e.tenantId??"default",variableType:e.variableType,description:B(e.description),placeholder:B(e.placeholder),isRequired:e.isRequired??void 0,isReadonly:e.isReadonly??void 0,isHidden:e.isHidden??void 0,options:g(e.options),validationRules:g(e.validationRules),conditions:g(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:g(e.dataSourceDependencies),style:g(e.style),metadata:g(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}};function B(d){if(d!=null){if(d.startsWith("{"))try{return JSON.parse(d)}catch{return d}return d}}var L="default";function b(d){return d==null?null:JSON.stringify(d)}function I(d){if(d!=null)try{return JSON.parse(d)}catch{return}}function w(d){if(d!=null)return typeof d=="string"?d:JSON.stringify(d)}function F(d){if(d!=null){if(d.startsWith("{"))try{return JSON.parse(d)}catch{return d}return d}}function O(d,e){return e??d?.tenantId??L}var P=class{constructor(e){this.prisma=e;}async createScope(e,n){let i=O(n,e.tenantId);try{let p=await this.prisma.scope.create({data:{code:e.code,name:w(e.name)??"",description:w(e.description),tenantId:i,metadata:b(e.metadata),createdBy:n?.userId,updatedBy:n?.userId}});return this.dbToScope(p)}catch(p){throw W(p)?f.badRequest(`Scope code "${e.code}" already exists for tenant "${i}"`):p}}async updateScope(e,n,i){if(!await this.prisma.scope.findUnique({where:{id:e}}))throw f.notFound("Scope not found");let r=await this.prisma.scope.update({where:{id:e},data:{...n.name!==void 0?{name:w(n.name)??""}:{},...n.description!==void 0?{description:w(n.description)}:{},...n.metadata!==void 0?{metadata:b(n.metadata)}:{},updatedBy:i?.userId}});return this.dbToScope(r)}async deleteScope(e){if(!await this.prisma.scope.findUnique({where:{id:e}}))throw f.notFound("Scope not found");let[i,p]=await Promise.all([this.prisma.formDefinition.count({where:{scopeId:e}}),this.prisma.variableTemplate.count({where:{scopeId:e}})]);if(i>0||p>0)throw f.conflict(`Scope is in use (forms: ${i}, templates: ${p}). Remove dependents first.`);await this.prisma.scope.delete({where:{id:e}});}async listScopes(e,n){let i=O(n,e.tenantId),p=e.page??1,r=e.pageSize??50,[c,s]=await Promise.all([this.prisma.scope.findMany({where:{tenantId:i},skip:(p-1)*r,take:r,orderBy:{updatedAt:"desc"}}),this.prisma.scope.count({where:{tenantId:i}})]);return {items:c.map(l=>this.dbToScope(l)),total:s}}async getScopeById(e){let n=await this.prisma.scope.findUnique({where:{id:e}});if(!n)throw f.notFound("Scope not found");return this.dbToScope(n)}async createTemplate(e,n,i){let p=await this.prisma.scope.findUnique({where:{id:e}});if(!p)throw f.notFound("Scope not found");let r=O(i,n.tenantId)||p.tenantId;try{let c=await this.prisma.variableTemplate.create({data:{code:n.code,name:w(n.name)??"",scopeId:e,tenantId:r,variableType:n.variableType,description:w(n.description),placeholder:w(n.placeholder),isRequired:n.isRequired??!1,isReadonly:n.isReadonly??!1,isHidden:n.isHidden??!1,options:b(n.options),validationRules:b(n.validationRules),conditions:b(n.conditions),expression:n.expression,dataSourceId:n.dataSourceId,dataSourceDependencies:b(n.dataSourceDependencies),style:b(n.style),metadata:b(n.metadata),createdBy:i?.userId,updatedBy:i?.userId}});return this.dbToTemplate(c)}catch(c){throw W(c)?f.badRequest(`Template code "${n.code}" already exists in this scope`):c}}async updateTemplate(e,n,i){if("code"in n||"name"in n)throw f.badRequest("Template code and name are immutable");if(!await this.prisma.variableTemplate.findUnique({where:{id:e}}))throw f.notFound("Template not found");let r=await this.prisma.variableTemplate.update({where:{id:e},data:{...n.variableType!==void 0?{variableType:n.variableType}:{},...n.description!==void 0?{description:w(n.description)}:{},...n.placeholder!==void 0?{placeholder:w(n.placeholder)}:{},...n.isRequired!==void 0?{isRequired:n.isRequired}:{},...n.isReadonly!==void 0?{isReadonly:n.isReadonly}:{},...n.isHidden!==void 0?{isHidden:n.isHidden}:{},...n.options!==void 0?{options:b(n.options)}:{},...n.validationRules!==void 0?{validationRules:b(n.validationRules)}:{},...n.conditions!==void 0?{conditions:b(n.conditions)}:{},...n.expression!==void 0?{expression:n.expression}:{},...n.dataSourceId!==void 0?{dataSourceId:n.dataSourceId}:{},...n.dataSourceDependencies!==void 0?{dataSourceDependencies:b(n.dataSourceDependencies)}:{},...n.style!==void 0?{style:b(n.style)}:{},...n.metadata!==void 0?{metadata:b(n.metadata)}:{},updatedBy:i?.userId}});return this.dbToTemplate(r)}async deleteTemplate(e){if(!await this.prisma.variableTemplate.findUnique({where:{id:e}}))throw f.notFound("Template not found");await this.prisma.variableTemplate.delete({where:{id:e}});}async listTemplates(e,n){let i=n?.page??1,p=n?.pageSize??100,[r,c]=await Promise.all([this.prisma.variableTemplate.findMany({where:{scopeId:e},skip:(i-1)*p,take:p,orderBy:{updatedAt:"desc"}}),this.prisma.variableTemplate.count({where:{scopeId:e}})]);return {items:r.map(s=>this.dbToTemplate(s)),total:c}}async getTemplateById(e){let n=await this.prisma.variableTemplate.findUnique({where:{id:e}});if(!n)throw f.notFound("Template not found");return this.dbToTemplate(n)}async getTemplatesByIds(e){return e.length===0?[]:(await this.prisma.variableTemplate.findMany({where:{id:{in:e}}})).map(i=>this.dbToTemplate(i))}dbToScope(e){return {id:e.id,code:e.code,name:F(e.name)??"",description:F(e.description),tenantId:e.tenantId??L,metadata:I(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}dbToTemplate(e){return {id:e.id,code:e.code,name:F(e.name)??"",scopeId:e.scopeId,tenantId:e.tenantId??L,variableType:e.variableType,description:F(e.description),placeholder:F(e.placeholder),isRequired:e.isRequired??void 0,isReadonly:e.isReadonly??void 0,isHidden:e.isHidden??void 0,options:I(e.options),validationRules:I(e.validationRules),conditions:I(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:I(e.dataSourceDependencies),style:I(e.style),metadata:I(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}};function W(d){return typeof d=="object"&&d!==null&&"code"in d&&d.code==="P2002"}var M=async()=>({});var D=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),metadata:z$1.record(z$1.unknown()).optional()}),j=D.partial(),V=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),version:z$1.string().default("1.0.0"),isPublished:z$1.boolean().default(false),tenantId:z$1.string().optional(),formTypeId:z$1.string().optional(),scopeId:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),U=V.partial(),C=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),order:z$1.number().int().min(0),isRepeatable:z$1.boolean().default(false),repeatMinInstances:z$1.number().int().min(0).optional(),repeatMaxInstances:z$1.number().int().min(1).optional(),repeatControlVarCode:z$1.string().optional(),repeatInstanceLabel:z$1.string().optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),H=C.partial(),z=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),rosterType:z$1.enum(["check","list","collection","collection_extend"]),order:z$1.number().int().min(0),pilotVariableCode:z$1.string().optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),J=z.partial(),k=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),type:z$1.string().min(1),order:z$1.number().int().min(0),isRequired:z$1.boolean().default(false),isReadonly:z$1.boolean().default(false),isHidden:z$1.boolean().default(false),defaultValue:z$1.unknown().optional(),placeholder:z$1.string().optional(),description:z$1.string().max(1e3).optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:z$1.string()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional(),templateId:z$1.string().optional(),templateOverrides:z$1.record(z$1.unknown()).optional()}),q=k.partial(),h=z$1.union([z$1.string(),z$1.record(z$1.string())]),Y=z$1.object({code:z$1.string().min(1).max(80),name:h,description:h.optional(),tenantId:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),Z=z$1.object({name:h.optional(),description:h.optional(),metadata:z$1.record(z$1.unknown()).optional()}),_=["text","textarea","number","date","datetime","time","select","multiselect","checkbox","radio","file","image","email","gps","rating","calculated","hidden","label","panel","richtext","listradio","photo"],K=z$1.object({code:z$1.string().min(1).max(80),name:h,variableType:z$1.enum(_),tenantId:z$1.string().optional(),description:h.optional(),placeholder:h.optional(),isRequired:z$1.boolean().optional(),isReadonly:z$1.boolean().optional(),isHidden:z$1.boolean().optional(),options:z$1.array(z$1.object({label:h,value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:h})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),Q=z$1.object({variableType:z$1.enum(_).optional(),description:h.optional(),placeholder:h.optional(),isRequired:z$1.boolean().optional(),isReadonly:z$1.boolean().optional(),isHidden:z$1.boolean().optional(),options:z$1.array(z$1.object({label:h,value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:h})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}).strict(),N=z$1.object({formId:z$1.string().min(1),tenantId:z$1.string().optional(),status:z$1.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:z$1.record(z$1.unknown()),submittedBy:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),G=z$1.object({status:z$1.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),R=z$1.object({page:z$1.coerce.number().int().min(1).default(1),pageSize:z$1.coerce.number().int().min(1).max(100).default(20),search:z$1.string().optional(),tenantId:z$1.string().optional()});var X=new WeakSet;async function se(d){await d.scope.upsert({where:{code_tenantId:{code:"default",tenantId:"default"}},update:{},create:{code:"default",name:JSON.stringify({fr:"Scope par d\xE9faut",en:"Default Scope"}),tenantId:"default"}});}function de(d){let{prisma:e,auth:n=M}=d;X.has(e)||(X.add(e),se(e).catch(a=>{console.error("[form-server] initializeDefaults failed:",a);}));let i=new x(e),p=new P(e),r=new Map;async function c(a){let o=await n({headers:a.headers,query:a.query});if(!o)throw f.unauthorized();return o}function s(a,o=200){return {status:o,body:v(a)}}function l(a,o,u,y){return {status:200,body:E(a,o,u,y)}}r.set("GET /form-types",async a=>{await c(a);let o=await i.getFormTypes();return s(o)}),r.set("GET /form-types/:id",async a=>(await c(a),s(await i.getFormType(a.params.id)))),r.set("POST /form-types",async a=>{await c(a);let o=D.parse(a.body);return s(await i.createFormType(o),201)}),r.set("PUT /form-types/:id",async a=>{await c(a);let o=j.parse(a.body);return s(await i.updateFormType(a.params.id,o))}),r.set("DELETE /form-types/:id",async a=>(await c(a),await i.deleteFormType(a.params.id),s(null,204))),r.set("GET /forms",async a=>{await c(a);let o=R.parse(a.query),{items:u,total:y}=await i.getFormDefinitions(o);return l(u,y,o.page,o.pageSize)}),r.set("GET /forms/:id",async a=>(await c(a),s(await i.getFormDefinition(a.params.id)))),r.set("GET /forms/:id/resolved",async a=>(await c(a),s(await i.getResolvedFormDefinition(a.params.id)))),r.set("POST /forms",async a=>{let o=await c(a),u=V.parse(a.body);return s(await i.createFormDefinition(u,o),201)}),r.set("PUT /forms/:id",async a=>{let o=await c(a),u=U.parse(a.body);return s(await i.updateFormDefinition(a.params.id,u,o))}),r.set("DELETE /forms/:id",async a=>(await c(a),await i.deleteFormDefinition(a.params.id),s(null,204))),r.set("GET /forms/:id/export",async a=>(await c(a),{status:200,body:await i.exportForm(a.params.id)})),r.set("POST /forms/import",async a=>{await c(a);let{json:o,tenantId:u}=a.body,y=await i.importForm(o,u);return s({formId:y},201)}),r.set("POST /forms/:formId/pages",async a=>{await c(a);let o=C.parse(a.body);return s(await i.createFormPage(a.params.formId,o),201)}),r.set("PUT /pages/:id",async a=>{await c(a);let o=H.parse(a.body);return s(await i.updateFormPage(a.params.id,o))}),r.set("DELETE /pages/:id",async a=>(await c(a),await i.deleteFormPage(a.params.id),s(null,204))),r.set("POST /pages/:pageId/rosters",async a=>{await c(a);let o=z.parse(a.body);return s(await i.createFormRoster(a.params.pageId,o),201)}),r.set("PUT /rosters/:id",async a=>{await c(a);let o=J.parse(a.body);return s(await i.updateFormRoster(a.params.id,o))}),r.set("DELETE /rosters/:id",async a=>(await c(a),await i.deleteFormRoster(a.params.id),s(null,204))),r.set("POST /pages/:pageId/variables",async a=>{await c(a);let o=k.parse(a.body);return s(await i.createFormVariable({...o,pageId:a.params.pageId}),201)}),r.set("POST /rosters/:rosterId/variables",async a=>{await c(a);let o=k.parse(a.body);return s(await i.createFormVariable({...o,rosterId:a.params.rosterId}),201)}),r.set("PUT /variables/:id",async a=>{await c(a);let o=q.parse(a.body);return s(await i.updateFormVariable(a.params.id,o))}),r.set("DELETE /variables/:id",async a=>(await c(a),await i.deleteFormVariable(a.params.id),s(null,204))),r.set("GET /forms/:formId/submissions",async a=>{await c(a);let o=R.parse(a.query),{items:u,total:y}=await i.getSubmissions({formId:a.params.formId,...o});return l(u,y,o.page,o.pageSize)}),r.set("GET /submissions/:id",async a=>(await c(a),s(await i.getSubmission(a.params.id)))),r.set("POST /submissions",async a=>{let o=await c(a),u=N.parse(a.body);return s(await i.createSubmission(u,o),201)}),r.set("PUT /submissions/:id",async a=>{let o=await c(a),u=G.parse(a.body);return s(await i.updateSubmission(a.params.id,u,o))}),r.set("GET /scopes",async a=>{let o=await c(a),u=R.parse(a.query),{items:y,total:A}=await p.listScopes({tenantId:u.tenantId,page:u.page,pageSize:u.pageSize},o);return l(y,A,u.page,u.pageSize)}),r.set("GET /scopes/:id",async a=>(await c(a),s(await p.getScopeById(a.params.id)))),r.set("POST /scopes",async a=>{let o=await c(a),u=Y.parse(a.body);return s(await p.createScope(u,o),201)}),r.set("PUT /scopes/:id",async a=>{let o=await c(a),u=Z.parse(a.body);return s(await p.updateScope(a.params.id,u,o))}),r.set("DELETE /scopes/:id",async a=>(await c(a),await p.deleteScope(a.params.id),s(null,204))),r.set("GET /scopes/:scopeId/templates",async a=>{await c(a);let o=R.parse(a.query),{items:u,total:y}=await p.listTemplates(a.params.scopeId,{page:o.page,pageSize:o.pageSize});return l(u,y,o.page,o.pageSize)}),r.set("POST /scopes/:scopeId/templates",async a=>{let o=await c(a),u=K.parse(a.body);return s(await p.createTemplate(a.params.scopeId,u,o),201)}),r.set("GET /templates/:id",async a=>(await c(a),s(await p.getTemplateById(a.params.id)))),r.set("PUT /templates/:id",async a=>{let o=await c(a),u=Q.parse(a.body);return s(await p.updateTemplate(a.params.id,u,o))}),r.set("DELETE /templates/:id",async a=>(await c(a),await p.deleteTemplate(a.params.id),s(null,204)));function S(a,o){for(let[u,y]of r){let[A,ee]=u.split(" ");if(A!==a)continue;let $=ce(ee,o);if($)return {handler:y,params:$}}return null}return {routes:r,handle:async a=>{try{let o=S(a.method,a.path);return o?(a.params=o.params,await o.handler(a)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof f?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(y=>y.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function ce(d,e){let n=d.split("/").filter(Boolean),i=e.split("/").filter(Boolean);if(n.length!==i.length)return null;let p={};for(let r=0;r<n.length;r++){let c=n[r],s=i[r];if(c.startsWith(":"))p[c.slice(1)]=s;else if(c!==s)return null}return p}export{f as ApiError,x as FormService,V as createFormDefinitionSchema,C as createFormPageSchema,z as createFormRosterSchema,de as createFormRouter,D as createFormTypeSchema,k as createFormVariableSchema,N as createSubmissionSchema,M as noAuth,E as paginatedResponse,R as paginationSchema,v as successResponse,U as updateFormDefinitionSchema,H as updateFormPageSchema,J as updateFormRosterSchema,j as updateFormTypeSchema,q as updateFormVariableSchema,G as updateSubmissionSchema};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import {serializeForm,deserializeForm,getPageVariables,getPageRosters,collectTemplateIds,resolveFormTemplates}from'@msbci/form-core';import {z as z$1}from'zod';var f=class s extends Error{constructor(n,i,c){super(i);this.statusCode=n;this.errors=c;this.name="ApiError";}static notFound(n="Resource not found"){return new s(404,n)}static badRequest(n,i){return new s(400,n,i)}static unauthorized(n="Unauthorized"){return new s(401,n)}static conflict(n){return new s(409,n)}};function v(s,e="Success"){return {status:200,message:e,data:s}}function B(s,e,n,i){return {status:200,message:"Success",data:{items:s,total:e,page:n,pageSize:i,totalPages:Math.ceil(e/i)}}}function l(s){return s==null?null:JSON.stringify(s)}function y(s){if(s)try{return JSON.parse(s)}catch{return}}function T(s){if(s!=null)return typeof s=="string"?s:JSON.stringify(s)}var x=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let n=await this.prisma.formType.findUnique({where:{id:e}});if(!n)throw f.notFound("FormType not found");return n}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:l(e.metadata)}})}async updateFormType(e,n){let{metadata:i,...c}=n;return this.prisma.formType.update({where:{id:e},data:{...c,...i!==void 0?{metadata:l(i)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let n={};e.tenantId&&(n.tenantId=e.tenantId),e.scopeId&&(n.scopes={some:{scopeId:e.scopeId}}),e.search&&(n.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[i,c]=await Promise.all([this.prisma.formDefinition.findMany({where:n,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:n})]);return {items:i,total:c}}async getFormDefinition(e){let n=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,scopes:{orderBy:{order:"asc"}},pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!n)throw f.notFound("FormDefinition not found");return n}async createFormDefinition(e,n){let{scopeIds:i,...c}=e;return this.prisma.formDefinition.create({data:{...c,metadata:l(c.metadata),createdBy:n?.userId,updatedBy:n?.userId,...i&&i.length>0?{scopes:{create:i.map((r,d)=>({scopeId:r,order:d}))}}:{}}})}async updateFormDefinition(e,n,i){let{metadata:c,scopeIds:r,...d}=n;return await this.prisma.formDefinition.update({where:{id:e},data:{...d,...c!==void 0?{metadata:l(c)}:{},updatedBy:i?.userId}}),r!==void 0&&(await this.prisma.formDefinitionScope.deleteMany({where:{formId:e}}),r.length>0&&await this.prisma.formDefinitionScope.createMany({data:r.map((p,u)=>({formId:e,scopeId:p,order:u}))})),this.prisma.formDefinition.findUnique({where:{id:e},include:{scopes:{orderBy:{order:"asc"}}}})}async getResolvedFormDefinition(e){let n=await this.getFormDefinition(e);return this.dbToFormDefinition(n)}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,n){return this.prisma.formPage.create({data:{...n,formId:e,conditions:l(n.conditions),metadata:l(n.metadata)}})}async updateFormPage(e,n){let{conditions:i,metadata:c,...r}=n;return this.prisma.formPage.update({where:{id:e},data:{...r,...i!==void 0?{conditions:l(i)}:{},...c!==void 0?{metadata:l(c)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,n){return this.prisma.formRoster.create({data:{...n,pageId:e,options:l(n.options),conditions:l(n.conditions),metadata:l(n.metadata)}})}async updateFormRoster(e,n){let{options:i,conditions:c,metadata:r,...d}=n;return this.prisma.formRoster.update({where:{id:e},data:{...d,...i!==void 0?{options:l(i)}:{},...c!==void 0?{conditions:l(c)}:{},...r!==void 0?{metadata:l(r)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw f.badRequest("Variable must belong to a page or a roster");let{templateOverrides:n,...i}=e;return this.prisma.formVariable.create({data:{...i,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:l(e.options),validationRules:l(e.validationRules),conditions:l(e.conditions),dataSourceDependencies:l(e.dataSourceDependencies),style:l(e.style),metadata:l(e.metadata),templateOverrides:l(n)}})}async updateFormVariable(e,n){let{options:i,validationRules:c,conditions:r,dataSourceDependencies:d,style:p,metadata:u,defaultValue:g,templateOverrides:a,...o}=n;return this.prisma.formVariable.update({where:{id:e},data:{...o,...g!==void 0?{defaultValue:String(g)}:{},...i!==void 0?{options:l(i)}:{},...c!==void 0?{validationRules:l(c)}:{},...r!==void 0?{conditions:l(r)}:{},...d!==void 0?{dataSourceDependencies:l(d)}:{},...p!==void 0?{style:l(p)}:{},...u!==void 0?{metadata:l(u)}:{},...a!==void 0?{templateOverrides:l(a)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let n={formId:e.formId};e.status&&(n.status=e.status),e.tenantId&&(n.tenantId=e.tenantId);let[i,c]=await Promise.all([this.prisma.formSubmission.findMany({where:n,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:n})]);return {items:i,total:c}}async getSubmission(e){let n=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!n)throw f.notFound("Submission not found");return n}async createSubmission(e,n){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:l(e.metadata),createdBy:n?.userId,updatedBy:n?.userId}})}async updateSubmission(e,n,i){return this.prisma.formSubmission.update({where:{id:e},data:{...n.status?{status:n.status}:{},...n.data?{data:JSON.stringify(n.data)}:{},...n.metadata!==void 0?{metadata:l(n.metadata)}:{},updatedBy:i?.userId}})}async exportForm(e){let n=await this.getFormDefinition(e),i=await this.dbToFormDefinition(n);return serializeForm(i)}async importForm(e,n){let i=deserializeForm(e),c=await this.createFormDefinition({code:i.code,name:T(i.name)??"",description:T(i.description),version:i.version,isPublished:i.isPublished,tenantId:n,formTypeId:i.formTypeId,scopeIds:i.scopeIds});for(let r of i.pages){let d=await this.createFormPage(c.id,{code:r.code,name:T(r.name)??"",order:r.order,isRepeatable:r.isRepeatable,repeatMinInstances:r.repeatConfig?.min,repeatMaxInstances:r.repeatConfig?.max,repeatControlVarCode:r.repeatConfig?.controlVariableCode,repeatInstanceLabel:T(r.repeatConfig?.instanceLabel)});for(let p of getPageVariables(r))await this.createFormVariable(this.extractVariableData(p,d.id,void 0));for(let p of getPageRosters(r)){let u=await this.createFormRoster(d.id,{code:p.code,name:T(p.name)??"",rosterType:p.rosterType,order:p.order,pilotVariableCode:p.pilotVariableCode,options:p.options});for(let g of p.variables)await this.createFormVariable(this.extractVariableData(g,void 0,u.id));}}return c.id}extractVariableData(e,n,i){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:n,rosterId:i,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata,templateId:e.templateId,templateOverrides:e.templateOverrides}}async dbToFormDefinition(e,n=true){let i=Array.isArray(e.scopes)?e.scopes.slice().sort((u,g)=>u.order-g.order).map(u=>u.scopeId):void 0,c={id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,scopeIds:i&&i.length>0?i:void 0,metadata:y(e.metadata),pages:(e.pages??[]).map(u=>({id:u.id,code:u.code,name:u.name,order:u.order,isRepeatable:u.isRepeatable,repeatConfig:u.isRepeatable?{min:u.repeatMinInstances??void 0,max:u.repeatMaxInstances??void 0,controlVariableCode:u.repeatControlVarCode??void 0,instanceLabel:u.repeatInstanceLabel??void 0}:void 0,conditions:y(u.conditions)??[],variables:(u.variables??[]).map(g=>this.dbToVariable(g)),rosters:(u.rosters??[]).map(g=>({id:g.id,code:g.code,name:g.name,rosterType:g.rosterType,order:g.order,pilotVariableCode:g.pilotVariableCode??void 0,options:y(g.options),conditions:y(g.conditions)??[],variables:(g.variables??[]).map(a=>this.dbToVariable(a))}))}))};if(!n)return c;let r=collectTemplateIds(c);if(r.size===0)return c;let d=await this.prisma.variableTemplate.findMany({where:{id:{in:[...r]}}}),p=new Map(d.map(u=>[u.id,this.dbToTemplate(u)]));return resolveFormTemplates(c,p)}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:y(e.options),validationRules:y(e.validationRules),conditions:y(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:y(e.dataSourceDependencies),style:y(e.style),metadata:y(e.metadata),templateId:e.templateId??void 0,templateOverrides:y(e.templateOverrides)}}dbToTemplate(e){return {id:e.id,code:e.code,name:E(e.name)??"",scopeId:e.scopeId,tenantId:e.tenantId??"default",variableType:e.variableType,description:E(e.description),placeholder:E(e.placeholder),isRequired:e.isRequired??void 0,isReadonly:e.isReadonly??void 0,isHidden:e.isHidden??void 0,options:y(e.options),validationRules:y(e.validationRules),conditions:y(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:y(e.dataSourceDependencies),style:y(e.style),metadata:y(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}};function E(s){if(s!=null){if(s.startsWith("{"))try{return JSON.parse(s)}catch{return s}return s}}var L="default";function h(s){return s==null?null:JSON.stringify(s)}function I(s){if(s!=null)try{return JSON.parse(s)}catch{return}}function S(s){if(s!=null)return typeof s=="string"?s:JSON.stringify(s)}function F(s){if(s!=null){if(s.startsWith("{"))try{return JSON.parse(s)}catch{return s}return s}}function O(s,e){return e??s?.tenantId??L}var P=class{constructor(e){this.prisma=e;}async createScope(e,n){let i=O(n,e.tenantId);try{let c=await this.prisma.scope.create({data:{code:e.code,name:S(e.name)??"",description:S(e.description),tenantId:i,metadata:h(e.metadata),createdBy:n?.userId,updatedBy:n?.userId}});return this.dbToScope(c)}catch(c){throw W(c)?f.badRequest(`Scope code "${e.code}" already exists for tenant "${i}"`):c}}async updateScope(e,n,i){if(!await this.prisma.scope.findUnique({where:{id:e}}))throw f.notFound("Scope not found");let r=await this.prisma.scope.update({where:{id:e},data:{...n.name!==void 0?{name:S(n.name)??""}:{},...n.description!==void 0?{description:S(n.description)}:{},...n.metadata!==void 0?{metadata:h(n.metadata)}:{},updatedBy:i?.userId}});return this.dbToScope(r)}async deleteScope(e){if(!await this.prisma.scope.findUnique({where:{id:e}}))throw f.notFound("Scope not found");let[i,c]=await Promise.all([this.prisma.formDefinitionScope.count({where:{scopeId:e}}),this.prisma.variableTemplate.count({where:{scopeId:e}})]);if(i>0||c>0)throw f.conflict(`Scope is in use (forms: ${i}, templates: ${c}). Remove dependents first.`);await this.prisma.scope.delete({where:{id:e}});}async listScopes(e,n){let i=O(n,e.tenantId),c=e.page??1,r=e.pageSize??50,[d,p]=await Promise.all([this.prisma.scope.findMany({where:{tenantId:i},skip:(c-1)*r,take:r,orderBy:{updatedAt:"desc"}}),this.prisma.scope.count({where:{tenantId:i}})]);return {items:d.map(u=>this.dbToScope(u)),total:p}}async getScopeById(e){let n=await this.prisma.scope.findUnique({where:{id:e}});if(!n)throw f.notFound("Scope not found");return this.dbToScope(n)}async createTemplate(e,n,i){let c=await this.prisma.scope.findUnique({where:{id:e}});if(!c)throw f.notFound("Scope not found");let r=O(i,n.tenantId)||c.tenantId;try{let d=await this.prisma.variableTemplate.create({data:{code:n.code,name:S(n.name)??"",scopeId:e,tenantId:r,variableType:n.variableType,description:S(n.description),placeholder:S(n.placeholder),isRequired:n.isRequired??!1,isReadonly:n.isReadonly??!1,isHidden:n.isHidden??!1,options:h(n.options),validationRules:h(n.validationRules),conditions:h(n.conditions),expression:n.expression,dataSourceId:n.dataSourceId,dataSourceDependencies:h(n.dataSourceDependencies),style:h(n.style),metadata:h(n.metadata),createdBy:i?.userId,updatedBy:i?.userId}});return this.dbToTemplate(d)}catch(d){throw W(d)?f.badRequest(`Template code "${n.code}" already exists in this scope`):d}}async updateTemplate(e,n,i){if("code"in n||"name"in n)throw f.badRequest("Template code and name are immutable");if(!await this.prisma.variableTemplate.findUnique({where:{id:e}}))throw f.notFound("Template not found");let r=await this.prisma.variableTemplate.update({where:{id:e},data:{...n.variableType!==void 0?{variableType:n.variableType}:{},...n.description!==void 0?{description:S(n.description)}:{},...n.placeholder!==void 0?{placeholder:S(n.placeholder)}:{},...n.isRequired!==void 0?{isRequired:n.isRequired}:{},...n.isReadonly!==void 0?{isReadonly:n.isReadonly}:{},...n.isHidden!==void 0?{isHidden:n.isHidden}:{},...n.options!==void 0?{options:h(n.options)}:{},...n.validationRules!==void 0?{validationRules:h(n.validationRules)}:{},...n.conditions!==void 0?{conditions:h(n.conditions)}:{},...n.expression!==void 0?{expression:n.expression}:{},...n.dataSourceId!==void 0?{dataSourceId:n.dataSourceId}:{},...n.dataSourceDependencies!==void 0?{dataSourceDependencies:h(n.dataSourceDependencies)}:{},...n.style!==void 0?{style:h(n.style)}:{},...n.metadata!==void 0?{metadata:h(n.metadata)}:{},updatedBy:i?.userId}});return this.dbToTemplate(r)}async deleteTemplate(e){if(!await this.prisma.variableTemplate.findUnique({where:{id:e}}))throw f.notFound("Template not found");await this.prisma.variableTemplate.delete({where:{id:e}});}async listTemplates(e,n){let i=n?.page??1,c=n?.pageSize??100,[r,d]=await Promise.all([this.prisma.variableTemplate.findMany({where:{scopeId:e},skip:(i-1)*c,take:c,orderBy:{updatedAt:"desc"}}),this.prisma.variableTemplate.count({where:{scopeId:e}})]);return {items:r.map(p=>this.dbToTemplate(p)),total:d}}async getTemplateById(e){let n=await this.prisma.variableTemplate.findUnique({where:{id:e}});if(!n)throw f.notFound("Template not found");return this.dbToTemplate(n)}async getTemplatesByIds(e){return e.length===0?[]:(await this.prisma.variableTemplate.findMany({where:{id:{in:e}}})).map(i=>this.dbToTemplate(i))}dbToScope(e){return {id:e.id,code:e.code,name:F(e.name)??"",description:F(e.description),tenantId:e.tenantId??L,metadata:I(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}dbToTemplate(e){return {id:e.id,code:e.code,name:F(e.name)??"",scopeId:e.scopeId,tenantId:e.tenantId??L,variableType:e.variableType,description:F(e.description),placeholder:F(e.placeholder),isRequired:e.isRequired??void 0,isReadonly:e.isReadonly??void 0,isHidden:e.isHidden??void 0,options:I(e.options),validationRules:I(e.validationRules),conditions:I(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:I(e.dataSourceDependencies),style:I(e.style),metadata:I(e.metadata),createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():e.createdAt,updatedAt:e.updatedAt instanceof Date?e.updatedAt.toISOString():e.updatedAt,createdBy:e.createdBy??void 0,updatedBy:e.updatedBy??void 0}}};function W(s){return typeof s=="object"&&s!==null&&"code"in s&&s.code==="P2002"}var M=async()=>({});var D=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),metadata:z$1.record(z$1.unknown()).optional()}),j=D.partial(),V=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),version:z$1.string().default("1.0.0"),isPublished:z$1.boolean().default(false),tenantId:z$1.string().optional(),formTypeId:z$1.string().optional(),scopeIds:z$1.array(z$1.string()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),U=V.partial(),C=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),order:z$1.number().int().min(0),isRepeatable:z$1.boolean().default(false),repeatMinInstances:z$1.number().int().min(0).optional(),repeatMaxInstances:z$1.number().int().min(1).optional(),repeatControlVarCode:z$1.string().optional(),repeatInstanceLabel:z$1.string().optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),H=C.partial(),z=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),rosterType:z$1.enum(["check","list","collection","collection_extend"]),order:z$1.number().int().min(0),pilotVariableCode:z$1.string().optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),q=z.partial(),k=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),type:z$1.string().min(1),order:z$1.number().int().min(0),isRequired:z$1.boolean().default(false),isReadonly:z$1.boolean().default(false),isHidden:z$1.boolean().default(false),defaultValue:z$1.unknown().optional(),placeholder:z$1.string().optional(),description:z$1.string().max(1e3).optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:z$1.string()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional(),templateId:z$1.string().optional(),templateOverrides:z$1.record(z$1.unknown()).optional()}),J=k.partial(),w=z$1.union([z$1.string(),z$1.record(z$1.string())]),Y=z$1.object({code:z$1.string().min(1).max(80),name:w,description:w.optional(),tenantId:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),Z=z$1.object({name:w.optional(),description:w.optional(),metadata:z$1.record(z$1.unknown()).optional()}),_=["text","textarea","number","date","datetime","time","select","multiselect","checkbox","radio","file","image","email","gps","rating","calculated","hidden","label","panel","richtext","listradio","photo"],K=z$1.object({code:z$1.string().min(1).max(80),name:w,variableType:z$1.enum(_),tenantId:z$1.string().optional(),description:w.optional(),placeholder:w.optional(),isRequired:z$1.boolean().optional(),isReadonly:z$1.boolean().optional(),isHidden:z$1.boolean().optional(),options:z$1.array(z$1.object({label:w,value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:w})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),Q=z$1.object({variableType:z$1.enum(_).optional(),description:w.optional(),placeholder:w.optional(),isRequired:z$1.boolean().optional(),isReadonly:z$1.boolean().optional(),isHidden:z$1.boolean().optional(),options:z$1.array(z$1.object({label:w,value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:w})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}).strict(),N=z$1.object({formId:z$1.string().min(1),tenantId:z$1.string().optional(),status:z$1.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:z$1.record(z$1.unknown()),submittedBy:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),G=z$1.object({status:z$1.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),R=z$1.object({page:z$1.coerce.number().int().min(1).default(1),pageSize:z$1.coerce.number().int().min(1).max(100).default(20),search:z$1.string().optional(),tenantId:z$1.string().optional()});var X=new WeakSet;async function se(s){await s.scope.upsert({where:{code_tenantId:{code:"default",tenantId:"default"}},update:{},create:{code:"default",name:JSON.stringify({fr:"Scope par d\xE9faut",en:"Default Scope"}),tenantId:"default"}});}function de(s){let{prisma:e,auth:n=M}=s;X.has(e)||(X.add(e),se(e).catch(a=>{console.error("[form-server] initializeDefaults failed:",a);}));let i=new x(e),c=new P(e),r=new Map;async function d(a){let o=await n({headers:a.headers,query:a.query});if(!o)throw f.unauthorized();return o}function p(a,o=200){return {status:o,body:v(a)}}function u(a,o,m,b){return {status:200,body:B(a,o,m,b)}}r.set("GET /form-types",async a=>{await d(a);let o=await i.getFormTypes();return p(o)}),r.set("GET /form-types/:id",async a=>(await d(a),p(await i.getFormType(a.params.id)))),r.set("POST /form-types",async a=>{await d(a);let o=D.parse(a.body);return p(await i.createFormType(o),201)}),r.set("PUT /form-types/:id",async a=>{await d(a);let o=j.parse(a.body);return p(await i.updateFormType(a.params.id,o))}),r.set("DELETE /form-types/:id",async a=>(await d(a),await i.deleteFormType(a.params.id),p(null,204))),r.set("GET /forms",async a=>{await d(a);let o=R.parse(a.query),{items:m,total:b}=await i.getFormDefinitions(o);return u(m,b,o.page,o.pageSize)}),r.set("GET /forms/:id",async a=>(await d(a),p(await i.getFormDefinition(a.params.id)))),r.set("GET /forms/:id/resolved",async a=>(await d(a),p(await i.getResolvedFormDefinition(a.params.id)))),r.set("POST /forms",async a=>{let o=await d(a),m=V.parse(a.body);return p(await i.createFormDefinition(m,o),201)}),r.set("PUT /forms/:id",async a=>{let o=await d(a),m=U.parse(a.body);return p(await i.updateFormDefinition(a.params.id,m,o))}),r.set("DELETE /forms/:id",async a=>(await d(a),await i.deleteFormDefinition(a.params.id),p(null,204))),r.set("GET /forms/:id/export",async a=>(await d(a),{status:200,body:await i.exportForm(a.params.id)})),r.set("POST /forms/import",async a=>{await d(a);let{json:o,tenantId:m}=a.body,b=await i.importForm(o,m);return p({formId:b},201)}),r.set("POST /forms/:formId/pages",async a=>{await d(a);let o=C.parse(a.body);return p(await i.createFormPage(a.params.formId,o),201)}),r.set("PUT /pages/:id",async a=>{await d(a);let o=H.parse(a.body);return p(await i.updateFormPage(a.params.id,o))}),r.set("DELETE /pages/:id",async a=>(await d(a),await i.deleteFormPage(a.params.id),p(null,204))),r.set("POST /pages/:pageId/rosters",async a=>{await d(a);let o=z.parse(a.body);return p(await i.createFormRoster(a.params.pageId,o),201)}),r.set("PUT /rosters/:id",async a=>{await d(a);let o=q.parse(a.body);return p(await i.updateFormRoster(a.params.id,o))}),r.set("DELETE /rosters/:id",async a=>(await d(a),await i.deleteFormRoster(a.params.id),p(null,204))),r.set("POST /pages/:pageId/variables",async a=>{await d(a);let o=k.parse(a.body);return p(await i.createFormVariable({...o,pageId:a.params.pageId}),201)}),r.set("POST /rosters/:rosterId/variables",async a=>{await d(a);let o=k.parse(a.body);return p(await i.createFormVariable({...o,rosterId:a.params.rosterId}),201)}),r.set("PUT /variables/:id",async a=>{await d(a);let o=J.parse(a.body);return p(await i.updateFormVariable(a.params.id,o))}),r.set("DELETE /variables/:id",async a=>(await d(a),await i.deleteFormVariable(a.params.id),p(null,204))),r.set("GET /forms/:formId/submissions",async a=>{await d(a);let o=R.parse(a.query),{items:m,total:b}=await i.getSubmissions({formId:a.params.formId,...o});return u(m,b,o.page,o.pageSize)}),r.set("GET /submissions/:id",async a=>(await d(a),p(await i.getSubmission(a.params.id)))),r.set("POST /submissions",async a=>{let o=await d(a),m=N.parse(a.body);return p(await i.createSubmission(m,o),201)}),r.set("PUT /submissions/:id",async a=>{let o=await d(a),m=G.parse(a.body);return p(await i.updateSubmission(a.params.id,m,o))}),r.set("GET /scopes",async a=>{let o=await d(a),m=R.parse(a.query),{items:b,total:A}=await c.listScopes({tenantId:m.tenantId,page:m.page,pageSize:m.pageSize},o);return u(b,A,m.page,m.pageSize)}),r.set("GET /scopes/:id",async a=>(await d(a),p(await c.getScopeById(a.params.id)))),r.set("POST /scopes",async a=>{let o=await d(a),m=Y.parse(a.body);return p(await c.createScope(m,o),201)}),r.set("PUT /scopes/:id",async a=>{let o=await d(a),m=Z.parse(a.body);return p(await c.updateScope(a.params.id,m,o))}),r.set("DELETE /scopes/:id",async a=>(await d(a),await c.deleteScope(a.params.id),p(null,204))),r.set("GET /scopes/:scopeId/templates",async a=>{await d(a);let o=R.parse(a.query),{items:m,total:b}=await c.listTemplates(a.params.scopeId,{page:o.page,pageSize:o.pageSize});return u(m,b,o.page,o.pageSize)}),r.set("POST /scopes/:scopeId/templates",async a=>{let o=await d(a),m=K.parse(a.body);return p(await c.createTemplate(a.params.scopeId,m,o),201)}),r.set("GET /templates/:id",async a=>(await d(a),p(await c.getTemplateById(a.params.id)))),r.set("PUT /templates/:id",async a=>{let o=await d(a),m=Q.parse(a.body);return p(await c.updateTemplate(a.params.id,m,o))}),r.set("DELETE /templates/:id",async a=>(await d(a),await c.deleteTemplate(a.params.id),p(null,204)));function g(a,o){for(let[m,b]of r){let[A,ee]=m.split(" ");if(A!==a)continue;let $=ce(ee,o);if($)return {handler:b,params:$}}return null}return {routes:r,handle:async a=>{try{let o=g(a.method,a.path);return o?(a.params=o.params,await o.handler(a)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof f?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(b=>b.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function ce(s,e){let n=s.split("/").filter(Boolean),i=e.split("/").filter(Boolean);if(n.length!==i.length)return null;let c={};for(let r=0;r<n.length;r++){let d=n[r],p=i[r];if(d.startsWith(":"))c[d.slice(1)]=p;else if(d!==p)return null}return c}export{f as ApiError,x as FormService,V as createFormDefinitionSchema,C as createFormPageSchema,z as createFormRosterSchema,de as createFormRouter,D as createFormTypeSchema,k as createFormVariableSchema,N as createSubmissionSchema,M as noAuth,B as paginatedResponse,R as paginationSchema,v as successResponse,U as updateFormDefinitionSchema,H as updateFormPageSchema,q as updateFormRosterSchema,j as updateFormTypeSchema,J as updateFormVariableSchema,G as updateSubmissionSchema};//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|