@msbci/form-server 1.3.2 → 1.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.service.ts","../src/utils/encryption.ts","../src/services/scope.service.ts","../src/services/datasource.service.ts","../src/middleware/auth.middleware.ts","../src/middleware/validation.middleware.ts","../src/create-router.ts"],"names":["ApiError","_ApiError","statusCode","message","errors","successResponse","data","paginatedResponse","total","page","pageSize","toJson","value","fromJson","localizedToDb","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","scopeIds","scopeId","order","dbForm","formId","conditions","pageId","options","templateOverrides","validationRules","dataSourceDependencies","style","defaultValue","sub","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","getPageVariables","roster","getPageRosters","dbRoster","v","rosterId","resolveTemplates","a","b","s","r","templateIds","collectTemplateIds","dbTemplates","templateMap","t","resolveFormTemplates","parseMaybeJson","ALGORITHM","KEY_ENV","IV_BYTES","AUTH_TAG_BYTES","getKey","raw","trimmed","key","encrypt","iv","randomBytes","cipher","createCipheriv","plaintext","ciphertext","authTag","decrypt","encrypted","parts","decipher","createDecipheriv","parsed","err","requireEncryption","DEFAULT_TENANT","localizedFromDb","tenantFromCtx","explicit","ScopeService","encryptedHeaders","isUniqueViolation","updated","row","formCount","templateCount","dataSourceCount","rows","found","scope","ids","headers","DataSourceService","scopes","scopeHeaders","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","localizedSchema","createScopeSchema","updateScopeSchema","VARIABLE_TYPES","createVariableTemplateSchema","updateVariableTemplateSchema","createDataSourceSchema","updateDataSourceSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","initialisedClients","initializeDefaults","createFormRouter","auth","service","scopeService","dataSourceService","routes","withAuth","req","ok","status","paginated","types","matchRoute","method","path","pattern","handler","routeMethod","routePath","matchPath","matched","error","i","actual","patternParts","actualParts","pp","ap"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Standardized API error response.\n */\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n public errors?: string[],\n ) {\n super(message)\n this.name = 'ApiError'\n }\n\n static notFound(message = 'Resource not found') {\n return new ApiError(404, message)\n }\n\n static badRequest(message: string, errors?: string[]) {\n return new ApiError(400, message, errors)\n }\n\n static unauthorized(message = 'Unauthorized') {\n return new ApiError(401, message)\n }\n\n static conflict(message: string) {\n return new ApiError(409, message)\n }\n\n static serviceUnavailable(message: string) {\n return new ApiError(503, message)\n }\n}\n\nexport interface ApiResponse<T = unknown> {\n status: number\n message: string\n data: T\n errors?: string[]\n}\n\nexport function successResponse<T>(data: T, message = 'Success'): ApiResponse<T> {\n return { status: 200, message, data }\n}\n\nexport function paginatedResponse<T>(\n data: T[],\n total: number,\n page: number,\n pageSize: number,\n): ApiResponse<{ items: T[]; total: number; page: number; pageSize: number; totalPages: number }> {\n return {\n status: 200,\n message: 'Success',\n data: {\n items: data,\n total,\n page,\n pageSize,\n totalPages: Math.ceil(total / pageSize),\n },\n }\n}\n","/**\n * Form service — all CRUD operations via Prisma.\n * Framework-agnostic: called by route handlers.\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport {\n serializeForm,\n deserializeForm,\n getPageVariables,\n getPageRosters,\n resolveFormTemplates,\n collectTemplateIds,\n} from '@msbci/form-core'\nimport type {\n IFormDefinition,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\n\n/** JSON serialization helpers (Prisma stores JSON as string in SQLite) */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null): T | undefined {\n if (!value) return undefined\n try { return JSON.parse(value) as T } catch { return undefined }\n}\n\n/**\n * Flattens a `LocalizedString` value to a plain `string` suitable for\n * Prisma's `String` columns. Record-shaped values are JSON-stringified —\n * read-side code can detect the JSON shape and parse back. Plain strings\n * are returned untouched (backward compatible).\n */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\nexport class FormService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── FormType ────────────────────────────\n\n async getFormTypes(tenantId?: string) {\n return this.prisma.formType.findMany({ orderBy: { name: 'asc' } })\n }\n\n async getFormType(id: string) {\n const ft = await this.prisma.formType.findUnique({ where: { id } })\n if (!ft) throw ApiError.notFound('FormType not found')\n return ft\n }\n\n async createFormType(data: { code: string; name: string; description?: string; metadata?: Record<string, unknown> }) {\n return this.prisma.formType.create({\n data: { ...data, metadata: toJson(data.metadata) },\n })\n }\n\n async updateFormType(id: string, data: Partial<{ code: string; name: string; description: string; metadata: Record<string, unknown> }>) {\n const { metadata, ...rest } = data\n return this.prisma.formType.update({\n where: { id },\n data: { ...rest, ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}) },\n })\n }\n\n async deleteFormType(id: string) {\n return this.prisma.formType.delete({ where: { id } })\n }\n\n // ─── FormDefinition ─────────────────────\n\n async getFormDefinitions(params: { page: number; pageSize: number; search?: string; tenantId?: string; scopeId?: string }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\n if (params.scopeId) where['scopes'] = { some: { scopeId: params.scopeId } }\n if (params.search) {\n where['OR'] = [\n { name: { contains: params.search } },\n { code: { contains: params.search } },\n ]\n }\n\n const [items, total] = await Promise.all([\n this.prisma.formDefinition.findMany({\n where: where as any,\n include: { formType: true, _count: { select: { pages: true, submissions: true } } },\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.formDefinition.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getFormDefinition(id: string) {\n const form = await this.prisma.formDefinition.findUnique({\n where: { id },\n include: {\n formType: true,\n scopes: { orderBy: { order: 'asc' } },\n pages: {\n orderBy: { order: 'asc' },\n include: {\n variables: { where: { pageId: { not: null } }, orderBy: { order: 'asc' } },\n rosters: {\n orderBy: { order: 'asc' },\n include: { variables: { orderBy: { order: 'asc' } } },\n },\n },\n },\n },\n })\n if (!form) throw ApiError.notFound('FormDefinition not found')\n return form\n }\n\n async createFormDefinition(data: {\n code: string; name: string; description?: string; version?: string;\n isPublished?: boolean; tenantId?: string; formTypeId?: string;\n scopeIds?: string[];\n metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n const { scopeIds, ...rest } = data\n return this.prisma.formDefinition.create({\n data: {\n ...rest,\n metadata: toJson(rest.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n ...(scopeIds && scopeIds.length > 0\n ? {\n scopes: {\n create: scopeIds.map((scopeId, order) => ({ scopeId, order })),\n },\n }\n : {}),\n },\n })\n }\n\n async updateFormDefinition(id: string, data: Partial<{\n code: string; name: string; description: string; version: string;\n isPublished: boolean; formTypeId: string;\n scopeIds: string[];\n metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, scopeIds, ...rest } = data\n\n // Update scalar / FK fields first.\n await this.prisma.formDefinition.update({\n where: { id },\n data: {\n ...rest,\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n\n // Replace the scope links when an explicit scopeIds array is provided.\n if (scopeIds !== undefined) {\n await this.prisma.formDefinitionScope.deleteMany({ where: { formId: id } })\n if (scopeIds.length > 0) {\n await this.prisma.formDefinitionScope.createMany({\n data: scopeIds.map((scopeId, order) => ({ formId: id, scopeId, order })),\n })\n }\n }\n\n return this.prisma.formDefinition.findUnique({\n where: { id },\n include: { scopes: { orderBy: { order: 'asc' } } },\n })\n }\n\n /**\n * Load a form by id and return it as a fully-resolved `IFormDefinition`\n * (templates applied — Option B). Used by `GET /forms/:id/resolved` and\n * `exportForm`. The original DB-include shape is still available via\n * {@link getFormDefinition}.\n */\n async getResolvedFormDefinition(id: string): Promise<IFormDefinition> {\n const dbForm = await this.getFormDefinition(id)\n return this.dbToFormDefinition(dbForm)\n }\n\n async deleteFormDefinition(id: string) {\n return this.prisma.formDefinition.delete({ where: { id } })\n }\n\n // ─── FormPage ───────────────────────────\n\n async createFormPage(formId: string, data: {\n code: string; name: string; order: number; isRepeatable?: boolean;\n repeatMinInstances?: number; repeatMaxInstances?: number;\n repeatControlVarCode?: string; repeatInstanceLabel?: string;\n conditions?: unknown[]; metadata?: Record<string, unknown>\n }) {\n return this.prisma.formPage.create({\n data: {\n ...data,\n formId,\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormPage(id: string, data: Partial<{\n code: string; name: string; order: number; isRepeatable: boolean;\n repeatMinInstances: number; repeatMaxInstances: number;\n repeatControlVarCode: string; repeatInstanceLabel: string;\n conditions: unknown[]; metadata: Record<string, unknown>\n }>) {\n const { conditions, metadata, ...rest } = data\n return this.prisma.formPage.update({\n where: { id },\n data: {\n ...rest,\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormPage(id: string) {\n return this.prisma.formPage.delete({ where: { id } })\n }\n\n // ─── FormRoster ─────────────────────────\n\n async createFormRoster(pageId: string, data: {\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode?: string; options?: unknown[]; conditions?: unknown[];\n metadata?: Record<string, unknown>\n }) {\n return this.prisma.formRoster.create({\n data: {\n ...data,\n pageId,\n options: toJson(data.options),\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormRoster(id: string, data: Partial<{\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode: string; options: unknown[]; conditions: unknown[];\n metadata: Record<string, unknown>\n }>) {\n const { options, conditions, metadata, ...rest } = data\n return this.prisma.formRoster.update({\n where: { id },\n data: {\n ...rest,\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormRoster(id: string) {\n return this.prisma.formRoster.delete({ where: { id } })\n }\n\n // ─── FormVariable ───────────────────────\n\n async createFormVariable(data: {\n code: string; name: string; type: string; order: number;\n pageId?: string; rosterId?: string;\n isRequired?: boolean; isReadonly?: boolean; isHidden?: boolean;\n defaultValue?: unknown; placeholder?: string; description?: string;\n options?: unknown[]; validationRules?: unknown[]; conditions?: unknown[];\n expression?: string; dataSourceId?: string; dataSourceDependencies?: Record<string, string>;\n style?: unknown; metadata?: Record<string, unknown>;\n templateId?: string; templateOverrides?: Record<string, unknown>\n }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n const { templateOverrides, ...rest } = data\n return this.prisma.formVariable.create({\n data: {\n ...rest,\n defaultValue: data.defaultValue !== undefined ? String(data.defaultValue) : null,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n templateOverrides: toJson(templateOverrides),\n },\n })\n }\n\n async updateFormVariable(id: string, data: Partial<{\n code: string; name: string; type: string; order: number;\n isRequired: boolean; isReadonly: boolean; isHidden: boolean;\n defaultValue: unknown; placeholder: string; description: string;\n options: unknown[]; validationRules: unknown[]; conditions: unknown[];\n expression: string; dataSourceId: string; dataSourceDependencies: Record<string, string>;\n style: unknown; metadata: Record<string, unknown>;\n templateId: string | null; templateOverrides: Record<string, unknown> | null\n }>) {\n const {\n options, validationRules, conditions, dataSourceDependencies,\n style, metadata, defaultValue, templateOverrides, ...rest\n } = data\n return this.prisma.formVariable.update({\n where: { id },\n data: {\n ...rest,\n ...(defaultValue !== undefined ? { defaultValue: String(defaultValue) } : {}),\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(validationRules !== undefined ? { validationRules: toJson(validationRules) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(dataSourceDependencies !== undefined ? { dataSourceDependencies: toJson(dataSourceDependencies) } : {}),\n ...(style !== undefined ? { style: toJson(style) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n ...(templateOverrides !== undefined ? { templateOverrides: toJson(templateOverrides) } : {}),\n },\n })\n }\n\n async deleteFormVariable(id: string) {\n return this.prisma.formVariable.delete({ where: { id } })\n }\n\n // ─── Submission ─────────────────────────\n\n async getSubmissions(params: { formId: string; page: number; pageSize: number; status?: string; tenantId?: string }) {\n const where: Record<string, unknown> = { formId: params.formId }\n if (params.status) where['status'] = params.status\n if (params.tenantId) where['tenantId'] = params.tenantId\n\n const [items, total] = await Promise.all([\n this.prisma.formSubmission.findMany({\n where: where as any,\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { createdAt: 'desc' },\n }),\n this.prisma.formSubmission.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getSubmission(id: string) {\n const sub = await this.prisma.formSubmission.findUnique({ where: { id } })\n if (!sub) throw ApiError.notFound('Submission not found')\n return sub\n }\n\n async createSubmission(data: {\n formId: string; tenantId?: string; status?: string;\n data: Record<string, unknown>; submittedBy?: string; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formSubmission.create({\n data: {\n formId: data.formId,\n tenantId: data.tenantId,\n status: data.status ?? 'draft',\n data: JSON.stringify(data.data),\n submittedBy: data.submittedBy,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n }\n\n async updateSubmission(id: string, data: Partial<{ status: string; data: Record<string, unknown>; metadata: Record<string, unknown> }>, ctx?: IRequestContext) {\n return this.prisma.formSubmission.update({\n where: { id },\n data: {\n ...(data.status ? { status: data.status } : {}),\n ...(data.data ? { data: JSON.stringify(data.data) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n }\n\n // ─── Export / Import ────────────────────\n\n async exportForm(formId: string): Promise<string> {\n const dbForm = await this.getFormDefinition(formId)\n const formDef = await this.dbToFormDefinition(dbForm)\n return serializeForm(formDef)\n }\n\n async importForm(json: string, tenantId?: string): Promise<string> {\n const formDef = deserializeForm(json)\n const created = await this.createFormDefinition({\n code: formDef.code,\n name: localizedToDb(formDef.name) ?? '',\n description: localizedToDb(formDef.description),\n version: formDef.version,\n isPublished: formDef.isPublished,\n tenantId,\n formTypeId: formDef.formTypeId,\n scopeIds: formDef.scopeIds,\n })\n\n for (const page of formDef.pages) {\n const dbPage = await this.createFormPage(created.id, {\n code: page.code,\n name: localizedToDb(page.name) ?? '',\n order: page.order,\n isRepeatable: page.isRepeatable,\n repeatMinInstances: page.repeatConfig?.min,\n repeatMaxInstances: page.repeatConfig?.max,\n repeatControlVarCode: page.repeatConfig?.controlVariableCode,\n repeatInstanceLabel: localizedToDb(page.repeatConfig?.instanceLabel),\n })\n\n for (const variable of getPageVariables(page)) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of getPageRosters(page)) {\n const dbRoster = await this.createFormRoster(dbPage.id, {\n code: roster.code,\n name: localizedToDb(roster.name) ?? '',\n rosterType: roster.rosterType,\n order: roster.order,\n pilotVariableCode: roster.pilotVariableCode,\n options: roster.options,\n })\n\n for (const variable of roster.variables) {\n await this.createFormVariable(this.extractVariableData(variable, undefined, dbRoster.id))\n }\n }\n }\n\n return created.id\n }\n\n /** Extract variable data for createFormVariable (omit `id` to let Prisma generate it) */\n private extractVariableData(v: any, pageId?: string, rosterId?: string) {\n return {\n code: v.code, name: v.name, type: v.type, order: v.order,\n pageId, rosterId,\n isRequired: v.isRequired, isReadonly: v.isReadonly, isHidden: v.isHidden,\n defaultValue: v.defaultValue, placeholder: v.placeholder, description: v.description,\n options: v.options, validationRules: v.validationRules, conditions: v.conditions,\n expression: v.expression, dataSourceId: v.dataSourceId,\n dataSourceDependencies: v.dataSourceDependencies, style: v.style, metadata: v.metadata,\n templateId: v.templateId, templateOverrides: v.templateOverrides,\n }\n }\n\n /**\n * Convert a Prisma DB result to a fully-resolved `IFormDefinition`.\n *\n * Templates referenced by `IFormVariable.templateId` are loaded in a\n * single batch and applied via `resolveFormTemplates` (Option B —\n * in-memory only, no mutation in DB). Pass `resolveTemplates = false`\n * to obtain the raw shape (useful for editor tooling that wants to\n * preserve `templateOverrides`).\n */\n private async dbToFormDefinition(\n dbForm: any,\n resolveTemplates = true,\n ): Promise<IFormDefinition> {\n const scopeIds = Array.isArray(dbForm.scopes)\n ? dbForm.scopes\n .slice()\n .sort((a: any, b: any) => a.order - b.order)\n .map((s: any) => s.scopeId as string)\n : undefined\n\n const form: IFormDefinition = {\n id: dbForm.id,\n code: dbForm.code,\n name: dbForm.name,\n description: dbForm.description ?? undefined,\n version: dbForm.version,\n isPublished: dbForm.isPublished,\n formTypeId: dbForm.formTypeId ?? undefined,\n scopeIds: scopeIds && scopeIds.length > 0 ? scopeIds : undefined,\n metadata: fromJson(dbForm.metadata),\n pages: (dbForm.pages ?? []).map((p: any) => ({\n id: p.id,\n code: p.code,\n name: p.name,\n order: p.order,\n isRepeatable: p.isRepeatable,\n repeatConfig: p.isRepeatable ? {\n min: p.repeatMinInstances ?? undefined,\n max: p.repeatMaxInstances ?? undefined,\n controlVariableCode: p.repeatControlVarCode ?? undefined,\n instanceLabel: p.repeatInstanceLabel ?? undefined,\n } : undefined,\n conditions: fromJson(p.conditions) ?? [],\n variables: (p.variables ?? []).map((v: any) => this.dbToVariable(v)),\n rosters: (p.rosters ?? []).map((r: any) => ({\n id: r.id,\n code: r.code,\n name: r.name,\n rosterType: r.rosterType,\n order: r.order,\n pilotVariableCode: r.pilotVariableCode ?? undefined,\n options: fromJson(r.options),\n conditions: fromJson(r.conditions) ?? [],\n variables: (r.variables ?? []).map((v: any) => this.dbToVariable(v)),\n })),\n })),\n }\n\n if (!resolveTemplates) return form\n\n const templateIds = collectTemplateIds(form)\n if (templateIds.size === 0) return form\n\n const dbTemplates = await this.prisma.variableTemplate.findMany({\n where: { id: { in: [...templateIds] } },\n })\n const templateMap = new Map<string, IVariableTemplate>(\n dbTemplates.map((t) => [t.id, this.dbToTemplate(t)]),\n )\n return resolveFormTemplates(form, templateMap)\n }\n\n private dbToVariable(v: any) {\n return {\n id: v.id,\n code: v.code,\n name: v.name,\n type: v.type,\n order: v.order,\n isRequired: v.isRequired,\n isReadonly: v.isReadonly,\n isHidden: v.isHidden,\n defaultValue: v.defaultValue ?? undefined,\n placeholder: v.placeholder ?? undefined,\n description: v.description ?? undefined,\n options: fromJson(v.options),\n validationRules: fromJson(v.validationRules),\n conditions: fromJson(v.conditions),\n expression: v.expression ?? undefined,\n dataSourceId: v.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(v.dataSourceDependencies),\n style: fromJson(v.style),\n metadata: fromJson(v.metadata),\n templateId: v.templateId ?? undefined,\n templateOverrides: fromJson(v.templateOverrides),\n }\n }\n\n /**\n * Convert a Prisma VariableTemplate row to the domain type. Duplicated\n * locally (kept in sync with `ScopeService.dbToTemplate`) to avoid an\n * import cycle between the two services.\n */\n private dbToTemplate(t: any): IVariableTemplate {\n return {\n id: t.id,\n code: t.code,\n name: parseMaybeJson(t.name) ?? '',\n scopeId: t.scopeId,\n tenantId: t.tenantId ?? 'default',\n variableType: t.variableType as VariableType,\n description: parseMaybeJson(t.description),\n placeholder: parseMaybeJson(t.placeholder),\n isRequired: t.isRequired ?? undefined,\n isReadonly: t.isReadonly ?? undefined,\n isHidden: t.isHidden ?? undefined,\n options: fromJson(t.options),\n validationRules: fromJson(t.validationRules),\n conditions: fromJson(t.conditions),\n expression: t.expression ?? undefined,\n dataSourceId: t.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(t.dataSourceDependencies),\n style: fromJson(t.style),\n metadata: fromJson(t.metadata),\n createdAt: t.createdAt instanceof Date ? t.createdAt.toISOString() : t.createdAt,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : t.updatedAt,\n createdBy: t.createdBy ?? undefined,\n updatedBy: t.updatedBy ?? undefined,\n }\n }\n}\n\n/** Best-effort decoder for LocalizedString columns (object or plain). */\nfunction parseMaybeJson(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n","/**\n * AES-256-GCM helpers for header encryption (v1.3.2+).\n *\n * Threat model: the server stores third-party API credentials (bearer\n * tokens, API keys) that must not leak in DB backups or admin tools.\n * Headers are encrypted at write time with `MOSOBI_ENCRYPTION_KEY`\n * (32-byte base64 or hex) and decrypted only when the renderer asks\n * for them via the aggregated `/forms/:id/datasources` endpoint.\n *\n * Format: `base64(iv):base64(authTag):base64(ciphertext)` — 12-byte\n * IV (GCM-recommended), 16-byte auth tag. The IV is fresh per call,\n * never reused.\n *\n * Reads tolerate a missing key (returns `{}` + console warning).\n * Writes always require the key — `requireEncryption()` throws 503.\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto'\nimport { ApiError } from '../middleware/error.middleware'\n\nconst ALGORITHM = 'aes-256-gcm'\nconst KEY_ENV = 'MOSOBI_ENCRYPTION_KEY'\nconst IV_BYTES = 12\nconst AUTH_TAG_BYTES = 16\n\n/** Decode the env-provided key. Supports base64 and hex; must yield 32 bytes. */\nfunction getKey(): Buffer {\n const raw = process.env[KEY_ENV]\n if (!raw) {\n throw ApiError.serviceUnavailable(\n `${KEY_ENV} is not configured — header encryption is unavailable`,\n )\n }\n const trimmed = raw.trim()\n // Try base64 first (most common when generated via `openssl rand -base64 32`).\n let key: Buffer\n if (/^[A-Za-z0-9+/=]+$/.test(trimmed)) {\n key = Buffer.from(trimmed, 'base64')\n if (key.length === 32) return key\n }\n if (/^[0-9a-fA-F]+$/.test(trimmed) && trimmed.length === 64) {\n return Buffer.from(trimmed, 'hex')\n }\n throw ApiError.serviceUnavailable(\n `${KEY_ENV} must be 32 bytes (base64 or 64-char hex)`,\n )\n}\n\n/** True when the env key is set and well-formed. Never throws. */\nexport function isEncryptionAvailable(): boolean {\n try {\n getKey()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Encrypts a header map. The caller MUST have validated availability\n * via `requireEncryption()` first; otherwise the throw is opaque to\n * the HTTP layer.\n */\nexport function encrypt(value: Record<string, string>): string {\n const key = getKey()\n const iv = randomBytes(IV_BYTES)\n const cipher = createCipheriv(ALGORITHM, key, iv)\n const plaintext = Buffer.from(JSON.stringify(value), 'utf8')\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()])\n const authTag = cipher.getAuthTag()\n return [\n iv.toString('base64'),\n authTag.toString('base64'),\n ciphertext.toString('base64'),\n ].join(':')\n}\n\n/**\n * Decrypts a payload produced by `encrypt()`. Returns `{}` and logs a\n * warning if the key is unavailable or the cipher text is malformed —\n * the renderer would rather see no headers than crash the form.\n */\nexport function decrypt(encrypted: string): Record<string, string> {\n let key: Buffer\n try {\n key = getKey()\n } catch {\n // eslint-disable-next-line no-console\n console.warn(\n `[form-server] ${KEY_ENV} is missing — encrypted headers returned as {}`,\n )\n return {}\n }\n\n const parts = encrypted.split(':')\n if (parts.length !== 3) {\n // eslint-disable-next-line no-console\n console.warn('[form-server] encrypted header payload is malformed — returning {}')\n return {}\n }\n\n try {\n const iv = Buffer.from(parts[0]!, 'base64')\n const authTag = Buffer.from(parts[1]!, 'base64')\n const ciphertext = Buffer.from(parts[2]!, 'base64')\n if (iv.length !== IV_BYTES || authTag.length !== AUTH_TAG_BYTES) {\n // eslint-disable-next-line no-console\n console.warn('[form-server] encrypted header IV/tag length mismatch — returning {}')\n return {}\n }\n const decipher = createDecipheriv(ALGORITHM, key, iv)\n decipher.setAuthTag(authTag)\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]).toString('utf8')\n const parsed = JSON.parse(plaintext) as Record<string, string>\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[form-server] failed to decrypt headers — returning {}', err)\n return {}\n }\n}\n\n/**\n * Guard for write endpoints. Throws `ApiError(503)` if the env key is\n * missing or malformed — surfaced to the client so the editor can warn.\n */\nexport function requireEncryption(): void {\n getKey()\n}\n","/**\n * Scope + VariableTemplate service — Prisma CRUD operations.\n *\n * Both resources are scoped by tenant. `tenantId` falls back to\n * `'default'` when the caller does not supply one (single-tenant\n * deployments stay transparent).\n *\n * Identity rules:\n * - `Scope.code` is unique within a tenant.\n * - `VariableTemplate.code` is unique within a scope.\n * - `code` and `name` of a template are IMMUTABLE after creation\n * (enforced here defensively in addition to the Zod schemas).\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport type {\n IScope,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\nimport { decrypt, encrypt, requireEncryption } from '../utils/encryption'\n\nconst DEFAULT_TENANT = 'default'\n\n/** JSON serialization helpers (Prisma stores JSON as TEXT in SQLite). */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\n if (value === null || value === undefined) return undefined\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/** Flatten a LocalizedString to a plain DB column. */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\n/** Inverse: parse a DB string back into a LocalizedString (object or plain). */\nfunction localizedFromDb(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n\nfunction tenantFromCtx(ctx?: IRequestContext, explicit?: string): string {\n return explicit ?? ctx?.tenantId ?? DEFAULT_TENANT\n}\n\nexport interface ScopeInput {\n code: string\n name: LocalizedString\n description?: LocalizedString\n tenantId?: string\n metadata?: Record<string, unknown>\n /**\n * Optional scope-level headers. Encrypted before persistence.\n * Triggers `requireEncryption()` — 503 if MOSOBI_ENCRYPTION_KEY missing.\n */\n headers?: Record<string, string>\n}\n\nexport interface ScopeUpdateInput {\n name?: LocalizedString\n description?: LocalizedString\n metadata?: Record<string, unknown>\n /** See {@link ScopeInput.headers}. */\n headers?: Record<string, string>\n}\n\nexport interface VariableTemplateInput {\n code: string\n name: LocalizedString\n variableType: VariableType\n tenantId?: string\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\n/** Update payload — `code` and `name` are intentionally excluded. */\nexport interface VariableTemplateUpdateInput {\n variableType?: VariableType\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\nexport interface PaginationInput {\n page?: number\n pageSize?: number\n}\n\nexport class ScopeService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── Scope CRUD ─────────────────────────\n\n async createScope(data: ScopeInput, ctx?: IRequestContext): Promise<IScope> {\n const tenantId = tenantFromCtx(ctx, data.tenantId)\n // Encrypt before INSERT — failing here aborts the whole operation\n // (no scope row created without the key when headers are requested).\n let encryptedHeaders: string | null = null\n if (data.headers !== undefined) {\n requireEncryption()\n encryptedHeaders = encrypt(data.headers)\n }\n try {\n const created = await this.prisma.scope.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n description: localizedToDb(data.description),\n tenantId,\n metadata: toJson(data.metadata),\n headers: encryptedHeaders,\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Scope code \"${data.code}\" already exists for tenant \"${tenantId}\"`)\n }\n throw err\n }\n }\n\n async updateScope(id: string, data: ScopeUpdateInput, ctx?: IRequestContext): Promise<IScope> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n let encryptedHeaders: string | null | undefined\n if (data.headers !== undefined) {\n requireEncryption()\n encryptedHeaders = encrypt(data.headers)\n }\n\n const updated = await this.prisma.scope.update({\n where: { id },\n data: {\n ...(data.name !== undefined ? { name: localizedToDb(data.name) ?? '' } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n ...(encryptedHeaders !== undefined ? { headers: encryptedHeaders } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(updated)\n }\n\n /**\n * Returns the decrypted headers of a scope, or `{}` when none are set\n * or when the encryption key is missing (warning logged from\n * `decrypt`). Never throws — reads must stay tolerant.\n */\n async getScopeHeaders(id: string): Promise<Record<string, string>> {\n const row = await this.prisma.scope.findUnique({\n where: { id },\n select: { headers: true },\n })\n if (!row || !row.headers) return {}\n return decrypt(row.headers)\n }\n\n /**\n * Hard-delete a scope. Refuses with 409 when at least one form, one\n * template OR one data source still references it (no silent cascade\n * — admins explicitly clean up first).\n */\n async deleteScope(id: string): Promise<void> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n const [formCount, templateCount, dataSourceCount] = await Promise.all([\n // Form ↔ scope is now a pivot table — count rows that pin this scope.\n this.prisma.formDefinitionScope.count({ where: { scopeId: id } }),\n this.prisma.variableTemplate.count({ where: { scopeId: id } }),\n this.prisma.dataSourceConfig.count({ where: { scopeId: id } }),\n ])\n\n if (formCount > 0 || templateCount > 0 || dataSourceCount > 0) {\n throw ApiError.conflict(\n `Scope is in use (forms: ${formCount}, templates: ${templateCount}, dataSources: ${dataSourceCount}). Remove dependents first.`,\n )\n }\n\n await this.prisma.scope.delete({ where: { id } })\n }\n\n async listScopes(params: { tenantId?: string } & PaginationInput, ctx?: IRequestContext) {\n const tenantId = tenantFromCtx(ctx, params.tenantId)\n const page = params.page ?? 1\n const pageSize = params.pageSize ?? 50\n\n const [rows, total] = await Promise.all([\n this.prisma.scope.findMany({\n where: { tenantId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.scope.count({ where: { tenantId } }),\n ])\n\n return { items: rows.map((r) => this.dbToScope(r)), total }\n }\n\n async getScopeById(id: string): Promise<IScope> {\n const found = await this.prisma.scope.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Scope not found')\n return this.dbToScope(found)\n }\n\n // ─── VariableTemplate CRUD ─────────────\n\n async createTemplate(\n scopeId: string,\n data: VariableTemplateInput,\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\n if (!scope) throw ApiError.notFound('Scope not found')\n\n const tenantId = tenantFromCtx(ctx, data.tenantId) || scope.tenantId\n\n try {\n const created = await this.prisma.variableTemplate.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n scopeId,\n tenantId,\n variableType: data.variableType,\n description: localizedToDb(data.description),\n placeholder: localizedToDb(data.placeholder),\n isRequired: data.isRequired ?? false,\n isReadonly: data.isReadonly ?? false,\n isHidden: data.isHidden ?? false,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n expression: data.expression,\n dataSourceId: data.dataSourceId,\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Template code \"${data.code}\" already exists in this scope`)\n }\n throw err\n }\n }\n\n async updateTemplate(\n id: string,\n data: VariableTemplateUpdateInput & { code?: never; name?: never },\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n // Defensive guard — Zod already strips these, but enforce here too\n // so direct service callers (tests, scripts) cannot bypass the rule.\n if ('code' in data || 'name' in data) {\n throw ApiError.badRequest('Template code and name are immutable')\n }\n\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n\n const updated = await this.prisma.variableTemplate.update({\n where: { id },\n data: {\n ...(data.variableType !== undefined ? { variableType: data.variableType } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.placeholder !== undefined ? { placeholder: localizedToDb(data.placeholder) } : {}),\n ...(data.isRequired !== undefined ? { isRequired: data.isRequired } : {}),\n ...(data.isReadonly !== undefined ? { isReadonly: data.isReadonly } : {}),\n ...(data.isHidden !== undefined ? { isHidden: data.isHidden } : {}),\n ...(data.options !== undefined ? { options: toJson(data.options) } : {}),\n ...(data.validationRules !== undefined ? { validationRules: toJson(data.validationRules) } : {}),\n ...(data.conditions !== undefined ? { conditions: toJson(data.conditions) } : {}),\n ...(data.expression !== undefined ? { expression: data.expression } : {}),\n ...(data.dataSourceId !== undefined ? { dataSourceId: data.dataSourceId } : {}),\n ...(data.dataSourceDependencies !== undefined\n ? { dataSourceDependencies: toJson(data.dataSourceDependencies) }\n : {}),\n ...(data.style !== undefined ? { style: toJson(data.style) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(updated)\n }\n\n async deleteTemplate(id: string): Promise<void> {\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n await this.prisma.variableTemplate.delete({ where: { id } })\n }\n\n async listTemplates(scopeId: string, params?: PaginationInput) {\n const page = params?.page ?? 1\n const pageSize = params?.pageSize ?? 100\n\n const [rows, total] = await Promise.all([\n this.prisma.variableTemplate.findMany({\n where: { scopeId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.variableTemplate.count({ where: { scopeId } }),\n ])\n\n return { items: rows.map((r) => this.dbToTemplate(r)), total }\n }\n\n async getTemplateById(id: string): Promise<IVariableTemplate> {\n const found = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Template not found')\n return this.dbToTemplate(found)\n }\n\n async getTemplatesByIds(ids: string[]): Promise<IVariableTemplate[]> {\n if (ids.length === 0) return []\n const rows = await this.prisma.variableTemplate.findMany({ where: { id: { in: ids } } })\n return rows.map((r) => this.dbToTemplate(r))\n }\n\n // ─── DB ↔ domain mappers ───────────────\n\n private dbToScope(row: any): IScope {\n // Headers are decrypted at the boundary. `decrypt()` already returns\n // `{}` (with a console.warn) when the key is missing, so the read\n // path never throws — the editor can still display the scope.\n const headers = row.headers ? decrypt(row.headers) : undefined\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n description: localizedFromDb(row.description),\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n metadata: fromJson(row.metadata),\n headers,\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n\n private dbToTemplate(row: any): IVariableTemplate {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n scopeId: row.scopeId,\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n variableType: row.variableType as VariableType,\n description: localizedFromDb(row.description),\n placeholder: localizedFromDb(row.placeholder),\n isRequired: row.isRequired ?? undefined,\n isReadonly: row.isReadonly ?? undefined,\n isHidden: row.isHidden ?? undefined,\n options: fromJson(row.options),\n validationRules: fromJson(row.validationRules),\n conditions: fromJson(row.conditions),\n expression: row.expression ?? undefined,\n dataSourceId: row.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(row.dataSourceDependencies),\n style: fromJson(row.style),\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n}\n\n/** Recognise Prisma P2002 (unique constraint) without bringing in the runtime. */\nfunction isUniqueViolation(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n (err as { code?: string }).code === 'P2002'\n )\n}\n","/**\n * DataSourceConfig service — CRUD + aggregated lookup for renderers.\n *\n * Each `DataSourceConfig` belongs to a `Scope`. Headers are encrypted at\n * write time (`requireEncryption()` → 503 if MOSOBI_ENCRYPTION_KEY is\n * unset). Reads are tolerant: missing key returns `{}` headers with a\n * warning log so the renderer keeps rendering.\n *\n * The aggregated endpoint `getDataSourcesByScopeIds` is the heart of the\n * v1.3.2 wiring — one call returns every config a form needs plus the\n * decrypted scope-level headers, so the renderer never hits the DB.\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport type {\n IDataSourceConfig,\n IScopeHeaders,\n LocalizedString,\n} from '@msbci/form-core'\nimport { decrypt, encrypt, requireEncryption } from '../utils/encryption'\n\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\n if (value === null || value === undefined) return undefined\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\nfunction localizedToDb(value: LocalizedString | undefined): string {\n if (value === undefined || value === null) return ''\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\nfunction localizedFromDb(value: string | null | undefined): LocalizedString {\n if (value === null || value === undefined) return ''\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n\nexport interface DataSourceInput {\n code: string\n name: LocalizedString\n url: string\n method?: 'GET' | 'POST'\n queryParam?: string\n valueField: string\n labelField: string\n headersOverride?: Record<string, string>\n dependencies?: Record<string, string>\n metadata?: Record<string, unknown>\n}\n\nexport type DataSourceUpdateInput = Partial<DataSourceInput>\n\nexport interface PaginationInput {\n page?: number\n pageSize?: number\n}\n\nexport class DataSourceService {\n constructor(private prisma: PrismaClient) {}\n\n async createDataSource(\n scopeId: string,\n data: DataSourceInput,\n ctx?: IRequestContext,\n ): Promise<IDataSourceConfig> {\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\n if (!scope) throw ApiError.notFound('Scope not found')\n\n // Encrypt before INSERT — abort if the key is missing.\n let encryptedHeaders: string | null = null\n if (data.headersOverride !== undefined) {\n requireEncryption()\n encryptedHeaders = encrypt(data.headersOverride)\n }\n\n try {\n const created = await this.prisma.dataSourceConfig.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name),\n scopeId,\n url: data.url,\n method: data.method ?? 'GET',\n queryParam: data.queryParam ?? 'q',\n valueField: data.valueField,\n labelField: data.labelField,\n headersOverride: encryptedHeaders,\n dependencies: toJson(data.dependencies),\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToConfig(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(\n `DataSource code \"${data.code}\" already exists in this scope`,\n )\n }\n throw err\n }\n }\n\n async updateDataSource(\n id: string,\n data: DataSourceUpdateInput,\n ctx?: IRequestContext,\n ): Promise<IDataSourceConfig> {\n const existing = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('DataSource not found')\n\n let encryptedHeaders: string | null | undefined\n if (data.headersOverride !== undefined) {\n requireEncryption()\n encryptedHeaders = encrypt(data.headersOverride)\n }\n\n const updated = await this.prisma.dataSourceConfig.update({\n where: { id },\n data: {\n ...(data.code !== undefined ? { code: data.code } : {}),\n ...(data.name !== undefined ? { name: localizedToDb(data.name) } : {}),\n ...(data.url !== undefined ? { url: data.url } : {}),\n ...(data.method !== undefined ? { method: data.method } : {}),\n ...(data.queryParam !== undefined ? { queryParam: data.queryParam } : {}),\n ...(data.valueField !== undefined ? { valueField: data.valueField } : {}),\n ...(data.labelField !== undefined ? { labelField: data.labelField } : {}),\n ...(encryptedHeaders !== undefined ? { headersOverride: encryptedHeaders } : {}),\n ...(data.dependencies !== undefined ? { dependencies: toJson(data.dependencies) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToConfig(updated)\n }\n\n async deleteDataSource(id: string): Promise<void> {\n const existing = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('DataSource not found')\n await this.prisma.dataSourceConfig.delete({ where: { id } })\n }\n\n async listDataSources(scopeId: string, params?: PaginationInput) {\n const page = params?.page ?? 1\n const pageSize = params?.pageSize ?? 100\n\n const [rows, total] = await Promise.all([\n this.prisma.dataSourceConfig.findMany({\n where: { scopeId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.dataSourceConfig.count({ where: { scopeId } }),\n ])\n\n return { items: rows.map((r) => this.dbToConfig(r)), total }\n }\n\n async getDataSourceById(id: string): Promise<IDataSourceConfig> {\n const found = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('DataSource not found')\n return this.dbToConfig(found)\n }\n\n /**\n * Aggregated lookup for the renderer.\n * One call → every config a form needs, plus the decrypted scope-level\n * headers. Order of scopes is the caller's responsibility (the renderer\n * already has `form.scopeIds` in priority order).\n */\n async getDataSourcesByScopeIds(\n scopeIds: string[],\n ): Promise<{ items: IDataSourceConfig[]; scopeHeaders: IScopeHeaders[] }> {\n if (scopeIds.length === 0) return { items: [], scopeHeaders: [] }\n\n const [rows, scopes] = await Promise.all([\n this.prisma.dataSourceConfig.findMany({\n where: { scopeId: { in: scopeIds } },\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.scope.findMany({\n where: { id: { in: scopeIds } },\n select: { id: true, headers: true },\n }),\n ])\n\n const scopeHeaders: IScopeHeaders[] = scopes.map((s) => ({\n scopeId: s.id,\n headers: s.headers ? decrypt(s.headers) : {},\n }))\n\n return { items: rows.map((r) => this.dbToConfig(r)), scopeHeaders }\n }\n\n private dbToConfig(row: any): IDataSourceConfig {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name),\n scopeId: row.scopeId,\n url: row.url,\n method: (row.method ?? 'GET') as 'GET' | 'POST',\n queryParam: row.queryParam ?? undefined,\n valueField: row.valueField,\n labelField: row.labelField,\n headersOverride: row.headersOverride ? decrypt(row.headersOverride) : undefined,\n dependencies: fromJson(row.dependencies),\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n}\n\nfunction isUniqueViolation(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n (err as { code?: string }).code === 'P2002'\n )\n}\n","/**\n * Auth middleware — injectable hook for the host application.\n *\n * The package provides NO auth logic. The host app configures\n * an auth handler that is called before every route.\n */\n\n/** Request context passed to route handlers */\nexport interface IRequestContext {\n /** Authenticated user ID (set by auth middleware) */\n userId?: string\n /** Tenant ID (for multi-tenant setups) */\n tenantId?: string\n /** Additional context from the host app */\n extra?: Record<string, unknown>\n}\n\n/** Auth middleware function signature */\nexport type AuthMiddleware = (\n req: { headers: Record<string, string | string[] | undefined>; query: Record<string, string | undefined> },\n) => Promise<IRequestContext | null>\n\n/** Default auth — no authentication, returns empty context */\nexport const noAuth: AuthMiddleware = async () => ({})\n","/**\n * Zod validation schemas for all API inputs.\n */\n\nimport { z } from 'zod'\n\n// ─── FormType ─────────────────────────────────────\n\nexport const createFormTypeSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormTypeSchema = createFormTypeSchema.partial()\n\n// ─── FormDefinition ───────────────────────────────\n\nexport const createFormDefinitionSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n version: z.string().default('1.0.0'),\n isPublished: z.boolean().default(false),\n tenantId: z.string().optional(),\n formTypeId: z.string().optional(),\n scopeIds: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormDefinitionSchema = createFormDefinitionSchema.partial()\n\n// ─── FormPage ─────────────────────────────────────\n\nexport const createFormPageSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n order: z.number().int().min(0),\n isRepeatable: z.boolean().default(false),\n repeatMinInstances: z.number().int().min(0).optional(),\n repeatMaxInstances: z.number().int().min(1).optional(),\n repeatControlVarCode: z.string().optional(),\n repeatInstanceLabel: z.string().optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormPageSchema = createFormPageSchema.partial()\n\n// ─── FormRoster ───────────────────────────────────\n\nexport const createFormRosterSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n rosterType: z.enum(['check', 'list', 'collection', 'collection_extend']),\n order: z.number().int().min(0),\n pilotVariableCode: z.string().optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormRosterSchema = createFormRosterSchema.partial()\n\n// ─── FormVariable ─────────────────────────────────\n\nexport const createFormVariableSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n type: z.string().min(1),\n order: z.number().int().min(0),\n isRequired: z.boolean().default(false),\n isReadonly: z.boolean().default(false),\n isHidden: z.boolean().default(false),\n defaultValue: z.unknown().optional(),\n placeholder: z.string().optional(),\n description: z.string().max(1000).optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: z.string() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n templateId: z.string().optional(),\n templateOverrides: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormVariableSchema = createFormVariableSchema.partial()\n\n// ─── Scope ────────────────────────────────────────\n\nconst localizedSchema = z.union([z.string(), z.record(z.string())])\n\nexport const createScopeSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n description: localizedSchema.optional(),\n tenantId: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n /** Scope-level headers — encrypted server-side (requires MOSOBI_ENCRYPTION_KEY). */\n headers: z.record(z.string()).optional(),\n})\n\n/**\n * Update payload for a scope. `code` is immutable to keep template\n * references stable; `name`, `description` and `headers` remain editable.\n */\nexport const updateScopeSchema = z.object({\n name: localizedSchema.optional(),\n description: localizedSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n headers: z.record(z.string()).optional(),\n})\n\n// ─── VariableTemplate ────────────────────────────\n\nconst VARIABLE_TYPES = [\n 'text', 'textarea', 'number', 'date', 'datetime', 'time',\n 'select', 'multiselect', 'checkbox', 'radio', 'file', 'image',\n 'email', 'gps', 'rating', 'calculated', 'hidden', 'label',\n 'panel', 'richtext', 'listradio', 'photo',\n] as const\n\nexport const createVariableTemplateSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n variableType: z.enum(VARIABLE_TYPES),\n tenantId: z.string().optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/**\n * Update payload — `code` and `name` are intentionally absent (immutable).\n * Zod `.strict()` would reject unknown keys; we use `.strip()` (the default)\n * so callers that forward extra fields are tolerated. The service still\n * guards against `code`/`name` defensively.\n */\nexport const updateVariableTemplateSchema = z.object({\n variableType: z.enum(VARIABLE_TYPES).optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n}).strict()\n\n// ─── DataSourceConfig ────────────────────────────\n\nexport const createDataSourceSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n url: z.string().url(),\n method: z.enum(['GET', 'POST']).default('GET'),\n queryParam: z.string().default('q'),\n valueField: z.string().min(1),\n labelField: z.string().min(1),\n /** Per-source headers — encrypted server-side (requires MOSOBI_ENCRYPTION_KEY). */\n headersOverride: z.record(z.string()).optional(),\n /** URL query param name → variable code mapping. */\n dependencies: z.record(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/** Partial update — every field is optional, `code` is immutable in practice. */\nexport const updateDataSourceSchema = createDataSourceSchema.partial()\n\n// ─── FormSubmission ───────────────────────────────\n\nexport const createSubmissionSchema = z.object({\n formId: z.string().min(1),\n tenantId: z.string().optional(),\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).default('draft'),\n data: z.record(z.unknown()),\n submittedBy: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateSubmissionSchema = z.object({\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).optional(),\n data: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n// ─── Pagination ───────────────────────────────────\n\nexport const paginationSchema = z.object({\n page: z.coerce.number().int().min(1).default(1),\n pageSize: z.coerce.number().int().min(1).max(100).default(20),\n search: z.string().optional(),\n tenantId: z.string().optional(),\n})\n","/**\n * createFormRouter — framework-agnostic route definitions.\n *\n * Returns a set of route handlers that can be mounted on:\n * - Express: app.use('/api/forms', createFormRouter(prisma).expressRouter())\n * - Fastify: app.register(createFormRouter(prisma).fastifyPlugin)\n * - Next.js: export const GET/POST = createFormRouter(prisma).nextHandler\n *\n * For simplicity, we return plain handler functions.\n * The host app mounts them using its own framework.\n */\n\nimport type { PrismaClient } from '../generated/prisma'\nimport { FormService } from './services/form.service'\nimport { ScopeService } from './services/scope.service'\nimport { DataSourceService } from './services/datasource.service'\nimport type { AuthMiddleware, IRequestContext } from './middleware/auth.middleware'\nimport { noAuth } from './middleware/auth.middleware'\nimport { ApiError, successResponse, paginatedResponse } from './middleware/error.middleware'\nimport {\n createFormTypeSchema, updateFormTypeSchema,\n createFormDefinitionSchema, updateFormDefinitionSchema,\n createFormPageSchema, updateFormPageSchema,\n createFormRosterSchema, updateFormRosterSchema,\n createFormVariableSchema, updateFormVariableSchema,\n createSubmissionSchema, updateSubmissionSchema,\n createScopeSchema, updateScopeSchema,\n createVariableTemplateSchema, updateVariableTemplateSchema,\n createDataSourceSchema, updateDataSourceSchema,\n paginationSchema,\n} from './middleware/validation.middleware'\n\nexport interface FormRouterOptions {\n prisma: PrismaClient\n auth?: AuthMiddleware\n}\n\n/** A framework-agnostic request object */\nexport interface RouteRequest {\n method: string\n path: string\n params: Record<string, string>\n query: Record<string, string | undefined>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\n/** A framework-agnostic response */\nexport interface RouteResponse {\n status: number\n body: unknown\n}\n\ntype RouteHandler = (req: RouteRequest) => Promise<RouteResponse>\n\nexport interface FormRouter {\n /** Handle a request — match path and method, return response */\n handle: (req: RouteRequest) => Promise<RouteResponse>\n /** All registered route handlers for advanced usage */\n routes: Map<string, RouteHandler>\n}\n\n/**\n * Tracks Prisma clients that have already had their default scope provisioned.\n * Kept module-scope so re-instantiating `createFormRouter` with the same\n * client is a cheap no-op. `WeakSet` lets the entries disappear if the\n * client is garbage-collected (tests that spin up disposable clients).\n */\nconst initialisedClients = new WeakSet<PrismaClient>()\n\n/**\n * Ensure the implicit `tenantId='default'` ships with at least one scope\n * (`code='default'`) so a fresh deployment is usable out of the box.\n *\n * The whole call is fire-and-forget: failures are logged but do not block\n * `createFormRouter`. The upsert is idempotent (relies on the\n * `@@unique([code, tenantId])` constraint), so concurrent boots are safe.\n */\nasync function initializeDefaults(prisma: PrismaClient): Promise<void> {\n await prisma.scope.upsert({\n where: { code_tenantId: { code: 'default', tenantId: 'default' } },\n update: {},\n create: {\n code: 'default',\n name: JSON.stringify({ fr: 'Scope par défaut', en: 'Default Scope' }),\n tenantId: 'default',\n },\n })\n}\n\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n\n if (!initialisedClients.has(prisma)) {\n initialisedClients.add(prisma)\n // Opportunistic: never block router construction. Errors (DB not\n // reachable yet at boot, etc.) surface in the logs but the router\n // remains fully functional for routes that don't need the default.\n initializeDefaults(prisma).catch((err) => {\n console.error('[form-server] initializeDefaults failed:', err)\n })\n }\n\n const service = new FormService(prisma)\n const scopeService = new ScopeService(prisma)\n const dataSourceService = new DataSourceService(prisma)\n const routes = new Map<string, RouteHandler>()\n\n async function withAuth(req: RouteRequest): Promise<IRequestContext> {\n const ctx = await auth({ headers: req.headers as any, query: req.query as any })\n if (!ctx) throw ApiError.unauthorized()\n return ctx\n }\n\n function ok(data: unknown, status = 200): RouteResponse {\n return { status, body: successResponse(data) }\n }\n\n function paginated(items: unknown[], total: number, page: number, pageSize: number): RouteResponse {\n return { status: 200, body: paginatedResponse(items, total, page, pageSize) }\n }\n\n // ─── FormType routes ────────────────────\n\n routes.set('GET /form-types', async (req) => {\n await withAuth(req)\n const types = await service.getFormTypes()\n return ok(types)\n })\n\n routes.set('GET /form-types/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormType(req.params['id']!))\n })\n\n routes.set('POST /form-types', async (req) => {\n await withAuth(req)\n const data = createFormTypeSchema.parse(req.body)\n return ok(await service.createFormType(data), 201)\n })\n\n routes.set('PUT /form-types/:id', async (req) => {\n await withAuth(req)\n const data = updateFormTypeSchema.parse(req.body)\n return ok(await service.updateFormType(req.params['id']!, data))\n })\n\n routes.set('DELETE /form-types/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormType(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormDefinition routes ──────────────\n\n routes.set('GET /forms', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getFormDefinitions(params)\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /forms/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormDefinition(req.params['id']!))\n })\n\n routes.set('GET /forms/:id/resolved', async (req) => {\n await withAuth(req)\n return ok(await service.getResolvedFormDefinition(req.params['id']!))\n })\n\n routes.set('POST /forms', async (req) => {\n const ctx = await withAuth(req)\n const data = createFormDefinitionSchema.parse(req.body)\n return ok(await service.createFormDefinition(data, ctx), 201)\n })\n\n routes.set('PUT /forms/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateFormDefinitionSchema.parse(req.body)\n return ok(await service.updateFormDefinition(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /forms/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormDefinition(req.params['id']!)\n return ok(null, 204)\n })\n\n routes.set('GET /forms/:id/export', async (req) => {\n await withAuth(req)\n const json = await service.exportForm(req.params['id']!)\n return { status: 200, body: json }\n })\n\n routes.set('POST /forms/import', async (req) => {\n await withAuth(req)\n const { json, tenantId } = req.body as { json: string; tenantId?: string }\n const formId = await service.importForm(json, tenantId)\n return ok({ formId }, 201)\n })\n\n // ─── FormPage routes ────────────────────\n\n routes.set('POST /forms/:formId/pages', async (req) => {\n await withAuth(req)\n const data = createFormPageSchema.parse(req.body)\n return ok(await service.createFormPage(req.params['formId']!, data), 201)\n })\n\n routes.set('PUT /pages/:id', async (req) => {\n await withAuth(req)\n const data = updateFormPageSchema.parse(req.body)\n return ok(await service.updateFormPage(req.params['id']!, data))\n })\n\n routes.set('DELETE /pages/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormPage(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormRoster routes ──────────────────\n\n routes.set('POST /pages/:pageId/rosters', async (req) => {\n await withAuth(req)\n const data = createFormRosterSchema.parse(req.body)\n return ok(await service.createFormRoster(req.params['pageId']!, data), 201)\n })\n\n routes.set('PUT /rosters/:id', async (req) => {\n await withAuth(req)\n const data = updateFormRosterSchema.parse(req.body)\n return ok(await service.updateFormRoster(req.params['id']!, data))\n })\n\n routes.set('DELETE /rosters/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormRoster(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormVariable routes ────────────────\n\n routes.set('POST /pages/:pageId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, pageId: req.params['pageId']! }), 201)\n })\n\n routes.set('POST /rosters/:rosterId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, rosterId: req.params['rosterId']! }), 201)\n })\n\n routes.set('PUT /variables/:id', async (req) => {\n await withAuth(req)\n const data = updateFormVariableSchema.parse(req.body)\n return ok(await service.updateFormVariable(req.params['id']!, data))\n })\n\n routes.set('DELETE /variables/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormVariable(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── Submission routes ──────────────────\n\n routes.set('GET /forms/:formId/submissions', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getSubmissions({\n formId: req.params['formId']!,\n ...params,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /submissions/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getSubmission(req.params['id']!))\n })\n\n routes.set('POST /submissions', async (req) => {\n const ctx = await withAuth(req)\n const data = createSubmissionSchema.parse(req.body)\n return ok(await service.createSubmission(data, ctx), 201)\n })\n\n routes.set('PUT /submissions/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateSubmissionSchema.parse(req.body)\n return ok(await service.updateSubmission(req.params['id']!, data, ctx))\n })\n\n // ─── Scope routes ───────────────────────\n\n routes.set('GET /scopes', async (req) => {\n const ctx = await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listScopes(\n { tenantId: params.tenantId, page: params.page, pageSize: params.pageSize },\n ctx,\n )\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /scopes/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getScopeById(req.params['id']!))\n })\n\n routes.set('POST /scopes', async (req) => {\n const ctx = await withAuth(req)\n const data = createScopeSchema.parse(req.body)\n return ok(await scopeService.createScope(data, ctx), 201)\n })\n\n routes.set('PUT /scopes/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateScopeSchema.parse(req.body)\n return ok(await scopeService.updateScope(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /scopes/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteScope(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── VariableTemplate routes ────────────\n\n routes.set('GET /scopes/:scopeId/templates', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listTemplates(req.params['scopeId']!, {\n page: params.page,\n pageSize: params.pageSize,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('POST /scopes/:scopeId/templates', async (req) => {\n const ctx = await withAuth(req)\n const data = createVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.createTemplate(req.params['scopeId']!, data, ctx), 201)\n })\n\n routes.set('GET /templates/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getTemplateById(req.params['id']!))\n })\n\n routes.set('PUT /templates/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.updateTemplate(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /templates/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteTemplate(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── DataSourceConfig routes ────────────\n\n routes.set('GET /scopes/:scopeId/datasources', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await dataSourceService.listDataSources(\n req.params['scopeId']!,\n { page: params.page, pageSize: params.pageSize },\n )\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('POST /scopes/:scopeId/datasources', async (req) => {\n const ctx = await withAuth(req)\n const data = createDataSourceSchema.parse(req.body)\n return ok(\n await dataSourceService.createDataSource(req.params['scopeId']!, data, ctx),\n 201,\n )\n })\n\n routes.set('GET /datasources/:id', async (req) => {\n await withAuth(req)\n return ok(await dataSourceService.getDataSourceById(req.params['id']!))\n })\n\n routes.set('PUT /datasources/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateDataSourceSchema.parse(req.body)\n return ok(await dataSourceService.updateDataSource(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /datasources/:id', async (req) => {\n await withAuth(req)\n await dataSourceService.deleteDataSource(req.params['id']!)\n return ok(null, 204)\n })\n\n // Aggregated lookup for the renderer — one call, all configs + decrypted\n // scope-level headers, ordered to match the form's scopeIds priority.\n routes.set('GET /forms/:formId/datasources', async (req) => {\n await withAuth(req)\n const form = await service.getFormDefinition(req.params['formId']!)\n // `form.scopes` is the raw pivot rows, already ordered by `order` asc\n // (see getFormDefinition's include). Map to scopeIds for the service.\n const scopeIds = (form.scopes ?? []).map((s: { scopeId: string }) => s.scopeId)\n const { items, scopeHeaders } = await dataSourceService.getDataSourcesByScopeIds(scopeIds)\n return ok({ items, scopeHeaders })\n })\n\n // ─── Router handler ─────────────────────\n\n function matchRoute(method: string, path: string): { handler: RouteHandler; params: Record<string, string> } | null {\n for (const [pattern, handler] of routes) {\n const [routeMethod, routePath] = pattern.split(' ')\n if (routeMethod !== method) continue\n\n const params = matchPath(routePath!, path)\n if (params) return { handler, params }\n }\n return null\n }\n\n return {\n routes,\n handle: async (req: RouteRequest): Promise<RouteResponse> => {\n try {\n const matched = matchRoute(req.method, req.path)\n if (!matched) return { status: 404, body: { status: 404, message: 'Route not found', data: null } }\n\n req.params = matched.params\n return await matched.handler(req)\n } catch (error) {\n if (error instanceof ApiError) {\n return { status: error.statusCode, body: { status: error.statusCode, message: error.message, data: null, errors: error.errors } }\n }\n if (error instanceof Error && error.name === 'ZodError') {\n const zodError = error as any\n return { status: 400, body: { status: 400, message: 'Validation error', data: null, errors: zodError.issues?.map((i: any) => i.message) } }\n }\n return { status: 500, body: { status: 500, message: 'Internal server error', data: null } }\n }\n },\n }\n}\n\n/** Simple path matcher: /forms/:id matches /forms/abc123 */\nfunction matchPath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/').filter(Boolean)\n const actualParts = actual.split('/').filter(Boolean)\n\n if (patternParts.length !== actualParts.length) return null\n\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i]!\n const ap = actualParts[i]!\n if (pp.startsWith(':')) {\n params[pp.slice(1)] = ap\n } else if (pp !== ap) {\n return null\n }\n }\n\n return params\n}\n"]}
1
+ {"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.service.ts","../src/utils/encryption.ts","../src/services/scope.service.ts","../src/services/datasource.service.ts","../src/middleware/auth.middleware.ts","../src/middleware/validation.middleware.ts","../src/create-router.ts"],"names":["ApiError","_ApiError","statusCode","message","errors","successResponse","data","paginatedResponse","total","page","pageSize","toJson","value","fromJson","localizedToDb","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","scopeIds","scopeId","order","dbForm","formId","conditions","pageId","options","templateOverrides","validationRules","dataSourceDependencies","style","defaultValue","sub","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","getPageVariables","roster","getPageRosters","dbRoster","v","rosterId","resolveTemplates","a","b","s","r","templateIds","collectTemplateIds","dbTemplates","templateMap","t","resolveFormTemplates","parseMaybeJson","ALGORITHM","KEY_ENV","IV_BYTES","AUTH_TAG_BYTES","getKey","raw","trimmed","key","encrypt","iv","randomBytes","cipher","createCipheriv","plaintext","ciphertext","authTag","decrypt","encrypted","parts","decipher","createDecipheriv","parsed","err","requireEncryption","DEFAULT_TENANT","localizedFromDb","tenantFromCtx","explicit","ScopeService","encryptedHeaders","isUniqueViolation","updated","row","formCount","templateCount","dataSourceCount","rows","found","scope","ids","headers","DataSourceService","scopes","scopeHeaders","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","localizedSchema","createScopeSchema","updateScopeSchema","VARIABLE_TYPES","createVariableTemplateSchema","updateVariableTemplateSchema","createDataSourceSchema","updateDataSourceSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","initialisedClients","initializeDefaults","createFormRouter","auth","service","scopeService","dataSourceService","routes","withAuth","req","ok","status","paginated","types","matchRoute","method","path","pattern","handler","routeMethod","routePath","matchPath","matched","error","i","actual","patternParts","actualParts","pp","ap"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Standardized API error response.\r\n */\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n public statusCode: number,\r\n message: string,\r\n public errors?: string[],\r\n ) {\r\n super(message)\r\n this.name = 'ApiError'\r\n }\r\n\r\n static notFound(message = 'Resource not found') {\r\n return new ApiError(404, message)\r\n }\r\n\r\n static badRequest(message: string, errors?: string[]) {\r\n return new ApiError(400, message, errors)\r\n }\r\n\r\n static unauthorized(message = 'Unauthorized') {\r\n return new ApiError(401, message)\r\n }\r\n\r\n static conflict(message: string) {\r\n return new ApiError(409, message)\r\n }\r\n\r\n static serviceUnavailable(message: string) {\r\n return new ApiError(503, message)\r\n }\r\n}\r\n\r\nexport interface ApiResponse<T = unknown> {\r\n status: number\r\n message: string\r\n data: T\r\n errors?: string[]\r\n}\r\n\r\nexport function successResponse<T>(data: T, message = 'Success'): ApiResponse<T> {\r\n return { status: 200, message, data }\r\n}\r\n\r\nexport function paginatedResponse<T>(\r\n data: T[],\r\n total: number,\r\n page: number,\r\n pageSize: number,\r\n): ApiResponse<{ items: T[]; total: number; page: number; pageSize: number; totalPages: number }> {\r\n return {\r\n status: 200,\r\n message: 'Success',\r\n data: {\r\n items: data,\r\n total,\r\n page,\r\n pageSize,\r\n totalPages: Math.ceil(total / pageSize),\r\n },\r\n }\r\n}\r\n","/**\r\n * Form service — all CRUD operations via Prisma.\r\n * Framework-agnostic: called by route handlers.\r\n */\r\n\r\nimport type { PrismaClient } from '../../generated/prisma'\r\nimport { ApiError } from '../middleware/error.middleware'\r\nimport type { IRequestContext } from '../middleware/auth.middleware'\r\nimport {\r\n serializeForm,\r\n deserializeForm,\r\n getPageVariables,\r\n getPageRosters,\r\n resolveFormTemplates,\r\n collectTemplateIds,\r\n} from '@msbci/form-core'\r\nimport type {\r\n IFormDefinition,\r\n IVariableTemplate,\r\n LocalizedString,\r\n VariableType,\r\n} from '@msbci/form-core'\r\n\r\n/** JSON serialization helpers (Prisma stores JSON as string in SQLite) */\r\nfunction toJson(value: unknown): string | null {\r\n if (value === undefined || value === null) return null\r\n return JSON.stringify(value)\r\n}\r\n\r\nfunction fromJson<T>(value: string | null): T | undefined {\r\n if (!value) return undefined\r\n try { return JSON.parse(value) as T } catch { return undefined }\r\n}\r\n\r\n/**\r\n * Flattens a `LocalizedString` value to a plain `string` suitable for\r\n * Prisma's `String` columns. Record-shaped values are JSON-stringified —\r\n * read-side code can detect the JSON shape and parse back. Plain strings\r\n * are returned untouched (backward compatible).\r\n */\r\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\r\n if (value === undefined || value === null) return undefined\r\n if (typeof value === 'string') return value\r\n return JSON.stringify(value)\r\n}\r\n\r\nexport class FormService {\r\n constructor(private prisma: PrismaClient) {}\r\n\r\n // ─── FormType ────────────────────────────\r\n\r\n async getFormTypes(tenantId?: string) {\r\n return this.prisma.formType.findMany({ orderBy: { name: 'asc' } })\r\n }\r\n\r\n async getFormType(id: string) {\r\n const ft = await this.prisma.formType.findUnique({ where: { id } })\r\n if (!ft) throw ApiError.notFound('FormType not found')\r\n return ft\r\n }\r\n\r\n async createFormType(data: { code: string; name: string; description?: string; metadata?: Record<string, unknown> }) {\r\n return this.prisma.formType.create({\r\n data: { ...data, metadata: toJson(data.metadata) },\r\n })\r\n }\r\n\r\n async updateFormType(id: string, data: Partial<{ code: string; name: string; description: string; metadata: Record<string, unknown> }>) {\r\n const { metadata, ...rest } = data\r\n return this.prisma.formType.update({\r\n where: { id },\r\n data: { ...rest, ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}) },\r\n })\r\n }\r\n\r\n async deleteFormType(id: string) {\r\n return this.prisma.formType.delete({ where: { id } })\r\n }\r\n\r\n // ─── FormDefinition ─────────────────────\r\n\r\n async getFormDefinitions(params: { page: number; pageSize: number; search?: string; tenantId?: string; scopeId?: string }) {\r\n const where: Record<string, unknown> = {}\r\n if (params.tenantId) where['tenantId'] = params.tenantId\r\n if (params.scopeId) where['scopes'] = { some: { scopeId: params.scopeId } }\r\n if (params.search) {\r\n where['OR'] = [\r\n { name: { contains: params.search } },\r\n { code: { contains: params.search } },\r\n ]\r\n }\r\n\r\n const [items, total] = await Promise.all([\r\n this.prisma.formDefinition.findMany({\r\n where: where as any,\r\n include: { formType: true, _count: { select: { pages: true, submissions: true } } },\r\n skip: (params.page - 1) * params.pageSize,\r\n take: params.pageSize,\r\n orderBy: { updatedAt: 'desc' },\r\n }),\r\n this.prisma.formDefinition.count({ where: where as any }),\r\n ])\r\n\r\n return { items, total }\r\n }\r\n\r\n async getFormDefinition(id: string) {\r\n const form = await this.prisma.formDefinition.findUnique({\r\n where: { id },\r\n include: {\r\n formType: true,\r\n scopes: { orderBy: { order: 'asc' } },\r\n pages: {\r\n orderBy: { order: 'asc' },\r\n include: {\r\n variables: { where: { pageId: { not: null } }, orderBy: { order: 'asc' } },\r\n rosters: {\r\n orderBy: { order: 'asc' },\r\n include: { variables: { orderBy: { order: 'asc' } } },\r\n },\r\n },\r\n },\r\n },\r\n })\r\n if (!form) throw ApiError.notFound('FormDefinition not found')\r\n return form\r\n }\r\n\r\n async createFormDefinition(data: {\r\n code: string; name: string; description?: string; version?: string;\r\n isPublished?: boolean; tenantId?: string; formTypeId?: string;\r\n scopeIds?: string[];\r\n metadata?: Record<string, unknown>\r\n }, ctx?: IRequestContext) {\r\n const { scopeIds, ...rest } = data\r\n return this.prisma.formDefinition.create({\r\n data: {\r\n ...rest,\r\n metadata: toJson(rest.metadata),\r\n createdBy: ctx?.userId,\r\n updatedBy: ctx?.userId,\r\n ...(scopeIds && scopeIds.length > 0\r\n ? {\r\n scopes: {\r\n create: scopeIds.map((scopeId, order) => ({ scopeId, order })),\r\n },\r\n }\r\n : {}),\r\n },\r\n })\r\n }\r\n\r\n async updateFormDefinition(id: string, data: Partial<{\r\n code: string; name: string; description: string; version: string;\r\n isPublished: boolean; formTypeId: string;\r\n scopeIds: string[];\r\n metadata: Record<string, unknown>\r\n }>, ctx?: IRequestContext) {\r\n const { metadata, scopeIds, ...rest } = data\r\n\r\n // Update scalar / FK fields first.\r\n await this.prisma.formDefinition.update({\r\n where: { id },\r\n data: {\r\n ...rest,\r\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n\r\n // Replace the scope links when an explicit scopeIds array is provided.\r\n if (scopeIds !== undefined) {\r\n await this.prisma.formDefinitionScope.deleteMany({ where: { formId: id } })\r\n if (scopeIds.length > 0) {\r\n await this.prisma.formDefinitionScope.createMany({\r\n data: scopeIds.map((scopeId, order) => ({ formId: id, scopeId, order })),\r\n })\r\n }\r\n }\r\n\r\n return this.prisma.formDefinition.findUnique({\r\n where: { id },\r\n include: { scopes: { orderBy: { order: 'asc' } } },\r\n })\r\n }\r\n\r\n /**\r\n * Load a form by id and return it as a fully-resolved `IFormDefinition`\r\n * (templates applied — Option B). Used by `GET /forms/:id/resolved` and\r\n * `exportForm`. The original DB-include shape is still available via\r\n * {@link getFormDefinition}.\r\n */\r\n async getResolvedFormDefinition(id: string): Promise<IFormDefinition> {\r\n const dbForm = await this.getFormDefinition(id)\r\n return this.dbToFormDefinition(dbForm)\r\n }\r\n\r\n async deleteFormDefinition(id: string) {\r\n return this.prisma.formDefinition.delete({ where: { id } })\r\n }\r\n\r\n // ─── FormPage ───────────────────────────\r\n\r\n async createFormPage(formId: string, data: {\r\n code: string; name: string; order: number; isRepeatable?: boolean;\r\n repeatMinInstances?: number; repeatMaxInstances?: number;\r\n repeatControlVarCode?: string; repeatInstanceLabel?: string;\r\n conditions?: unknown[]; metadata?: Record<string, unknown>\r\n }) {\r\n return this.prisma.formPage.create({\r\n data: {\r\n ...data,\r\n formId,\r\n conditions: toJson(data.conditions),\r\n metadata: toJson(data.metadata),\r\n },\r\n })\r\n }\r\n\r\n async updateFormPage(id: string, data: Partial<{\r\n code: string; name: string; order: number; isRepeatable: boolean;\r\n repeatMinInstances: number; repeatMaxInstances: number;\r\n repeatControlVarCode: string; repeatInstanceLabel: string;\r\n conditions: unknown[]; metadata: Record<string, unknown>\r\n }>) {\r\n const { conditions, metadata, ...rest } = data\r\n return this.prisma.formPage.update({\r\n where: { id },\r\n data: {\r\n ...rest,\r\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\r\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\r\n },\r\n })\r\n }\r\n\r\n async deleteFormPage(id: string) {\r\n return this.prisma.formPage.delete({ where: { id } })\r\n }\r\n\r\n // ─── FormRoster ─────────────────────────\r\n\r\n async createFormRoster(pageId: string, data: {\r\n code: string; name: string; rosterType: string; order: number;\r\n pilotVariableCode?: string; options?: unknown[]; conditions?: unknown[];\r\n metadata?: Record<string, unknown>\r\n }) {\r\n return this.prisma.formRoster.create({\r\n data: {\r\n ...data,\r\n pageId,\r\n options: toJson(data.options),\r\n conditions: toJson(data.conditions),\r\n metadata: toJson(data.metadata),\r\n },\r\n })\r\n }\r\n\r\n async updateFormRoster(id: string, data: Partial<{\r\n code: string; name: string; rosterType: string; order: number;\r\n pilotVariableCode: string; options: unknown[]; conditions: unknown[];\r\n metadata: Record<string, unknown>\r\n }>) {\r\n const { options, conditions, metadata, ...rest } = data\r\n return this.prisma.formRoster.update({\r\n where: { id },\r\n data: {\r\n ...rest,\r\n ...(options !== undefined ? { options: toJson(options) } : {}),\r\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\r\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\r\n },\r\n })\r\n }\r\n\r\n async deleteFormRoster(id: string) {\r\n return this.prisma.formRoster.delete({ where: { id } })\r\n }\r\n\r\n // ─── FormVariable ───────────────────────\r\n\r\n async createFormVariable(data: {\r\n code: string; name: string; type: string; order: number;\r\n pageId?: string; rosterId?: string;\r\n isRequired?: boolean; isReadonly?: boolean; isHidden?: boolean;\r\n defaultValue?: unknown; placeholder?: string; description?: string;\r\n options?: unknown[]; validationRules?: unknown[]; conditions?: unknown[];\r\n expression?: string; dataSourceId?: string; dataSourceDependencies?: Record<string, string>;\r\n style?: unknown; metadata?: Record<string, unknown>;\r\n templateId?: string; templateOverrides?: Record<string, unknown>\r\n }) {\r\n if (!data.pageId && !data.rosterId) {\r\n throw ApiError.badRequest('Variable must belong to a page or a roster')\r\n }\r\n const { templateOverrides, ...rest } = data\r\n return this.prisma.formVariable.create({\r\n data: {\r\n ...rest,\r\n defaultValue: data.defaultValue !== undefined ? String(data.defaultValue) : null,\r\n options: toJson(data.options),\r\n validationRules: toJson(data.validationRules),\r\n conditions: toJson(data.conditions),\r\n dataSourceDependencies: toJson(data.dataSourceDependencies),\r\n style: toJson(data.style),\r\n metadata: toJson(data.metadata),\r\n templateOverrides: toJson(templateOverrides),\r\n },\r\n })\r\n }\r\n\r\n async updateFormVariable(id: string, data: Partial<{\r\n code: string; name: string; type: string; order: number;\r\n isRequired: boolean; isReadonly: boolean; isHidden: boolean;\r\n defaultValue: unknown; placeholder: string; description: string;\r\n options: unknown[]; validationRules: unknown[]; conditions: unknown[];\r\n expression: string; dataSourceId: string; dataSourceDependencies: Record<string, string>;\r\n style: unknown; metadata: Record<string, unknown>;\r\n templateId: string | null; templateOverrides: Record<string, unknown> | null\r\n }>) {\r\n const {\r\n options, validationRules, conditions, dataSourceDependencies,\r\n style, metadata, defaultValue, templateOverrides, ...rest\r\n } = data\r\n return this.prisma.formVariable.update({\r\n where: { id },\r\n data: {\r\n ...rest,\r\n ...(defaultValue !== undefined ? { defaultValue: String(defaultValue) } : {}),\r\n ...(options !== undefined ? { options: toJson(options) } : {}),\r\n ...(validationRules !== undefined ? { validationRules: toJson(validationRules) } : {}),\r\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\r\n ...(dataSourceDependencies !== undefined ? { dataSourceDependencies: toJson(dataSourceDependencies) } : {}),\r\n ...(style !== undefined ? { style: toJson(style) } : {}),\r\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\r\n ...(templateOverrides !== undefined ? { templateOverrides: toJson(templateOverrides) } : {}),\r\n },\r\n })\r\n }\r\n\r\n async deleteFormVariable(id: string) {\r\n return this.prisma.formVariable.delete({ where: { id } })\r\n }\r\n\r\n // ─── Submission ─────────────────────────\r\n\r\n async getSubmissions(params: { formId: string; page: number; pageSize: number; status?: string; tenantId?: string }) {\r\n const where: Record<string, unknown> = { formId: params.formId }\r\n if (params.status) where['status'] = params.status\r\n if (params.tenantId) where['tenantId'] = params.tenantId\r\n\r\n const [items, total] = await Promise.all([\r\n this.prisma.formSubmission.findMany({\r\n where: where as any,\r\n skip: (params.page - 1) * params.pageSize,\r\n take: params.pageSize,\r\n orderBy: { createdAt: 'desc' },\r\n }),\r\n this.prisma.formSubmission.count({ where: where as any }),\r\n ])\r\n\r\n return { items, total }\r\n }\r\n\r\n async getSubmission(id: string) {\r\n const sub = await this.prisma.formSubmission.findUnique({ where: { id } })\r\n if (!sub) throw ApiError.notFound('Submission not found')\r\n return sub\r\n }\r\n\r\n async createSubmission(data: {\r\n formId: string; tenantId?: string; status?: string;\r\n data: Record<string, unknown>; submittedBy?: string; metadata?: Record<string, unknown>\r\n }, ctx?: IRequestContext) {\r\n return this.prisma.formSubmission.create({\r\n data: {\r\n formId: data.formId,\r\n tenantId: data.tenantId,\r\n status: data.status ?? 'draft',\r\n data: JSON.stringify(data.data),\r\n submittedBy: data.submittedBy,\r\n metadata: toJson(data.metadata),\r\n createdBy: ctx?.userId,\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n }\r\n\r\n async updateSubmission(id: string, data: Partial<{ status: string; data: Record<string, unknown>; metadata: Record<string, unknown> }>, ctx?: IRequestContext) {\r\n return this.prisma.formSubmission.update({\r\n where: { id },\r\n data: {\r\n ...(data.status ? { status: data.status } : {}),\r\n ...(data.data ? { data: JSON.stringify(data.data) } : {}),\r\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n }\r\n\r\n // ─── Export / Import ────────────────────\r\n\r\n async exportForm(formId: string): Promise<string> {\r\n const dbForm = await this.getFormDefinition(formId)\r\n const formDef = await this.dbToFormDefinition(dbForm)\r\n return serializeForm(formDef)\r\n }\r\n\r\n async importForm(json: string, tenantId?: string): Promise<string> {\r\n const formDef = deserializeForm(json)\r\n const created = await this.createFormDefinition({\r\n code: formDef.code,\r\n name: localizedToDb(formDef.name) ?? '',\r\n description: localizedToDb(formDef.description),\r\n version: formDef.version,\r\n isPublished: formDef.isPublished,\r\n tenantId,\r\n formTypeId: formDef.formTypeId,\r\n scopeIds: formDef.scopeIds,\r\n })\r\n\r\n for (const page of formDef.pages) {\r\n const dbPage = await this.createFormPage(created.id, {\r\n code: page.code,\r\n name: localizedToDb(page.name) ?? '',\r\n order: page.order,\r\n isRepeatable: page.isRepeatable,\r\n repeatMinInstances: page.repeatConfig?.min,\r\n repeatMaxInstances: page.repeatConfig?.max,\r\n repeatControlVarCode: page.repeatConfig?.controlVariableCode,\r\n repeatInstanceLabel: localizedToDb(page.repeatConfig?.instanceLabel),\r\n })\r\n\r\n for (const variable of getPageVariables(page)) {\r\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\r\n }\r\n\r\n for (const roster of getPageRosters(page)) {\r\n const dbRoster = await this.createFormRoster(dbPage.id, {\r\n code: roster.code,\r\n name: localizedToDb(roster.name) ?? '',\r\n rosterType: roster.rosterType,\r\n order: roster.order,\r\n pilotVariableCode: roster.pilotVariableCode,\r\n options: roster.options,\r\n })\r\n\r\n for (const variable of roster.variables) {\r\n await this.createFormVariable(this.extractVariableData(variable, undefined, dbRoster.id))\r\n }\r\n }\r\n }\r\n\r\n return created.id\r\n }\r\n\r\n /** Extract variable data for createFormVariable (omit `id` to let Prisma generate it) */\r\n private extractVariableData(v: any, pageId?: string, rosterId?: string) {\r\n return {\r\n code: v.code, name: v.name, type: v.type, order: v.order,\r\n pageId, rosterId,\r\n isRequired: v.isRequired, isReadonly: v.isReadonly, isHidden: v.isHidden,\r\n defaultValue: v.defaultValue, placeholder: v.placeholder, description: v.description,\r\n options: v.options, validationRules: v.validationRules, conditions: v.conditions,\r\n expression: v.expression, dataSourceId: v.dataSourceId,\r\n dataSourceDependencies: v.dataSourceDependencies, style: v.style, metadata: v.metadata,\r\n templateId: v.templateId, templateOverrides: v.templateOverrides,\r\n }\r\n }\r\n\r\n /**\r\n * Convert a Prisma DB result to a fully-resolved `IFormDefinition`.\r\n *\r\n * Templates referenced by `IFormVariable.templateId` are loaded in a\r\n * single batch and applied via `resolveFormTemplates` (Option B —\r\n * in-memory only, no mutation in DB). Pass `resolveTemplates = false`\r\n * to obtain the raw shape (useful for editor tooling that wants to\r\n * preserve `templateOverrides`).\r\n */\r\n private async dbToFormDefinition(\r\n dbForm: any,\r\n resolveTemplates = true,\r\n ): Promise<IFormDefinition> {\r\n const scopeIds = Array.isArray(dbForm.scopes)\r\n ? dbForm.scopes\r\n .slice()\r\n .sort((a: any, b: any) => a.order - b.order)\r\n .map((s: any) => s.scopeId as string)\r\n : undefined\r\n\r\n const form: IFormDefinition = {\r\n id: dbForm.id,\r\n code: dbForm.code,\r\n name: dbForm.name,\r\n description: dbForm.description ?? undefined,\r\n version: dbForm.version,\r\n isPublished: dbForm.isPublished,\r\n formTypeId: dbForm.formTypeId ?? undefined,\r\n scopeIds: scopeIds && scopeIds.length > 0 ? scopeIds : undefined,\r\n metadata: fromJson(dbForm.metadata),\r\n pages: (dbForm.pages ?? []).map((p: any) => ({\r\n id: p.id,\r\n code: p.code,\r\n name: p.name,\r\n order: p.order,\r\n isRepeatable: p.isRepeatable,\r\n repeatConfig: p.isRepeatable ? {\r\n min: p.repeatMinInstances ?? undefined,\r\n max: p.repeatMaxInstances ?? undefined,\r\n controlVariableCode: p.repeatControlVarCode ?? undefined,\r\n instanceLabel: p.repeatInstanceLabel ?? undefined,\r\n } : undefined,\r\n conditions: fromJson(p.conditions) ?? [],\r\n variables: (p.variables ?? []).map((v: any) => this.dbToVariable(v)),\r\n rosters: (p.rosters ?? []).map((r: any) => ({\r\n id: r.id,\r\n code: r.code,\r\n name: r.name,\r\n rosterType: r.rosterType,\r\n order: r.order,\r\n pilotVariableCode: r.pilotVariableCode ?? undefined,\r\n options: fromJson(r.options),\r\n conditions: fromJson(r.conditions) ?? [],\r\n variables: (r.variables ?? []).map((v: any) => this.dbToVariable(v)),\r\n })),\r\n })),\r\n }\r\n\r\n if (!resolveTemplates) return form\r\n\r\n const templateIds = collectTemplateIds(form)\r\n if (templateIds.size === 0) return form\r\n\r\n const dbTemplates = await this.prisma.variableTemplate.findMany({\r\n where: { id: { in: [...templateIds] } },\r\n })\r\n const templateMap = new Map<string, IVariableTemplate>(\r\n dbTemplates.map((t) => [t.id, this.dbToTemplate(t)]),\r\n )\r\n return resolveFormTemplates(form, templateMap)\r\n }\r\n\r\n private dbToVariable(v: any) {\r\n return {\r\n id: v.id,\r\n code: v.code,\r\n name: v.name,\r\n type: v.type,\r\n order: v.order,\r\n isRequired: v.isRequired,\r\n isReadonly: v.isReadonly,\r\n isHidden: v.isHidden,\r\n defaultValue: v.defaultValue ?? undefined,\r\n placeholder: v.placeholder ?? undefined,\r\n description: v.description ?? undefined,\r\n options: fromJson(v.options),\r\n validationRules: fromJson(v.validationRules),\r\n conditions: fromJson(v.conditions),\r\n expression: v.expression ?? undefined,\r\n dataSourceId: v.dataSourceId ?? undefined,\r\n dataSourceDependencies: fromJson(v.dataSourceDependencies),\r\n style: fromJson(v.style),\r\n metadata: fromJson(v.metadata),\r\n templateId: v.templateId ?? undefined,\r\n templateOverrides: fromJson(v.templateOverrides),\r\n }\r\n }\r\n\r\n /**\r\n * Convert a Prisma VariableTemplate row to the domain type. Duplicated\r\n * locally (kept in sync with `ScopeService.dbToTemplate`) to avoid an\r\n * import cycle between the two services.\r\n */\r\n private dbToTemplate(t: any): IVariableTemplate {\r\n return {\r\n id: t.id,\r\n code: t.code,\r\n name: parseMaybeJson(t.name) ?? '',\r\n scopeId: t.scopeId,\r\n tenantId: t.tenantId ?? 'default',\r\n variableType: t.variableType as VariableType,\r\n description: parseMaybeJson(t.description),\r\n placeholder: parseMaybeJson(t.placeholder),\r\n isRequired: t.isRequired ?? undefined,\r\n isReadonly: t.isReadonly ?? undefined,\r\n isHidden: t.isHidden ?? undefined,\r\n options: fromJson(t.options),\r\n validationRules: fromJson(t.validationRules),\r\n conditions: fromJson(t.conditions),\r\n expression: t.expression ?? undefined,\r\n dataSourceId: t.dataSourceId ?? undefined,\r\n dataSourceDependencies: fromJson(t.dataSourceDependencies),\r\n style: fromJson(t.style),\r\n metadata: fromJson(t.metadata),\r\n createdAt: t.createdAt instanceof Date ? t.createdAt.toISOString() : t.createdAt,\r\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : t.updatedAt,\r\n createdBy: t.createdBy ?? undefined,\r\n updatedBy: t.updatedBy ?? undefined,\r\n }\r\n }\r\n}\r\n\r\n/** Best-effort decoder for LocalizedString columns (object or plain). */\r\nfunction parseMaybeJson(value: string | null | undefined): LocalizedString | undefined {\r\n if (value === null || value === undefined) return undefined\r\n if (value.startsWith('{')) {\r\n try {\r\n return JSON.parse(value) as LocalizedString\r\n } catch {\r\n return value\r\n }\r\n }\r\n return value\r\n}\r\n","/**\r\n * AES-256-GCM helpers for header encryption (v1.3.2+).\r\n *\r\n * Threat model: the server stores third-party API credentials (bearer\r\n * tokens, API keys) that must not leak in DB backups or admin tools.\r\n * Headers are encrypted at write time with `MOSOBI_ENCRYPTION_KEY`\r\n * (32-byte base64 or hex) and decrypted only when the renderer asks\r\n * for them via the aggregated `/forms/:id/datasources` endpoint.\r\n *\r\n * Format: `base64(iv):base64(authTag):base64(ciphertext)` — 12-byte\r\n * IV (GCM-recommended), 16-byte auth tag. The IV is fresh per call,\r\n * never reused.\r\n *\r\n * Reads tolerate a missing key (returns `{}` + console warning).\r\n * Writes always require the key — `requireEncryption()` throws 503.\r\n */\r\n\r\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto'\r\nimport { ApiError } from '../middleware/error.middleware'\r\n\r\nconst ALGORITHM = 'aes-256-gcm'\r\nconst KEY_ENV = 'MOSOBI_ENCRYPTION_KEY'\r\nconst IV_BYTES = 12\r\nconst AUTH_TAG_BYTES = 16\r\n\r\n/** Decode the env-provided key. Supports base64 and hex; must yield 32 bytes. */\r\nfunction getKey(): Buffer {\r\n const raw = process.env[KEY_ENV]\r\n if (!raw) {\r\n throw ApiError.serviceUnavailable(\r\n `${KEY_ENV} is not configured — header encryption is unavailable`,\r\n )\r\n }\r\n const trimmed = raw.trim()\r\n // Try base64 first (most common when generated via `openssl rand -base64 32`).\r\n let key: Buffer\r\n if (/^[A-Za-z0-9+/=]+$/.test(trimmed)) {\r\n key = Buffer.from(trimmed, 'base64')\r\n if (key.length === 32) return key\r\n }\r\n if (/^[0-9a-fA-F]+$/.test(trimmed) && trimmed.length === 64) {\r\n return Buffer.from(trimmed, 'hex')\r\n }\r\n throw ApiError.serviceUnavailable(\r\n `${KEY_ENV} must be 32 bytes (base64 or 64-char hex)`,\r\n )\r\n}\r\n\r\n/** True when the env key is set and well-formed. Never throws. */\r\nexport function isEncryptionAvailable(): boolean {\r\n try {\r\n getKey()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Encrypts a header map. The caller MUST have validated availability\r\n * via `requireEncryption()` first; otherwise the throw is opaque to\r\n * the HTTP layer.\r\n */\r\nexport function encrypt(value: Record<string, string>): string {\r\n const key = getKey()\r\n const iv = randomBytes(IV_BYTES)\r\n const cipher = createCipheriv(ALGORITHM, key, iv)\r\n const plaintext = Buffer.from(JSON.stringify(value), 'utf8')\r\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()])\r\n const authTag = cipher.getAuthTag()\r\n return [\r\n iv.toString('base64'),\r\n authTag.toString('base64'),\r\n ciphertext.toString('base64'),\r\n ].join(':')\r\n}\r\n\r\n/**\r\n * Decrypts a payload produced by `encrypt()`. Returns `{}` and logs a\r\n * warning if the key is unavailable or the cipher text is malformed —\r\n * the renderer would rather see no headers than crash the form.\r\n */\r\nexport function decrypt(encrypted: string): Record<string, string> {\r\n let key: Buffer\r\n try {\r\n key = getKey()\r\n } catch {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n `[form-server] ${KEY_ENV} is missing — encrypted headers returned as {}`,\r\n )\r\n return {}\r\n }\r\n\r\n const parts = encrypted.split(':')\r\n if (parts.length !== 3) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[form-server] encrypted header payload is malformed — returning {}')\r\n return {}\r\n }\r\n\r\n try {\r\n const iv = Buffer.from(parts[0]!, 'base64')\r\n const authTag = Buffer.from(parts[1]!, 'base64')\r\n const ciphertext = Buffer.from(parts[2]!, 'base64')\r\n if (iv.length !== IV_BYTES || authTag.length !== AUTH_TAG_BYTES) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[form-server] encrypted header IV/tag length mismatch — returning {}')\r\n return {}\r\n }\r\n const decipher = createDecipheriv(ALGORITHM, key, iv)\r\n decipher.setAuthTag(authTag)\r\n const plaintext = Buffer.concat([\r\n decipher.update(ciphertext),\r\n decipher.final(),\r\n ]).toString('utf8')\r\n const parsed = JSON.parse(plaintext) as Record<string, string>\r\n return parsed && typeof parsed === 'object' ? parsed : {}\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[form-server] failed to decrypt headers — returning {}', err)\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Guard for write endpoints. Throws `ApiError(503)` if the env key is\r\n * missing or malformed — surfaced to the client so the editor can warn.\r\n */\r\nexport function requireEncryption(): void {\r\n getKey()\r\n}\r\n","/**\r\n * Scope + VariableTemplate service — Prisma CRUD operations.\r\n *\r\n * Both resources are scoped by tenant. `tenantId` falls back to\r\n * `'default'` when the caller does not supply one (single-tenant\r\n * deployments stay transparent).\r\n *\r\n * Identity rules:\r\n * - `Scope.code` is unique within a tenant.\r\n * - `VariableTemplate.code` is unique within a scope.\r\n * - `code` and `name` of a template are IMMUTABLE after creation\r\n * (enforced here defensively in addition to the Zod schemas).\r\n */\r\n\r\nimport type { PrismaClient } from '../../generated/prisma'\r\nimport { ApiError } from '../middleware/error.middleware'\r\nimport type { IRequestContext } from '../middleware/auth.middleware'\r\nimport type {\r\n IScope,\r\n IVariableTemplate,\r\n LocalizedString,\r\n VariableType,\r\n} from '@msbci/form-core'\r\nimport { decrypt, encrypt, requireEncryption } from '../utils/encryption'\r\n\r\nconst DEFAULT_TENANT = 'default'\r\n\r\n/** JSON serialization helpers (Prisma stores JSON as TEXT in SQLite). */\r\nfunction toJson(value: unknown): string | null {\r\n if (value === undefined || value === null) return null\r\n return JSON.stringify(value)\r\n}\r\n\r\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\r\n if (value === null || value === undefined) return undefined\r\n try {\r\n return JSON.parse(value) as T\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\n/** Flatten a LocalizedString to a plain DB column. */\r\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\r\n if (value === undefined || value === null) return undefined\r\n if (typeof value === 'string') return value\r\n return JSON.stringify(value)\r\n}\r\n\r\n/** Inverse: parse a DB string back into a LocalizedString (object or plain). */\r\nfunction localizedFromDb(value: string | null | undefined): LocalizedString | undefined {\r\n if (value === null || value === undefined) return undefined\r\n if (value.startsWith('{')) {\r\n try {\r\n return JSON.parse(value) as LocalizedString\r\n } catch {\r\n return value\r\n }\r\n }\r\n return value\r\n}\r\n\r\nfunction tenantFromCtx(ctx?: IRequestContext, explicit?: string): string {\r\n return explicit ?? ctx?.tenantId ?? DEFAULT_TENANT\r\n}\r\n\r\nexport interface ScopeInput {\r\n code: string\r\n name: LocalizedString\r\n description?: LocalizedString\r\n tenantId?: string\r\n metadata?: Record<string, unknown>\r\n /**\r\n * Optional scope-level headers. Encrypted before persistence.\r\n * Triggers `requireEncryption()` — 503 if MOSOBI_ENCRYPTION_KEY missing.\r\n */\r\n headers?: Record<string, string>\r\n}\r\n\r\nexport interface ScopeUpdateInput {\r\n name?: LocalizedString\r\n description?: LocalizedString\r\n metadata?: Record<string, unknown>\r\n /** See {@link ScopeInput.headers}. */\r\n headers?: Record<string, string>\r\n}\r\n\r\nexport interface VariableTemplateInput {\r\n code: string\r\n name: LocalizedString\r\n variableType: VariableType\r\n tenantId?: string\r\n description?: LocalizedString\r\n placeholder?: LocalizedString\r\n isRequired?: boolean\r\n isReadonly?: boolean\r\n isHidden?: boolean\r\n options?: unknown[]\r\n validationRules?: unknown[]\r\n conditions?: unknown[]\r\n expression?: string\r\n dataSourceId?: string\r\n dataSourceDependencies?: Record<string, string>\r\n style?: unknown\r\n metadata?: Record<string, unknown>\r\n}\r\n\r\n/** Update payload — `code` and `name` are intentionally excluded. */\r\nexport interface VariableTemplateUpdateInput {\r\n variableType?: VariableType\r\n description?: LocalizedString\r\n placeholder?: LocalizedString\r\n isRequired?: boolean\r\n isReadonly?: boolean\r\n isHidden?: boolean\r\n options?: unknown[]\r\n validationRules?: unknown[]\r\n conditions?: unknown[]\r\n expression?: string\r\n dataSourceId?: string\r\n dataSourceDependencies?: Record<string, string>\r\n style?: unknown\r\n metadata?: Record<string, unknown>\r\n}\r\n\r\nexport interface PaginationInput {\r\n page?: number\r\n pageSize?: number\r\n}\r\n\r\nexport class ScopeService {\r\n constructor(private prisma: PrismaClient) {}\r\n\r\n // ─── Scope CRUD ─────────────────────────\r\n\r\n async createScope(data: ScopeInput, ctx?: IRequestContext): Promise<IScope> {\r\n const tenantId = tenantFromCtx(ctx, data.tenantId)\r\n // Encrypt before INSERT — failing here aborts the whole operation\r\n // (no scope row created without the key when headers are requested).\r\n let encryptedHeaders: string | null = null\r\n if (data.headers !== undefined) {\r\n requireEncryption()\r\n encryptedHeaders = encrypt(data.headers)\r\n }\r\n try {\r\n const created = await this.prisma.scope.create({\r\n data: {\r\n code: data.code,\r\n name: localizedToDb(data.name) ?? '',\r\n description: localizedToDb(data.description),\r\n tenantId,\r\n metadata: toJson(data.metadata),\r\n headers: encryptedHeaders,\r\n createdBy: ctx?.userId,\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToScope(created)\r\n } catch (err) {\r\n if (isUniqueViolation(err)) {\r\n throw ApiError.badRequest(`Scope code \"${data.code}\" already exists for tenant \"${tenantId}\"`)\r\n }\r\n throw err\r\n }\r\n }\r\n\r\n async updateScope(id: string, data: ScopeUpdateInput, ctx?: IRequestContext): Promise<IScope> {\r\n const existing = await this.prisma.scope.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('Scope not found')\r\n\r\n let encryptedHeaders: string | null | undefined\r\n if (data.headers !== undefined) {\r\n requireEncryption()\r\n encryptedHeaders = encrypt(data.headers)\r\n }\r\n\r\n const updated = await this.prisma.scope.update({\r\n where: { id },\r\n data: {\r\n ...(data.name !== undefined ? { name: localizedToDb(data.name) ?? '' } : {}),\r\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\r\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\r\n ...(encryptedHeaders !== undefined ? { headers: encryptedHeaders } : {}),\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToScope(updated)\r\n }\r\n\r\n /**\r\n * Returns the decrypted headers of a scope, or `{}` when none are set\r\n * or when the encryption key is missing (warning logged from\r\n * `decrypt`). Never throws — reads must stay tolerant.\r\n */\r\n async getScopeHeaders(id: string): Promise<Record<string, string>> {\r\n const row = await this.prisma.scope.findUnique({\r\n where: { id },\r\n select: { headers: true },\r\n })\r\n if (!row || !row.headers) return {}\r\n return decrypt(row.headers)\r\n }\r\n\r\n /**\r\n * Hard-delete a scope. Refuses with 409 when at least one form, one\r\n * template OR one data source still references it (no silent cascade\r\n * — admins explicitly clean up first).\r\n */\r\n async deleteScope(id: string): Promise<void> {\r\n const existing = await this.prisma.scope.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('Scope not found')\r\n\r\n const [formCount, templateCount, dataSourceCount] = await Promise.all([\r\n // Form ↔ scope is now a pivot table — count rows that pin this scope.\r\n this.prisma.formDefinitionScope.count({ where: { scopeId: id } }),\r\n this.prisma.variableTemplate.count({ where: { scopeId: id } }),\r\n this.prisma.dataSourceConfig.count({ where: { scopeId: id } }),\r\n ])\r\n\r\n if (formCount > 0 || templateCount > 0 || dataSourceCount > 0) {\r\n throw ApiError.conflict(\r\n `Scope is in use (forms: ${formCount}, templates: ${templateCount}, dataSources: ${dataSourceCount}). Remove dependents first.`,\r\n )\r\n }\r\n\r\n await this.prisma.scope.delete({ where: { id } })\r\n }\r\n\r\n async listScopes(params: { tenantId?: string } & PaginationInput, ctx?: IRequestContext) {\r\n const tenantId = tenantFromCtx(ctx, params.tenantId)\r\n const page = params.page ?? 1\r\n const pageSize = params.pageSize ?? 50\r\n\r\n const [rows, total] = await Promise.all([\r\n this.prisma.scope.findMany({\r\n where: { tenantId },\r\n skip: (page - 1) * pageSize,\r\n take: pageSize,\r\n orderBy: { updatedAt: 'desc' },\r\n }),\r\n this.prisma.scope.count({ where: { tenantId } }),\r\n ])\r\n\r\n return { items: rows.map((r) => this.dbToScope(r)), total }\r\n }\r\n\r\n async getScopeById(id: string): Promise<IScope> {\r\n const found = await this.prisma.scope.findUnique({ where: { id } })\r\n if (!found) throw ApiError.notFound('Scope not found')\r\n return this.dbToScope(found)\r\n }\r\n\r\n // ─── VariableTemplate CRUD ─────────────\r\n\r\n async createTemplate(\r\n scopeId: string,\r\n data: VariableTemplateInput,\r\n ctx?: IRequestContext,\r\n ): Promise<IVariableTemplate> {\r\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\r\n if (!scope) throw ApiError.notFound('Scope not found')\r\n\r\n const tenantId = tenantFromCtx(ctx, data.tenantId) || scope.tenantId\r\n\r\n try {\r\n const created = await this.prisma.variableTemplate.create({\r\n data: {\r\n code: data.code,\r\n name: localizedToDb(data.name) ?? '',\r\n scopeId,\r\n tenantId,\r\n variableType: data.variableType,\r\n description: localizedToDb(data.description),\r\n placeholder: localizedToDb(data.placeholder),\r\n isRequired: data.isRequired ?? false,\r\n isReadonly: data.isReadonly ?? false,\r\n isHidden: data.isHidden ?? false,\r\n options: toJson(data.options),\r\n validationRules: toJson(data.validationRules),\r\n conditions: toJson(data.conditions),\r\n expression: data.expression,\r\n dataSourceId: data.dataSourceId,\r\n dataSourceDependencies: toJson(data.dataSourceDependencies),\r\n style: toJson(data.style),\r\n metadata: toJson(data.metadata),\r\n createdBy: ctx?.userId,\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToTemplate(created)\r\n } catch (err) {\r\n if (isUniqueViolation(err)) {\r\n throw ApiError.badRequest(`Template code \"${data.code}\" already exists in this scope`)\r\n }\r\n throw err\r\n }\r\n }\r\n\r\n async updateTemplate(\r\n id: string,\r\n data: VariableTemplateUpdateInput & { code?: never; name?: never },\r\n ctx?: IRequestContext,\r\n ): Promise<IVariableTemplate> {\r\n // Defensive guard — Zod already strips these, but enforce here too\r\n // so direct service callers (tests, scripts) cannot bypass the rule.\r\n if ('code' in data || 'name' in data) {\r\n throw ApiError.badRequest('Template code and name are immutable')\r\n }\r\n\r\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('Template not found')\r\n\r\n const updated = await this.prisma.variableTemplate.update({\r\n where: { id },\r\n data: {\r\n ...(data.variableType !== undefined ? { variableType: data.variableType } : {}),\r\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\r\n ...(data.placeholder !== undefined ? { placeholder: localizedToDb(data.placeholder) } : {}),\r\n ...(data.isRequired !== undefined ? { isRequired: data.isRequired } : {}),\r\n ...(data.isReadonly !== undefined ? { isReadonly: data.isReadonly } : {}),\r\n ...(data.isHidden !== undefined ? { isHidden: data.isHidden } : {}),\r\n ...(data.options !== undefined ? { options: toJson(data.options) } : {}),\r\n ...(data.validationRules !== undefined ? { validationRules: toJson(data.validationRules) } : {}),\r\n ...(data.conditions !== undefined ? { conditions: toJson(data.conditions) } : {}),\r\n ...(data.expression !== undefined ? { expression: data.expression } : {}),\r\n ...(data.dataSourceId !== undefined ? { dataSourceId: data.dataSourceId } : {}),\r\n ...(data.dataSourceDependencies !== undefined\r\n ? { dataSourceDependencies: toJson(data.dataSourceDependencies) }\r\n : {}),\r\n ...(data.style !== undefined ? { style: toJson(data.style) } : {}),\r\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToTemplate(updated)\r\n }\r\n\r\n async deleteTemplate(id: string): Promise<void> {\r\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('Template not found')\r\n await this.prisma.variableTemplate.delete({ where: { id } })\r\n }\r\n\r\n async listTemplates(scopeId: string, params?: PaginationInput) {\r\n const page = params?.page ?? 1\r\n const pageSize = params?.pageSize ?? 100\r\n\r\n const [rows, total] = await Promise.all([\r\n this.prisma.variableTemplate.findMany({\r\n where: { scopeId },\r\n skip: (page - 1) * pageSize,\r\n take: pageSize,\r\n orderBy: { updatedAt: 'desc' },\r\n }),\r\n this.prisma.variableTemplate.count({ where: { scopeId } }),\r\n ])\r\n\r\n return { items: rows.map((r) => this.dbToTemplate(r)), total }\r\n }\r\n\r\n async getTemplateById(id: string): Promise<IVariableTemplate> {\r\n const found = await this.prisma.variableTemplate.findUnique({ where: { id } })\r\n if (!found) throw ApiError.notFound('Template not found')\r\n return this.dbToTemplate(found)\r\n }\r\n\r\n async getTemplatesByIds(ids: string[]): Promise<IVariableTemplate[]> {\r\n if (ids.length === 0) return []\r\n const rows = await this.prisma.variableTemplate.findMany({ where: { id: { in: ids } } })\r\n return rows.map((r) => this.dbToTemplate(r))\r\n }\r\n\r\n // ─── DB ↔ domain mappers ───────────────\r\n\r\n private dbToScope(row: any): IScope {\r\n // Headers are decrypted at the boundary. `decrypt()` already returns\r\n // `{}` (with a console.warn) when the key is missing, so the read\r\n // path never throws — the editor can still display the scope.\r\n const headers = row.headers ? decrypt(row.headers) : undefined\r\n return {\r\n id: row.id,\r\n code: row.code,\r\n name: localizedFromDb(row.name) ?? '',\r\n description: localizedFromDb(row.description),\r\n tenantId: row.tenantId ?? DEFAULT_TENANT,\r\n metadata: fromJson(row.metadata),\r\n headers,\r\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\r\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\r\n createdBy: row.createdBy ?? undefined,\r\n updatedBy: row.updatedBy ?? undefined,\r\n }\r\n }\r\n\r\n private dbToTemplate(row: any): IVariableTemplate {\r\n return {\r\n id: row.id,\r\n code: row.code,\r\n name: localizedFromDb(row.name) ?? '',\r\n scopeId: row.scopeId,\r\n tenantId: row.tenantId ?? DEFAULT_TENANT,\r\n variableType: row.variableType as VariableType,\r\n description: localizedFromDb(row.description),\r\n placeholder: localizedFromDb(row.placeholder),\r\n isRequired: row.isRequired ?? undefined,\r\n isReadonly: row.isReadonly ?? undefined,\r\n isHidden: row.isHidden ?? undefined,\r\n options: fromJson(row.options),\r\n validationRules: fromJson(row.validationRules),\r\n conditions: fromJson(row.conditions),\r\n expression: row.expression ?? undefined,\r\n dataSourceId: row.dataSourceId ?? undefined,\r\n dataSourceDependencies: fromJson(row.dataSourceDependencies),\r\n style: fromJson(row.style),\r\n metadata: fromJson(row.metadata),\r\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\r\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\r\n createdBy: row.createdBy ?? undefined,\r\n updatedBy: row.updatedBy ?? undefined,\r\n }\r\n }\r\n}\r\n\r\n/** Recognise Prisma P2002 (unique constraint) without bringing in the runtime. */\r\nfunction isUniqueViolation(err: unknown): boolean {\r\n return (\r\n typeof err === 'object' &&\r\n err !== null &&\r\n 'code' in err &&\r\n (err as { code?: string }).code === 'P2002'\r\n )\r\n}\r\n","/**\r\n * DataSourceConfig service — CRUD + aggregated lookup for renderers.\r\n *\r\n * Each `DataSourceConfig` belongs to a `Scope`. Headers are encrypted at\r\n * write time (`requireEncryption()` → 503 if MOSOBI_ENCRYPTION_KEY is\r\n * unset). Reads are tolerant: missing key returns `{}` headers with a\r\n * warning log so the renderer keeps rendering.\r\n *\r\n * The aggregated endpoint `getDataSourcesByScopeIds` is the heart of the\r\n * v1.3.2 wiring — one call returns every config a form needs plus the\r\n * decrypted scope-level headers, so the renderer never hits the DB.\r\n */\r\n\r\nimport type { PrismaClient } from '../../generated/prisma'\r\nimport { ApiError } from '../middleware/error.middleware'\r\nimport type { IRequestContext } from '../middleware/auth.middleware'\r\nimport type {\r\n IDataSourceConfig,\r\n IScopeHeaders,\r\n LocalizedString,\r\n} from '@msbci/form-core'\r\nimport { decrypt, encrypt, requireEncryption } from '../utils/encryption'\r\n\r\nfunction toJson(value: unknown): string | null {\r\n if (value === undefined || value === null) return null\r\n return JSON.stringify(value)\r\n}\r\n\r\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\r\n if (value === null || value === undefined) return undefined\r\n try {\r\n return JSON.parse(value) as T\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\nfunction localizedToDb(value: LocalizedString | undefined): string {\r\n if (value === undefined || value === null) return ''\r\n if (typeof value === 'string') return value\r\n return JSON.stringify(value)\r\n}\r\n\r\nfunction localizedFromDb(value: string | null | undefined): LocalizedString {\r\n if (value === null || value === undefined) return ''\r\n if (value.startsWith('{')) {\r\n try {\r\n return JSON.parse(value) as LocalizedString\r\n } catch {\r\n return value\r\n }\r\n }\r\n return value\r\n}\r\n\r\nexport interface DataSourceInput {\r\n code: string\r\n name: LocalizedString\r\n url: string\r\n method?: 'GET' | 'POST'\r\n queryParam?: string\r\n valueField: string\r\n labelField: string\r\n headersOverride?: Record<string, string>\r\n dependencies?: Record<string, string>\r\n metadata?: Record<string, unknown>\r\n}\r\n\r\nexport type DataSourceUpdateInput = Partial<DataSourceInput>\r\n\r\nexport interface PaginationInput {\r\n page?: number\r\n pageSize?: number\r\n}\r\n\r\nexport class DataSourceService {\r\n constructor(private prisma: PrismaClient) {}\r\n\r\n async createDataSource(\r\n scopeId: string,\r\n data: DataSourceInput,\r\n ctx?: IRequestContext,\r\n ): Promise<IDataSourceConfig> {\r\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\r\n if (!scope) throw ApiError.notFound('Scope not found')\r\n\r\n // Encrypt before INSERT — abort if the key is missing.\r\n let encryptedHeaders: string | null = null\r\n if (data.headersOverride !== undefined) {\r\n requireEncryption()\r\n encryptedHeaders = encrypt(data.headersOverride)\r\n }\r\n\r\n try {\r\n const created = await this.prisma.dataSourceConfig.create({\r\n data: {\r\n code: data.code,\r\n name: localizedToDb(data.name),\r\n scopeId,\r\n url: data.url,\r\n method: data.method ?? 'GET',\r\n queryParam: data.queryParam ?? 'q',\r\n valueField: data.valueField,\r\n labelField: data.labelField,\r\n headersOverride: encryptedHeaders,\r\n dependencies: toJson(data.dependencies),\r\n metadata: toJson(data.metadata),\r\n createdBy: ctx?.userId,\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToConfig(created)\r\n } catch (err) {\r\n if (isUniqueViolation(err)) {\r\n throw ApiError.badRequest(\r\n `DataSource code \"${data.code}\" already exists in this scope`,\r\n )\r\n }\r\n throw err\r\n }\r\n }\r\n\r\n async updateDataSource(\r\n id: string,\r\n data: DataSourceUpdateInput,\r\n ctx?: IRequestContext,\r\n ): Promise<IDataSourceConfig> {\r\n const existing = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('DataSource not found')\r\n\r\n let encryptedHeaders: string | null | undefined\r\n if (data.headersOverride !== undefined) {\r\n requireEncryption()\r\n encryptedHeaders = encrypt(data.headersOverride)\r\n }\r\n\r\n const updated = await this.prisma.dataSourceConfig.update({\r\n where: { id },\r\n data: {\r\n ...(data.code !== undefined ? { code: data.code } : {}),\r\n ...(data.name !== undefined ? { name: localizedToDb(data.name) } : {}),\r\n ...(data.url !== undefined ? { url: data.url } : {}),\r\n ...(data.method !== undefined ? { method: data.method } : {}),\r\n ...(data.queryParam !== undefined ? { queryParam: data.queryParam } : {}),\r\n ...(data.valueField !== undefined ? { valueField: data.valueField } : {}),\r\n ...(data.labelField !== undefined ? { labelField: data.labelField } : {}),\r\n ...(encryptedHeaders !== undefined ? { headersOverride: encryptedHeaders } : {}),\r\n ...(data.dependencies !== undefined ? { dependencies: toJson(data.dependencies) } : {}),\r\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\r\n updatedBy: ctx?.userId,\r\n },\r\n })\r\n return this.dbToConfig(updated)\r\n }\r\n\r\n async deleteDataSource(id: string): Promise<void> {\r\n const existing = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\r\n if (!existing) throw ApiError.notFound('DataSource not found')\r\n await this.prisma.dataSourceConfig.delete({ where: { id } })\r\n }\r\n\r\n async listDataSources(scopeId: string, params?: PaginationInput) {\r\n const page = params?.page ?? 1\r\n const pageSize = params?.pageSize ?? 100\r\n\r\n const [rows, total] = await Promise.all([\r\n this.prisma.dataSourceConfig.findMany({\r\n where: { scopeId },\r\n skip: (page - 1) * pageSize,\r\n take: pageSize,\r\n orderBy: { updatedAt: 'desc' },\r\n }),\r\n this.prisma.dataSourceConfig.count({ where: { scopeId } }),\r\n ])\r\n\r\n return { items: rows.map((r) => this.dbToConfig(r)), total }\r\n }\r\n\r\n async getDataSourceById(id: string): Promise<IDataSourceConfig> {\r\n const found = await this.prisma.dataSourceConfig.findUnique({ where: { id } })\r\n if (!found) throw ApiError.notFound('DataSource not found')\r\n return this.dbToConfig(found)\r\n }\r\n\r\n /**\r\n * Aggregated lookup for the renderer.\r\n * One call → every config a form needs, plus the decrypted scope-level\r\n * headers. Order of scopes is the caller's responsibility (the renderer\r\n * already has `form.scopeIds` in priority order).\r\n */\r\n async getDataSourcesByScopeIds(\r\n scopeIds: string[],\r\n ): Promise<{ items: IDataSourceConfig[]; scopeHeaders: IScopeHeaders[] }> {\r\n if (scopeIds.length === 0) return { items: [], scopeHeaders: [] }\r\n\r\n const [rows, scopes] = await Promise.all([\r\n this.prisma.dataSourceConfig.findMany({\r\n where: { scopeId: { in: scopeIds } },\r\n orderBy: { updatedAt: 'desc' },\r\n }),\r\n this.prisma.scope.findMany({\r\n where: { id: { in: scopeIds } },\r\n select: { id: true, headers: true },\r\n }),\r\n ])\r\n\r\n const scopeHeaders: IScopeHeaders[] = scopes.map((s) => ({\r\n scopeId: s.id,\r\n headers: s.headers ? decrypt(s.headers) : {},\r\n }))\r\n\r\n return { items: rows.map((r) => this.dbToConfig(r)), scopeHeaders }\r\n }\r\n\r\n private dbToConfig(row: any): IDataSourceConfig {\r\n return {\r\n id: row.id,\r\n code: row.code,\r\n name: localizedFromDb(row.name),\r\n scopeId: row.scopeId,\r\n url: row.url,\r\n method: (row.method ?? 'GET') as 'GET' | 'POST',\r\n queryParam: row.queryParam ?? undefined,\r\n valueField: row.valueField,\r\n labelField: row.labelField,\r\n headersOverride: row.headersOverride ? decrypt(row.headersOverride) : undefined,\r\n dependencies: fromJson(row.dependencies),\r\n metadata: fromJson(row.metadata),\r\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\r\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\r\n createdBy: row.createdBy ?? undefined,\r\n updatedBy: row.updatedBy ?? undefined,\r\n }\r\n }\r\n}\r\n\r\nfunction isUniqueViolation(err: unknown): boolean {\r\n return (\r\n typeof err === 'object' &&\r\n err !== null &&\r\n 'code' in err &&\r\n (err as { code?: string }).code === 'P2002'\r\n )\r\n}\r\n","/**\r\n * Auth middleware — injectable hook for the host application.\r\n *\r\n * The package provides NO auth logic. The host app configures\r\n * an auth handler that is called before every route.\r\n */\r\n\r\n/** Request context passed to route handlers */\r\nexport interface IRequestContext {\r\n /** Authenticated user ID (set by auth middleware) */\r\n userId?: string\r\n /** Tenant ID (for multi-tenant setups) */\r\n tenantId?: string\r\n /** Additional context from the host app */\r\n extra?: Record<string, unknown>\r\n}\r\n\r\n/** Auth middleware function signature */\r\nexport type AuthMiddleware = (\r\n req: { headers: Record<string, string | string[] | undefined>; query: Record<string, string | undefined> },\r\n) => Promise<IRequestContext | null>\r\n\r\n/** Default auth — no authentication, returns empty context */\r\nexport const noAuth: AuthMiddleware = async () => ({})\r\n","/**\r\n * Zod validation schemas for all API inputs.\r\n */\r\n\r\nimport { z } from 'zod'\r\n\r\n// ─── FormType ─────────────────────────────────────\r\n\r\nexport const createFormTypeSchema = z.object({\r\n code: z.string().min(1).max(50),\r\n name: z.string().min(1).max(200),\r\n description: z.string().max(1000).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateFormTypeSchema = createFormTypeSchema.partial()\r\n\r\n// ─── FormDefinition ───────────────────────────────\r\n\r\nexport const createFormDefinitionSchema = z.object({\r\n code: z.string().min(1).max(50),\r\n name: z.string().min(1).max(200),\r\n description: z.string().max(1000).optional(),\r\n version: z.string().default('1.0.0'),\r\n isPublished: z.boolean().default(false),\r\n tenantId: z.string().optional(),\r\n formTypeId: z.string().optional(),\r\n scopeIds: z.array(z.string()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateFormDefinitionSchema = createFormDefinitionSchema.partial()\r\n\r\n// ─── FormPage ─────────────────────────────────────\r\n\r\nexport const createFormPageSchema = z.object({\r\n code: z.string().min(1).max(50),\r\n name: z.string().min(1).max(200),\r\n order: z.number().int().min(0),\r\n isRepeatable: z.boolean().default(false),\r\n repeatMinInstances: z.number().int().min(0).optional(),\r\n repeatMaxInstances: z.number().int().min(1).optional(),\r\n repeatControlVarCode: z.string().optional(),\r\n repeatInstanceLabel: z.string().optional(),\r\n conditions: z.array(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateFormPageSchema = createFormPageSchema.partial()\r\n\r\n// ─── FormRoster ───────────────────────────────────\r\n\r\nexport const createFormRosterSchema = z.object({\r\n code: z.string().min(1).max(50),\r\n name: z.string().min(1).max(200),\r\n rosterType: z.enum(['check', 'list', 'collection', 'collection_extend']),\r\n order: z.number().int().min(0),\r\n pilotVariableCode: z.string().optional(),\r\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\r\n conditions: z.array(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateFormRosterSchema = createFormRosterSchema.partial()\r\n\r\n// ─── FormVariable ─────────────────────────────────\r\n\r\nexport const createFormVariableSchema = z.object({\r\n code: z.string().min(1).max(50),\r\n name: z.string().min(1).max(200),\r\n type: z.string().min(1),\r\n order: z.number().int().min(0),\r\n isRequired: z.boolean().default(false),\r\n isReadonly: z.boolean().default(false),\r\n isHidden: z.boolean().default(false),\r\n defaultValue: z.unknown().optional(),\r\n placeholder: z.string().optional(),\r\n description: z.string().max(1000).optional(),\r\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\r\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: z.string() })).optional(),\r\n conditions: z.array(z.unknown()).optional(),\r\n expression: z.string().optional(),\r\n dataSourceId: z.string().optional(),\r\n dataSourceDependencies: z.record(z.string()).optional(),\r\n style: z.record(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n templateId: z.string().optional(),\r\n templateOverrides: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateFormVariableSchema = createFormVariableSchema.partial()\r\n\r\n// ─── Scope ────────────────────────────────────────\r\n\r\nconst localizedSchema = z.union([z.string(), z.record(z.string())])\r\n\r\nexport const createScopeSchema = z.object({\r\n code: z.string().min(1).max(80),\r\n name: localizedSchema,\r\n description: localizedSchema.optional(),\r\n tenantId: z.string().optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n /** Scope-level headers — encrypted server-side (requires MOSOBI_ENCRYPTION_KEY). */\r\n headers: z.record(z.string()).optional(),\r\n})\r\n\r\n/**\r\n * Update payload for a scope. `code` is immutable to keep template\r\n * references stable; `name`, `description` and `headers` remain editable.\r\n */\r\nexport const updateScopeSchema = z.object({\r\n name: localizedSchema.optional(),\r\n description: localizedSchema.optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n headers: z.record(z.string()).optional(),\r\n})\r\n\r\n// ─── VariableTemplate ────────────────────────────\r\n\r\nconst VARIABLE_TYPES = [\r\n 'text', 'textarea', 'number', 'date', 'datetime', 'time',\r\n 'select', 'multiselect', 'checkbox', 'radio', 'file', 'image',\r\n 'email', 'gps', 'rating', 'calculated', 'hidden', 'label',\r\n 'panel', 'richtext', 'listradio', 'photo',\r\n] as const\r\n\r\nexport const createVariableTemplateSchema = z.object({\r\n code: z.string().min(1).max(80),\r\n name: localizedSchema,\r\n variableType: z.enum(VARIABLE_TYPES),\r\n tenantId: z.string().optional(),\r\n description: localizedSchema.optional(),\r\n placeholder: localizedSchema.optional(),\r\n isRequired: z.boolean().optional(),\r\n isReadonly: z.boolean().optional(),\r\n isHidden: z.boolean().optional(),\r\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\r\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\r\n conditions: z.array(z.unknown()).optional(),\r\n expression: z.string().optional(),\r\n dataSourceId: z.string().optional(),\r\n dataSourceDependencies: z.record(z.string()).optional(),\r\n style: z.record(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\n/**\r\n * Update payload — `code` and `name` are intentionally absent (immutable).\r\n * Zod `.strict()` would reject unknown keys; we use `.strip()` (the default)\r\n * so callers that forward extra fields are tolerated. The service still\r\n * guards against `code`/`name` defensively.\r\n */\r\nexport const updateVariableTemplateSchema = z.object({\r\n variableType: z.enum(VARIABLE_TYPES).optional(),\r\n description: localizedSchema.optional(),\r\n placeholder: localizedSchema.optional(),\r\n isRequired: z.boolean().optional(),\r\n isReadonly: z.boolean().optional(),\r\n isHidden: z.boolean().optional(),\r\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\r\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\r\n conditions: z.array(z.unknown()).optional(),\r\n expression: z.string().optional(),\r\n dataSourceId: z.string().optional(),\r\n dataSourceDependencies: z.record(z.string()).optional(),\r\n style: z.record(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n}).strict()\r\n\r\n// ─── DataSourceConfig ────────────────────────────\r\n\r\nexport const createDataSourceSchema = z.object({\r\n code: z.string().min(1).max(80),\r\n name: localizedSchema,\r\n url: z.string().url(),\r\n method: z.enum(['GET', 'POST']).default('GET'),\r\n queryParam: z.string().default('q'),\r\n valueField: z.string().min(1),\r\n labelField: z.string().min(1),\r\n /** Per-source headers — encrypted server-side (requires MOSOBI_ENCRYPTION_KEY). */\r\n headersOverride: z.record(z.string()).optional(),\r\n /** URL query param name → variable code mapping. */\r\n dependencies: z.record(z.string()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\n/** Partial update — every field is optional, `code` is immutable in practice. */\r\nexport const updateDataSourceSchema = createDataSourceSchema.partial()\r\n\r\n// ─── FormSubmission ───────────────────────────────\r\n\r\nexport const createSubmissionSchema = z.object({\r\n formId: z.string().min(1),\r\n tenantId: z.string().optional(),\r\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).default('draft'),\r\n data: z.record(z.unknown()),\r\n submittedBy: z.string().optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\nexport const updateSubmissionSchema = z.object({\r\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).optional(),\r\n data: z.record(z.unknown()).optional(),\r\n metadata: z.record(z.unknown()).optional(),\r\n})\r\n\r\n// ─── Pagination ───────────────────────────────────\r\n\r\nexport const paginationSchema = z.object({\r\n page: z.coerce.number().int().min(1).default(1),\r\n pageSize: z.coerce.number().int().min(1).max(100).default(20),\r\n search: z.string().optional(),\r\n tenantId: z.string().optional(),\r\n})\r\n","/**\r\n * createFormRouter — framework-agnostic route definitions.\r\n *\r\n * Returns a set of route handlers that can be mounted on:\r\n * - Express: app.use('/api/forms', createFormRouter(prisma).expressRouter())\r\n * - Fastify: app.register(createFormRouter(prisma).fastifyPlugin)\r\n * - Next.js: export const GET/POST = createFormRouter(prisma).nextHandler\r\n *\r\n * For simplicity, we return plain handler functions.\r\n * The host app mounts them using its own framework.\r\n */\r\n\r\nimport type { PrismaClient } from '../generated/prisma'\r\nimport { FormService } from './services/form.service'\r\nimport { ScopeService } from './services/scope.service'\r\nimport { DataSourceService } from './services/datasource.service'\r\nimport type { AuthMiddleware, IRequestContext } from './middleware/auth.middleware'\r\nimport { noAuth } from './middleware/auth.middleware'\r\nimport { ApiError, successResponse, paginatedResponse } from './middleware/error.middleware'\r\nimport {\r\n createFormTypeSchema, updateFormTypeSchema,\r\n createFormDefinitionSchema, updateFormDefinitionSchema,\r\n createFormPageSchema, updateFormPageSchema,\r\n createFormRosterSchema, updateFormRosterSchema,\r\n createFormVariableSchema, updateFormVariableSchema,\r\n createSubmissionSchema, updateSubmissionSchema,\r\n createScopeSchema, updateScopeSchema,\r\n createVariableTemplateSchema, updateVariableTemplateSchema,\r\n createDataSourceSchema, updateDataSourceSchema,\r\n paginationSchema,\r\n} from './middleware/validation.middleware'\r\n\r\nexport interface FormRouterOptions {\r\n prisma: PrismaClient\r\n auth?: AuthMiddleware\r\n}\r\n\r\n/** A framework-agnostic request object */\r\nexport interface RouteRequest {\r\n method: string\r\n path: string\r\n params: Record<string, string>\r\n query: Record<string, string | undefined>\r\n body: unknown\r\n headers: Record<string, string | string[] | undefined>\r\n}\r\n\r\n/** A framework-agnostic response */\r\nexport interface RouteResponse {\r\n status: number\r\n body: unknown\r\n}\r\n\r\ntype RouteHandler = (req: RouteRequest) => Promise<RouteResponse>\r\n\r\nexport interface FormRouter {\r\n /** Handle a request — match path and method, return response */\r\n handle: (req: RouteRequest) => Promise<RouteResponse>\r\n /** All registered route handlers for advanced usage */\r\n routes: Map<string, RouteHandler>\r\n}\r\n\r\n/**\r\n * Tracks Prisma clients that have already had their default scope provisioned.\r\n * Kept module-scope so re-instantiating `createFormRouter` with the same\r\n * client is a cheap no-op. `WeakSet` lets the entries disappear if the\r\n * client is garbage-collected (tests that spin up disposable clients).\r\n */\r\nconst initialisedClients = new WeakSet<PrismaClient>()\r\n\r\n/**\r\n * Ensure the implicit `tenantId='default'` ships with at least one scope\r\n * (`code='default'`) so a fresh deployment is usable out of the box.\r\n *\r\n * The whole call is fire-and-forget: failures are logged but do not block\r\n * `createFormRouter`. The upsert is idempotent (relies on the\r\n * `@@unique([code, tenantId])` constraint), so concurrent boots are safe.\r\n */\r\nasync function initializeDefaults(prisma: PrismaClient): Promise<void> {\r\n await prisma.scope.upsert({\r\n where: { code_tenantId: { code: 'default', tenantId: 'default' } },\r\n update: {},\r\n create: {\r\n code: 'default',\r\n name: JSON.stringify({ fr: 'Scope par défaut', en: 'Default Scope' }),\r\n tenantId: 'default',\r\n },\r\n })\r\n}\r\n\r\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\r\n const { prisma, auth = noAuth } = options\r\n\r\n if (!initialisedClients.has(prisma)) {\r\n initialisedClients.add(prisma)\r\n // Opportunistic: never block router construction. Errors (DB not\r\n // reachable yet at boot, etc.) surface in the logs but the router\r\n // remains fully functional for routes that don't need the default.\r\n initializeDefaults(prisma).catch((err) => {\r\n console.error('[form-server] initializeDefaults failed:', err)\r\n })\r\n }\r\n\r\n const service = new FormService(prisma)\r\n const scopeService = new ScopeService(prisma)\r\n const dataSourceService = new DataSourceService(prisma)\r\n const routes = new Map<string, RouteHandler>()\r\n\r\n async function withAuth(req: RouteRequest): Promise<IRequestContext> {\r\n const ctx = await auth({ headers: req.headers as any, query: req.query as any })\r\n if (!ctx) throw ApiError.unauthorized()\r\n return ctx\r\n }\r\n\r\n function ok(data: unknown, status = 200): RouteResponse {\r\n return { status, body: successResponse(data) }\r\n }\r\n\r\n function paginated(items: unknown[], total: number, page: number, pageSize: number): RouteResponse {\r\n return { status: 200, body: paginatedResponse(items, total, page, pageSize) }\r\n }\r\n\r\n // ─── FormType routes ────────────────────\r\n\r\n routes.set('GET /form-types', async (req) => {\r\n await withAuth(req)\r\n const types = await service.getFormTypes()\r\n return ok(types)\r\n })\r\n\r\n routes.set('GET /form-types/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await service.getFormType(req.params['id']!))\r\n })\r\n\r\n routes.set('POST /form-types', async (req) => {\r\n await withAuth(req)\r\n const data = createFormTypeSchema.parse(req.body)\r\n return ok(await service.createFormType(data), 201)\r\n })\r\n\r\n routes.set('PUT /form-types/:id', async (req) => {\r\n await withAuth(req)\r\n const data = updateFormTypeSchema.parse(req.body)\r\n return ok(await service.updateFormType(req.params['id']!, data))\r\n })\r\n\r\n routes.set('DELETE /form-types/:id', async (req) => {\r\n await withAuth(req)\r\n await service.deleteFormType(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── FormDefinition routes ──────────────\r\n\r\n routes.set('GET /forms', async (req) => {\r\n await withAuth(req)\r\n const params = paginationSchema.parse(req.query)\r\n const { items, total } = await service.getFormDefinitions(params)\r\n return paginated(items, total, params.page, params.pageSize)\r\n })\r\n\r\n routes.set('GET /forms/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await service.getFormDefinition(req.params['id']!))\r\n })\r\n\r\n routes.set('GET /forms/:id/resolved', async (req) => {\r\n await withAuth(req)\r\n return ok(await service.getResolvedFormDefinition(req.params['id']!))\r\n })\r\n\r\n routes.set('POST /forms', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = createFormDefinitionSchema.parse(req.body)\r\n return ok(await service.createFormDefinition(data, ctx), 201)\r\n })\r\n\r\n routes.set('PUT /forms/:id', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = updateFormDefinitionSchema.parse(req.body)\r\n return ok(await service.updateFormDefinition(req.params['id']!, data, ctx))\r\n })\r\n\r\n routes.set('DELETE /forms/:id', async (req) => {\r\n await withAuth(req)\r\n await service.deleteFormDefinition(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n routes.set('GET /forms/:id/export', async (req) => {\r\n await withAuth(req)\r\n const json = await service.exportForm(req.params['id']!)\r\n return { status: 200, body: json }\r\n })\r\n\r\n routes.set('POST /forms/import', async (req) => {\r\n await withAuth(req)\r\n const { json, tenantId } = req.body as { json: string; tenantId?: string }\r\n const formId = await service.importForm(json, tenantId)\r\n return ok({ formId }, 201)\r\n })\r\n\r\n // ─── FormPage routes ────────────────────\r\n\r\n routes.set('POST /forms/:formId/pages', async (req) => {\r\n await withAuth(req)\r\n const data = createFormPageSchema.parse(req.body)\r\n return ok(await service.createFormPage(req.params['formId']!, data), 201)\r\n })\r\n\r\n routes.set('PUT /pages/:id', async (req) => {\r\n await withAuth(req)\r\n const data = updateFormPageSchema.parse(req.body)\r\n return ok(await service.updateFormPage(req.params['id']!, data))\r\n })\r\n\r\n routes.set('DELETE /pages/:id', async (req) => {\r\n await withAuth(req)\r\n await service.deleteFormPage(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── FormRoster routes ──────────────────\r\n\r\n routes.set('POST /pages/:pageId/rosters', async (req) => {\r\n await withAuth(req)\r\n const data = createFormRosterSchema.parse(req.body)\r\n return ok(await service.createFormRoster(req.params['pageId']!, data), 201)\r\n })\r\n\r\n routes.set('PUT /rosters/:id', async (req) => {\r\n await withAuth(req)\r\n const data = updateFormRosterSchema.parse(req.body)\r\n return ok(await service.updateFormRoster(req.params['id']!, data))\r\n })\r\n\r\n routes.set('DELETE /rosters/:id', async (req) => {\r\n await withAuth(req)\r\n await service.deleteFormRoster(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── FormVariable routes ────────────────\r\n\r\n routes.set('POST /pages/:pageId/variables', async (req) => {\r\n await withAuth(req)\r\n const data = createFormVariableSchema.parse(req.body)\r\n return ok(await service.createFormVariable({ ...data, pageId: req.params['pageId']! }), 201)\r\n })\r\n\r\n routes.set('POST /rosters/:rosterId/variables', async (req) => {\r\n await withAuth(req)\r\n const data = createFormVariableSchema.parse(req.body)\r\n return ok(await service.createFormVariable({ ...data, rosterId: req.params['rosterId']! }), 201)\r\n })\r\n\r\n routes.set('PUT /variables/:id', async (req) => {\r\n await withAuth(req)\r\n const data = updateFormVariableSchema.parse(req.body)\r\n return ok(await service.updateFormVariable(req.params['id']!, data))\r\n })\r\n\r\n routes.set('DELETE /variables/:id', async (req) => {\r\n await withAuth(req)\r\n await service.deleteFormVariable(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── Submission routes ──────────────────\r\n\r\n routes.set('GET /forms/:formId/submissions', async (req) => {\r\n await withAuth(req)\r\n const params = paginationSchema.parse(req.query)\r\n const { items, total } = await service.getSubmissions({\r\n formId: req.params['formId']!,\r\n ...params,\r\n })\r\n return paginated(items, total, params.page, params.pageSize)\r\n })\r\n\r\n routes.set('GET /submissions/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await service.getSubmission(req.params['id']!))\r\n })\r\n\r\n routes.set('POST /submissions', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = createSubmissionSchema.parse(req.body)\r\n return ok(await service.createSubmission(data, ctx), 201)\r\n })\r\n\r\n routes.set('PUT /submissions/:id', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = updateSubmissionSchema.parse(req.body)\r\n return ok(await service.updateSubmission(req.params['id']!, data, ctx))\r\n })\r\n\r\n // ─── Scope routes ───────────────────────\r\n\r\n routes.set('GET /scopes', async (req) => {\r\n const ctx = await withAuth(req)\r\n const params = paginationSchema.parse(req.query)\r\n const { items, total } = await scopeService.listScopes(\r\n { tenantId: params.tenantId, page: params.page, pageSize: params.pageSize },\r\n ctx,\r\n )\r\n return paginated(items, total, params.page, params.pageSize)\r\n })\r\n\r\n routes.set('GET /scopes/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await scopeService.getScopeById(req.params['id']!))\r\n })\r\n\r\n routes.set('POST /scopes', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = createScopeSchema.parse(req.body)\r\n return ok(await scopeService.createScope(data, ctx), 201)\r\n })\r\n\r\n routes.set('PUT /scopes/:id', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = updateScopeSchema.parse(req.body)\r\n return ok(await scopeService.updateScope(req.params['id']!, data, ctx))\r\n })\r\n\r\n routes.set('DELETE /scopes/:id', async (req) => {\r\n await withAuth(req)\r\n await scopeService.deleteScope(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── VariableTemplate routes ────────────\r\n\r\n routes.set('GET /scopes/:scopeId/templates', async (req) => {\r\n await withAuth(req)\r\n const params = paginationSchema.parse(req.query)\r\n const { items, total } = await scopeService.listTemplates(req.params['scopeId']!, {\r\n page: params.page,\r\n pageSize: params.pageSize,\r\n })\r\n return paginated(items, total, params.page, params.pageSize)\r\n })\r\n\r\n routes.set('POST /scopes/:scopeId/templates', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = createVariableTemplateSchema.parse(req.body)\r\n return ok(await scopeService.createTemplate(req.params['scopeId']!, data, ctx), 201)\r\n })\r\n\r\n routes.set('GET /templates/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await scopeService.getTemplateById(req.params['id']!))\r\n })\r\n\r\n routes.set('PUT /templates/:id', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = updateVariableTemplateSchema.parse(req.body)\r\n return ok(await scopeService.updateTemplate(req.params['id']!, data, ctx))\r\n })\r\n\r\n routes.set('DELETE /templates/:id', async (req) => {\r\n await withAuth(req)\r\n await scopeService.deleteTemplate(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // ─── DataSourceConfig routes ────────────\r\n\r\n routes.set('GET /scopes/:scopeId/datasources', async (req) => {\r\n await withAuth(req)\r\n const params = paginationSchema.parse(req.query)\r\n const { items, total } = await dataSourceService.listDataSources(\r\n req.params['scopeId']!,\r\n { page: params.page, pageSize: params.pageSize },\r\n )\r\n return paginated(items, total, params.page, params.pageSize)\r\n })\r\n\r\n routes.set('POST /scopes/:scopeId/datasources', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = createDataSourceSchema.parse(req.body)\r\n return ok(\r\n await dataSourceService.createDataSource(req.params['scopeId']!, data, ctx),\r\n 201,\r\n )\r\n })\r\n\r\n routes.set('GET /datasources/:id', async (req) => {\r\n await withAuth(req)\r\n return ok(await dataSourceService.getDataSourceById(req.params['id']!))\r\n })\r\n\r\n routes.set('PUT /datasources/:id', async (req) => {\r\n const ctx = await withAuth(req)\r\n const data = updateDataSourceSchema.parse(req.body)\r\n return ok(await dataSourceService.updateDataSource(req.params['id']!, data, ctx))\r\n })\r\n\r\n routes.set('DELETE /datasources/:id', async (req) => {\r\n await withAuth(req)\r\n await dataSourceService.deleteDataSource(req.params['id']!)\r\n return ok(null, 204)\r\n })\r\n\r\n // Aggregated lookup for the renderer — one call, all configs + decrypted\r\n // scope-level headers, ordered to match the form's scopeIds priority.\r\n routes.set('GET /forms/:formId/datasources', async (req) => {\r\n await withAuth(req)\r\n const form = await service.getFormDefinition(req.params['formId']!)\r\n // `form.scopes` is the raw pivot rows, already ordered by `order` asc\r\n // (see getFormDefinition's include). Map to scopeIds for the service.\r\n const scopeIds = (form.scopes ?? []).map((s: { scopeId: string }) => s.scopeId)\r\n const { items, scopeHeaders } = await dataSourceService.getDataSourcesByScopeIds(scopeIds)\r\n return ok({ items, scopeHeaders })\r\n })\r\n\r\n // ─── Router handler ─────────────────────\r\n\r\n function matchRoute(method: string, path: string): { handler: RouteHandler; params: Record<string, string> } | null {\r\n for (const [pattern, handler] of routes) {\r\n const [routeMethod, routePath] = pattern.split(' ')\r\n if (routeMethod !== method) continue\r\n\r\n const params = matchPath(routePath!, path)\r\n if (params) return { handler, params }\r\n }\r\n return null\r\n }\r\n\r\n return {\r\n routes,\r\n handle: async (req: RouteRequest): Promise<RouteResponse> => {\r\n try {\r\n const matched = matchRoute(req.method, req.path)\r\n if (!matched) return { status: 404, body: { status: 404, message: 'Route not found', data: null } }\r\n\r\n req.params = matched.params\r\n return await matched.handler(req)\r\n } catch (error) {\r\n if (error instanceof ApiError) {\r\n return { status: error.statusCode, body: { status: error.statusCode, message: error.message, data: null, errors: error.errors } }\r\n }\r\n if (error instanceof Error && error.name === 'ZodError') {\r\n const zodError = error as any\r\n return { status: 400, body: { status: 400, message: 'Validation error', data: null, errors: zodError.issues?.map((i: any) => i.message) } }\r\n }\r\n return { status: 500, body: { status: 500, message: 'Internal server error', data: null } }\r\n }\r\n },\r\n }\r\n}\r\n\r\n/** Simple path matcher: /forms/:id matches /forms/abc123 */\r\nfunction matchPath(pattern: string, actual: string): Record<string, string> | null {\r\n const patternParts = pattern.split('/').filter(Boolean)\r\n const actualParts = actual.split('/').filter(Boolean)\r\n\r\n if (patternParts.length !== actualParts.length) return null\r\n\r\n const params: Record<string, string> = {}\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const pp = patternParts[i]!\r\n const ap = actualParts[i]!\r\n if (pp.startsWith(':')) {\r\n params[pp.slice(1)] = ap\r\n } else if (pp !== ap) {\r\n return null\r\n }\r\n }\r\n\r\n return params\r\n}\r\n"]}