@msbci/form-server 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +17 -17
package/README.md
CHANGED
|
@@ -158,6 +158,12 @@ datasource db {
|
|
|
158
158
|
|
|
159
159
|
All inputs validated with Zod. Errors returned as `{ status, message, data, errors }`.
|
|
160
160
|
|
|
161
|
+
## v1.2.0
|
|
162
|
+
|
|
163
|
+
- `LocalizedString` sérialisé en JSON côté persistence
|
|
164
|
+
- Compatible avec les schémas multilingues `@msbci/form-core` v1.2.0
|
|
165
|
+
- No breaking changes
|
|
166
|
+
|
|
161
167
|
## What's new in v1.1.0
|
|
162
168
|
|
|
163
169
|
- Version aligned with `@msbci/form-core` v1.1.0. The server transparently persists the extended `IFieldResponseMetadata` (8 new optional fields including `displayValue`, `variableLabel`, page / roster context) when host applications forward responses from `FormRenderer` — no API or schema change required.
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var formCore=require('@msbci/form-core'),zod=require('zod');var g=class m extends Error{constructor(a,r,i){super(r);this.statusCode=a;this.errors=i;this.name="ApiError";}static notFound(a="Resource not found"){return new m(404,a)}static badRequest(a,r){return new m(400,a,r)}static unauthorized(a="Unauthorized"){return new m(401,a)}static conflict(a){return new m(409,a)}};function x(m,e="Success"){return {status:200,message:e,data:m}}function T(m,e,a,r){return {status:200,message:"Success",data:{items:m,total:e,page:a,pageSize:r,totalPages:Math.ceil(e/r)}}}function u(m){return m==null?null:JSON.stringify(m)}function f(m){if(m)try{return JSON.parse(m)}catch{return}}var b=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let a=await this.prisma.formType.findUnique({where:{id:e}});if(!a)throw g.notFound("FormType not found");return a}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:u(e.metadata)}})}async updateFormType(e,a){let{metadata:r,...i}=a;return this.prisma.formType.update({where:{id:e},data:{...i,...r!==void 0?{metadata:u(r)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let a={};e.tenantId&&(a.tenantId=e.tenantId),e.search&&(a.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[r,i]=await Promise.all([this.prisma.formDefinition.findMany({where:a,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:a})]);return {items:r,total:i}}async getFormDefinition(e){let a=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!a)throw g.notFound("FormDefinition not found");return a}async createFormDefinition(e,a){return this.prisma.formDefinition.create({data:{...e,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateFormDefinition(e,a,r){let{metadata:i,...s}=a;return this.prisma.formDefinition.update({where:{id:e},data:{...s,...i!==void 0?{metadata:u(i)}:{},updatedBy:r?.userId}})}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,a){return this.prisma.formPage.create({data:{...a,formId:e,conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormPage(e,a){let{conditions:r,metadata:i,...s}=a;return this.prisma.formPage.update({where:{id:e},data:{...s,...r!==void 0?{conditions:u(r)}:{},...i!==void 0?{metadata:u(i)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,a){return this.prisma.formRoster.create({data:{...a,pageId:e,options:u(a.options),conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormRoster(e,a){let{options:r,conditions:i,metadata:s,...d}=a;return this.prisma.formRoster.update({where:{id:e},data:{...d,...r!==void 0?{options:u(r)}:{},...i!==void 0?{conditions:u(i)}:{},...s!==void 0?{metadata:u(s)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw g.badRequest("Variable must belong to a page or a roster");return this.prisma.formVariable.create({data:{...e,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:u(e.options),validationRules:u(e.validationRules),conditions:u(e.conditions),dataSourceDependencies:u(e.dataSourceDependencies),style:u(e.style),metadata:u(e.metadata)}})}async updateFormVariable(e,a){let{options:r,validationRules:i,conditions:s,dataSourceDependencies:d,style:c,metadata:y,defaultValue:t,...o}=a;return this.prisma.formVariable.update({where:{id:e},data:{...o,...t!==void 0?{defaultValue:String(t)}:{},...r!==void 0?{options:u(r)}:{},...i!==void 0?{validationRules:u(i)}:{},...s!==void 0?{conditions:u(s)}:{},...d!==void 0?{dataSourceDependencies:u(d)}:{},...c!==void 0?{style:u(c)}:{},...y!==void 0?{metadata:u(y)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let a={formId:e.formId};e.status&&(a.status=e.status),e.tenantId&&(a.tenantId=e.tenantId);let[r,i]=await Promise.all([this.prisma.formSubmission.findMany({where:a,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:a})]);return {items:r,total:i}}async getSubmission(e){let a=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!a)throw g.notFound("Submission not found");return a}async createSubmission(e,a){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateSubmission(e,a,r){return this.prisma.formSubmission.update({where:{id:e},data:{...a.status?{status:a.status}:{},...a.data?{data:JSON.stringify(a.data)}:{},...a.metadata!==void 0?{metadata:u(a.metadata)}:{},updatedBy:r?.userId}})}async exportForm(e){let a=await this.getFormDefinition(e),r=this.dbToFormDefinition(a);return formCore.serializeForm(r)}async importForm(e,a){let r=formCore.deserializeForm(e),i=await this.createFormDefinition({code:r.code,name:r.name,description:r.description,version:r.version,isPublished:r.isPublished,tenantId:a,formTypeId:r.formTypeId});for(let s of r.pages){let d=await this.createFormPage(i.id,{code:s.code,name:s.name,order:s.order,isRepeatable:s.isRepeatable,repeatMinInstances:s.repeatConfig?.min,repeatMaxInstances:s.repeatConfig?.max,repeatControlVarCode:s.repeatConfig?.controlVariableCode,repeatInstanceLabel:s.repeatConfig?.instanceLabel});for(let c of s.variables)await this.createFormVariable(this.extractVariableData(c,d.id,void 0));for(let c of s.rosters){let y=await this.createFormRoster(d.id,{code:c.code,name:c.name,rosterType:c.rosterType,order:c.order,pilotVariableCode:c.pilotVariableCode,options:c.options});for(let t of c.variables)await this.createFormVariable(this.extractVariableData(t,void 0,y.id));}}return i.id}extractVariableData(e,a,r){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:a,rosterId:r,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata}}dbToFormDefinition(e){return {id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,metadata:f(e.metadata),pages:(e.pages??[]).map(a=>({id:a.id,code:a.code,name:a.name,order:a.order,isRepeatable:a.isRepeatable,repeatConfig:a.isRepeatable?{min:a.repeatMinInstances??void 0,max:a.repeatMaxInstances??void 0,controlVariableCode:a.repeatControlVarCode??void 0,instanceLabel:a.repeatInstanceLabel??void 0}:void 0,conditions:f(a.conditions)??[],variables:(a.variables??[]).map(r=>this.dbToVariable(r)),rosters:(a.rosters??[]).map(r=>({id:r.id,code:r.code,name:r.name,rosterType:r.rosterType,order:r.order,pilotVariableCode:r.pilotVariableCode??void 0,options:f(r.options),conditions:f(r.conditions)??[],variables:(r.variables??[]).map(i=>this.dbToVariable(i))}))}))}}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:f(e.options),validationRules:f(e.validationRules),conditions:f(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:f(e.dataSourceDependencies),style:f(e.style),metadata:f(e.metadata)}}};var k=async()=>({});var h=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),description:zod.z.string().max(1e3).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),P=h.partial(),R=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),description:zod.z.string().max(1e3).optional(),version:zod.z.string().default("1.0.0"),isPublished:zod.z.boolean().default(false),tenantId:zod.z.string().optional(),formTypeId:zod.z.string().optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),V=R.partial(),S=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),order:zod.z.number().int().min(0),isRepeatable:zod.z.boolean().default(false),repeatMinInstances:zod.z.number().int().min(0).optional(),repeatMaxInstances:zod.z.number().int().min(1).optional(),repeatControlVarCode:zod.z.string().optional(),repeatInstanceLabel:zod.z.string().optional(),conditions:zod.z.array(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),D=S.partial(),I=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),rosterType:zod.z.enum(["check","list","collection","collection_extend"]),order:zod.z.number().int().min(0),pilotVariableCode:zod.z.string().optional(),options:zod.z.array(zod.z.object({label:zod.z.string(),value:zod.z.unknown(),metadata:zod.z.record(zod.z.unknown()).optional()})).optional(),conditions:zod.z.array(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),C=I.partial(),w=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),type:zod.z.string().min(1),order:zod.z.number().int().min(0),isRequired:zod.z.boolean().default(false),isReadonly:zod.z.boolean().default(false),isHidden:zod.z.boolean().default(false),defaultValue:zod.z.unknown().optional(),placeholder:zod.z.string().optional(),description:zod.z.string().max(1e3).optional(),options:zod.z.array(zod.z.object({label:zod.z.string(),value:zod.z.unknown(),metadata:zod.z.record(zod.z.unknown()).optional()})).optional(),validationRules:zod.z.array(zod.z.object({type:zod.z.string(),value:zod.z.unknown().optional(),message:zod.z.string()})).optional(),conditions:zod.z.array(zod.z.unknown()).optional(),expression:zod.z.string().optional(),dataSourceId:zod.z.string().optional(),dataSourceDependencies:zod.z.record(zod.z.string()).optional(),style:zod.z.record(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),E=w.partial(),M=zod.z.object({formId:zod.z.string().min(1),tenantId:zod.z.string().optional(),status:zod.z.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:zod.z.record(zod.z.unknown()),submittedBy:zod.z.string().optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),B=zod.z.object({status:zod.z.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:zod.z.record(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),F=zod.z.object({page:zod.z.coerce.number().int().min(1).default(1),pageSize:zod.z.coerce.number().int().min(1).max(100).default(20),search:zod.z.string().optional(),tenantId:zod.z.string().optional()});function H(m){let{prisma:e,auth:a=k}=m,r=new b(e),i=new Map;async function s(t){let o=await a({headers:t.headers,query:t.query});if(!o)throw g.unauthorized();return o}function d(t,o=200){return {status:o,body:x(t)}}function c(t,o,p,l){return {status:200,body:T(t,o,p,l)}}i.set("GET /form-types",async t=>{await s(t);let o=await r.getFormTypes();return d(o)}),i.set("GET /form-types/:id",async t=>(await s(t),d(await r.getFormType(t.params.id)))),i.set("POST /form-types",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormType(o),201)}),i.set("PUT /form-types/:id",async t=>{await s(t);let o=P.parse(t.body);return d(await r.updateFormType(t.params.id,o))}),i.set("DELETE /form-types/:id",async t=>(await s(t),await r.deleteFormType(t.params.id),d(null,204))),i.set("GET /forms",async t=>{await s(t);let o=F.parse(t.query),{items:p,total:l}=await r.getFormDefinitions(o);return c(p,l,o.page,o.pageSize)}),i.set("GET /forms/:id",async t=>(await s(t),d(await r.getFormDefinition(t.params.id)))),i.set("POST /forms",async t=>{let o=await s(t),p=R.parse(t.body);return d(await r.createFormDefinition(p,o),201)}),i.set("PUT /forms/:id",async t=>{let o=await s(t),p=V.parse(t.body);return d(await r.updateFormDefinition(t.params.id,p,o))}),i.set("DELETE /forms/:id",async t=>(await s(t),await r.deleteFormDefinition(t.params.id),d(null,204))),i.set("GET /forms/:id/export",async t=>(await s(t),{status:200,body:await r.exportForm(t.params.id)})),i.set("POST /forms/import",async t=>{await s(t);let{json:o,tenantId:p}=t.body,l=await r.importForm(o,p);return d({formId:l},201)}),i.set("POST /forms/:formId/pages",async t=>{await s(t);let o=S.parse(t.body);return d(await r.createFormPage(t.params.formId,o),201)}),i.set("PUT /pages/:id",async t=>{await s(t);let o=D.parse(t.body);return d(await r.updateFormPage(t.params.id,o))}),i.set("DELETE /pages/:id",async t=>(await s(t),await r.deleteFormPage(t.params.id),d(null,204))),i.set("POST /pages/:pageId/rosters",async t=>{await s(t);let o=I.parse(t.body);return d(await r.createFormRoster(t.params.pageId,o),201)}),i.set("PUT /rosters/:id",async t=>{await s(t);let o=C.parse(t.body);return d(await r.updateFormRoster(t.params.id,o))}),i.set("DELETE /rosters/:id",async t=>(await s(t),await r.deleteFormRoster(t.params.id),d(null,204))),i.set("POST /pages/:pageId/variables",async t=>{await s(t);let o=w.parse(t.body);return d(await r.createFormVariable({...o,pageId:t.params.pageId}),201)}),i.set("POST /rosters/:rosterId/variables",async t=>{await s(t);let o=w.parse(t.body);return d(await r.createFormVariable({...o,rosterId:t.params.rosterId}),201)}),i.set("PUT /variables/:id",async t=>{await s(t);let o=E.parse(t.body);return d(await r.updateFormVariable(t.params.id,o))}),i.set("DELETE /variables/:id",async t=>(await s(t),await r.deleteFormVariable(t.params.id),d(null,204))),i.set("GET /forms/:formId/submissions",async t=>{await s(t);let o=F.parse(t.query),{items:p,total:l}=await r.getSubmissions({formId:t.params.formId,...o});return c(p,l,o.page,o.pageSize)}),i.set("GET /submissions/:id",async t=>(await s(t),d(await r.getSubmission(t.params.id)))),i.set("POST /submissions",async t=>{let o=await s(t),p=M.parse(t.body);return d(await r.createSubmission(p,o),201)}),i.set("PUT /submissions/:id",async t=>{let o=await s(t),p=B.parse(t.body);return d(await r.updateSubmission(t.params.id,p,o))});function y(t,o){for(let[p,l]of i){let[j,z]=p.split(" ");if(j!==t)continue;let A=U(z,o);if(A)return {handler:l,params:A}}return null}return {routes:i,handle:async t=>{try{let o=y(t.method,t.path);return o?(t.params=o.params,await o.handler(t)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof g?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(l=>l.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function U(m,e){let a=m.split("/").filter(Boolean),r=e.split("/").filter(Boolean);if(a.length!==r.length)return null;let i={};for(let s=0;s<a.length;s++){let d=a[s],c=r[s];if(d.startsWith(":"))i[d.slice(1)]=c;else if(d!==c)return null}return i}exports.ApiError=g;exports.FormService=b;exports.createFormDefinitionSchema=R;exports.createFormPageSchema=S;exports.createFormRosterSchema=I;exports.createFormRouter=H;exports.createFormTypeSchema=h;exports.createFormVariableSchema=w;exports.createSubmissionSchema=M;exports.noAuth=k;exports.paginatedResponse=T;exports.paginationSchema=F;exports.successResponse=x;exports.updateFormDefinitionSchema=V;exports.updateFormPageSchema=D;exports.updateFormRosterSchema=C;exports.updateFormTypeSchema=P;exports.updateFormVariableSchema=E;exports.updateSubmissionSchema=B;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var formCore=require('@msbci/form-core'),zod=require('zod');var g=class m extends Error{constructor(a,r,i){super(r);this.statusCode=a;this.errors=i;this.name="ApiError";}static notFound(a="Resource not found"){return new m(404,a)}static badRequest(a,r){return new m(400,a,r)}static unauthorized(a="Unauthorized"){return new m(401,a)}static conflict(a){return new m(409,a)}};function T(m,e="Success"){return {status:200,message:e,data:m}}function k(m,e,a,r){return {status:200,message:"Success",data:{items:m,total:e,page:a,pageSize:r,totalPages:Math.ceil(e/r)}}}function u(m){return m==null?null:JSON.stringify(m)}function f(m){if(m)try{return JSON.parse(m)}catch{return}}function b(m){if(m!=null)return typeof m=="string"?m:JSON.stringify(m)}var w=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let a=await this.prisma.formType.findUnique({where:{id:e}});if(!a)throw g.notFound("FormType not found");return a}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:u(e.metadata)}})}async updateFormType(e,a){let{metadata:r,...i}=a;return this.prisma.formType.update({where:{id:e},data:{...i,...r!==void 0?{metadata:u(r)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let a={};e.tenantId&&(a.tenantId=e.tenantId),e.search&&(a.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[r,i]=await Promise.all([this.prisma.formDefinition.findMany({where:a,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:a})]);return {items:r,total:i}}async getFormDefinition(e){let a=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!a)throw g.notFound("FormDefinition not found");return a}async createFormDefinition(e,a){return this.prisma.formDefinition.create({data:{...e,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateFormDefinition(e,a,r){let{metadata:i,...s}=a;return this.prisma.formDefinition.update({where:{id:e},data:{...s,...i!==void 0?{metadata:u(i)}:{},updatedBy:r?.userId}})}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,a){return this.prisma.formPage.create({data:{...a,formId:e,conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormPage(e,a){let{conditions:r,metadata:i,...s}=a;return this.prisma.formPage.update({where:{id:e},data:{...s,...r!==void 0?{conditions:u(r)}:{},...i!==void 0?{metadata:u(i)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,a){return this.prisma.formRoster.create({data:{...a,pageId:e,options:u(a.options),conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormRoster(e,a){let{options:r,conditions:i,metadata:s,...d}=a;return this.prisma.formRoster.update({where:{id:e},data:{...d,...r!==void 0?{options:u(r)}:{},...i!==void 0?{conditions:u(i)}:{},...s!==void 0?{metadata:u(s)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw g.badRequest("Variable must belong to a page or a roster");return this.prisma.formVariable.create({data:{...e,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:u(e.options),validationRules:u(e.validationRules),conditions:u(e.conditions),dataSourceDependencies:u(e.dataSourceDependencies),style:u(e.style),metadata:u(e.metadata)}})}async updateFormVariable(e,a){let{options:r,validationRules:i,conditions:s,dataSourceDependencies:d,style:c,metadata:y,defaultValue:t,...o}=a;return this.prisma.formVariable.update({where:{id:e},data:{...o,...t!==void 0?{defaultValue:String(t)}:{},...r!==void 0?{options:u(r)}:{},...i!==void 0?{validationRules:u(i)}:{},...s!==void 0?{conditions:u(s)}:{},...d!==void 0?{dataSourceDependencies:u(d)}:{},...c!==void 0?{style:u(c)}:{},...y!==void 0?{metadata:u(y)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let a={formId:e.formId};e.status&&(a.status=e.status),e.tenantId&&(a.tenantId=e.tenantId);let[r,i]=await Promise.all([this.prisma.formSubmission.findMany({where:a,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:a})]);return {items:r,total:i}}async getSubmission(e){let a=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!a)throw g.notFound("Submission not found");return a}async createSubmission(e,a){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateSubmission(e,a,r){return this.prisma.formSubmission.update({where:{id:e},data:{...a.status?{status:a.status}:{},...a.data?{data:JSON.stringify(a.data)}:{},...a.metadata!==void 0?{metadata:u(a.metadata)}:{},updatedBy:r?.userId}})}async exportForm(e){let a=await this.getFormDefinition(e),r=this.dbToFormDefinition(a);return formCore.serializeForm(r)}async importForm(e,a){let r=formCore.deserializeForm(e),i=await this.createFormDefinition({code:r.code,name:b(r.name)??"",description:b(r.description),version:r.version,isPublished:r.isPublished,tenantId:a,formTypeId:r.formTypeId});for(let s of r.pages){let d=await this.createFormPage(i.id,{code:s.code,name:b(s.name)??"",order:s.order,isRepeatable:s.isRepeatable,repeatMinInstances:s.repeatConfig?.min,repeatMaxInstances:s.repeatConfig?.max,repeatControlVarCode:s.repeatConfig?.controlVariableCode,repeatInstanceLabel:b(s.repeatConfig?.instanceLabel)});for(let c of s.variables)await this.createFormVariable(this.extractVariableData(c,d.id,void 0));for(let c of s.rosters){let y=await this.createFormRoster(d.id,{code:c.code,name:b(c.name)??"",rosterType:c.rosterType,order:c.order,pilotVariableCode:c.pilotVariableCode,options:c.options});for(let t of c.variables)await this.createFormVariable(this.extractVariableData(t,void 0,y.id));}}return i.id}extractVariableData(e,a,r){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:a,rosterId:r,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata}}dbToFormDefinition(e){return {id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,metadata:f(e.metadata),pages:(e.pages??[]).map(a=>({id:a.id,code:a.code,name:a.name,order:a.order,isRepeatable:a.isRepeatable,repeatConfig:a.isRepeatable?{min:a.repeatMinInstances??void 0,max:a.repeatMaxInstances??void 0,controlVariableCode:a.repeatControlVarCode??void 0,instanceLabel:a.repeatInstanceLabel??void 0}:void 0,conditions:f(a.conditions)??[],variables:(a.variables??[]).map(r=>this.dbToVariable(r)),rosters:(a.rosters??[]).map(r=>({id:r.id,code:r.code,name:r.name,rosterType:r.rosterType,order:r.order,pilotVariableCode:r.pilotVariableCode??void 0,options:f(r.options),conditions:f(r.conditions)??[],variables:(r.variables??[]).map(i=>this.dbToVariable(i))}))}))}}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:f(e.options),validationRules:f(e.validationRules),conditions:f(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:f(e.dataSourceDependencies),style:f(e.style),metadata:f(e.metadata)}}};var P=async()=>({});var R=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),description:zod.z.string().max(1e3).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),V=R.partial(),S=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),description:zod.z.string().max(1e3).optional(),version:zod.z.string().default("1.0.0"),isPublished:zod.z.boolean().default(false),tenantId:zod.z.string().optional(),formTypeId:zod.z.string().optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),D=S.partial(),I=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),order:zod.z.number().int().min(0),isRepeatable:zod.z.boolean().default(false),repeatMinInstances:zod.z.number().int().min(0).optional(),repeatMaxInstances:zod.z.number().int().min(1).optional(),repeatControlVarCode:zod.z.string().optional(),repeatInstanceLabel:zod.z.string().optional(),conditions:zod.z.array(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),C=I.partial(),F=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),rosterType:zod.z.enum(["check","list","collection","collection_extend"]),order:zod.z.number().int().min(0),pilotVariableCode:zod.z.string().optional(),options:zod.z.array(zod.z.object({label:zod.z.string(),value:zod.z.unknown(),metadata:zod.z.record(zod.z.unknown()).optional()})).optional(),conditions:zod.z.array(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),E=F.partial(),h=zod.z.object({code:zod.z.string().min(1).max(50),name:zod.z.string().min(1).max(200),type:zod.z.string().min(1),order:zod.z.number().int().min(0),isRequired:zod.z.boolean().default(false),isReadonly:zod.z.boolean().default(false),isHidden:zod.z.boolean().default(false),defaultValue:zod.z.unknown().optional(),placeholder:zod.z.string().optional(),description:zod.z.string().max(1e3).optional(),options:zod.z.array(zod.z.object({label:zod.z.string(),value:zod.z.unknown(),metadata:zod.z.record(zod.z.unknown()).optional()})).optional(),validationRules:zod.z.array(zod.z.object({type:zod.z.string(),value:zod.z.unknown().optional(),message:zod.z.string()})).optional(),conditions:zod.z.array(zod.z.unknown()).optional(),expression:zod.z.string().optional(),dataSourceId:zod.z.string().optional(),dataSourceDependencies:zod.z.record(zod.z.string()).optional(),style:zod.z.record(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),M=h.partial(),z=zod.z.object({formId:zod.z.string().min(1),tenantId:zod.z.string().optional(),status:zod.z.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:zod.z.record(zod.z.unknown()),submittedBy:zod.z.string().optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),B=zod.z.object({status:zod.z.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:zod.z.record(zod.z.unknown()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),x=zod.z.object({page:zod.z.coerce.number().int().min(1).default(1),pageSize:zod.z.coerce.number().int().min(1).max(100).default(20),search:zod.z.string().optional(),tenantId:zod.z.string().optional()});function U(m){let{prisma:e,auth:a=P}=m,r=new w(e),i=new Map;async function s(t){let o=await a({headers:t.headers,query:t.query});if(!o)throw g.unauthorized();return o}function d(t,o=200){return {status:o,body:T(t)}}function c(t,o,p,l){return {status:200,body:k(t,o,p,l)}}i.set("GET /form-types",async t=>{await s(t);let o=await r.getFormTypes();return d(o)}),i.set("GET /form-types/:id",async t=>(await s(t),d(await r.getFormType(t.params.id)))),i.set("POST /form-types",async t=>{await s(t);let o=R.parse(t.body);return d(await r.createFormType(o),201)}),i.set("PUT /form-types/:id",async t=>{await s(t);let o=V.parse(t.body);return d(await r.updateFormType(t.params.id,o))}),i.set("DELETE /form-types/:id",async t=>(await s(t),await r.deleteFormType(t.params.id),d(null,204))),i.set("GET /forms",async t=>{await s(t);let o=x.parse(t.query),{items:p,total:l}=await r.getFormDefinitions(o);return c(p,l,o.page,o.pageSize)}),i.set("GET /forms/:id",async t=>(await s(t),d(await r.getFormDefinition(t.params.id)))),i.set("POST /forms",async t=>{let o=await s(t),p=S.parse(t.body);return d(await r.createFormDefinition(p,o),201)}),i.set("PUT /forms/:id",async t=>{let o=await s(t),p=D.parse(t.body);return d(await r.updateFormDefinition(t.params.id,p,o))}),i.set("DELETE /forms/:id",async t=>(await s(t),await r.deleteFormDefinition(t.params.id),d(null,204))),i.set("GET /forms/:id/export",async t=>(await s(t),{status:200,body:await r.exportForm(t.params.id)})),i.set("POST /forms/import",async t=>{await s(t);let{json:o,tenantId:p}=t.body,l=await r.importForm(o,p);return d({formId:l},201)}),i.set("POST /forms/:formId/pages",async t=>{await s(t);let o=I.parse(t.body);return d(await r.createFormPage(t.params.formId,o),201)}),i.set("PUT /pages/:id",async t=>{await s(t);let o=C.parse(t.body);return d(await r.updateFormPage(t.params.id,o))}),i.set("DELETE /pages/:id",async t=>(await s(t),await r.deleteFormPage(t.params.id),d(null,204))),i.set("POST /pages/:pageId/rosters",async t=>{await s(t);let o=F.parse(t.body);return d(await r.createFormRoster(t.params.pageId,o),201)}),i.set("PUT /rosters/:id",async t=>{await s(t);let o=E.parse(t.body);return d(await r.updateFormRoster(t.params.id,o))}),i.set("DELETE /rosters/:id",async t=>(await s(t),await r.deleteFormRoster(t.params.id),d(null,204))),i.set("POST /pages/:pageId/variables",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormVariable({...o,pageId:t.params.pageId}),201)}),i.set("POST /rosters/:rosterId/variables",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormVariable({...o,rosterId:t.params.rosterId}),201)}),i.set("PUT /variables/:id",async t=>{await s(t);let o=M.parse(t.body);return d(await r.updateFormVariable(t.params.id,o))}),i.set("DELETE /variables/:id",async t=>(await s(t),await r.deleteFormVariable(t.params.id),d(null,204))),i.set("GET /forms/:formId/submissions",async t=>{await s(t);let o=x.parse(t.query),{items:p,total:l}=await r.getSubmissions({formId:t.params.formId,...o});return c(p,l,o.page,o.pageSize)}),i.set("GET /submissions/:id",async t=>(await s(t),d(await r.getSubmission(t.params.id)))),i.set("POST /submissions",async t=>{let o=await s(t),p=z.parse(t.body);return d(await r.createSubmission(p,o),201)}),i.set("PUT /submissions/:id",async t=>{let o=await s(t),p=B.parse(t.body);return d(await r.updateSubmission(t.params.id,p,o))});function y(t,o){for(let[p,l]of i){let[j,O]=p.split(" ");if(j!==t)continue;let A=G(O,o);if(A)return {handler:l,params:A}}return null}return {routes:i,handle:async t=>{try{let o=y(t.method,t.path);return o?(t.params=o.params,await o.handler(t)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof g?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(l=>l.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function G(m,e){let a=m.split("/").filter(Boolean),r=e.split("/").filter(Boolean);if(a.length!==r.length)return null;let i={};for(let s=0;s<a.length;s++){let d=a[s],c=r[s];if(d.startsWith(":"))i[d.slice(1)]=c;else if(d!==c)return null}return i}exports.ApiError=g;exports.FormService=w;exports.createFormDefinitionSchema=S;exports.createFormPageSchema=I;exports.createFormRosterSchema=F;exports.createFormRouter=U;exports.createFormTypeSchema=R;exports.createFormVariableSchema=h;exports.createSubmissionSchema=z;exports.noAuth=P;exports.paginatedResponse=k;exports.paginationSchema=x;exports.successResponse=T;exports.updateFormDefinitionSchema=D;exports.updateFormPageSchema=C;exports.updateFormRosterSchema=E;exports.updateFormTypeSchema=V;exports.updateFormVariableSchema=M;exports.updateSubmissionSchema=B;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.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","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","formId","conditions","pageId","options","validationRules","dataSourceDependencies","style","defaultValue","sub","dbForm","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","roster","dbRoster","v","rosterId","p","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","createFormRouter","auth","service","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.cjs","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\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 { serializeForm, deserializeForm } from '@msbci/form-core'\nimport type { IFormDefinition } 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\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 }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\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 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; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formDefinition.create({\n data: {\n ...data,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\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; metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, ...rest } = data\n return 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\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 }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n return this.prisma.formVariable.create({\n data: {\n ...data,\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 },\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 }>) {\n const { options, validationRules, conditions, dataSourceDependencies, style, metadata, defaultValue, ...rest } = 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 },\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 = 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: formDef.name,\n description: formDef.description,\n version: formDef.version,\n isPublished: formDef.isPublished,\n tenantId,\n formTypeId: formDef.formTypeId,\n })\n\n for (const page of formDef.pages) {\n const dbPage = await this.createFormPage(created.id, {\n code: page.code,\n name: 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: page.repeatConfig?.instanceLabel,\n })\n\n for (const variable of page.variables) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of page.rosters) {\n const dbRoster = await this.createFormRoster(dbPage.id, {\n code: roster.code,\n name: 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 }\n }\n\n /** Convert Prisma DB result to IFormDefinition */\n private dbToFormDefinition(dbForm: any): IFormDefinition {\n return {\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 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\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 }\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 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})\n\nexport const updateFormVariableSchema = createFormVariableSchema.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 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 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\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n const service = new FormService(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('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 // ─── 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/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","formId","conditions","pageId","options","validationRules","dataSourceDependencies","style","defaultValue","sub","dbForm","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","roster","dbRoster","v","rosterId","p","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","createFormRouter","auth","service","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.cjs","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\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 { serializeForm, deserializeForm } from '@msbci/form-core'\nimport type { IFormDefinition, LocalizedString } 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 }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\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 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; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formDefinition.create({\n data: {\n ...data,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\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; metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, ...rest } = data\n return 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\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 }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n return this.prisma.formVariable.create({\n data: {\n ...data,\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 },\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 }>) {\n const { options, validationRules, conditions, dataSourceDependencies, style, metadata, defaultValue, ...rest } = 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 },\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 = 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 })\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 page.variables) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of page.rosters) {\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 }\n }\n\n /** Convert Prisma DB result to IFormDefinition */\n private dbToFormDefinition(dbForm: any): IFormDefinition {\n return {\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 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\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 }\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 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})\n\nexport const updateFormVariableSchema = createFormVariableSchema.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 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 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\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n const service = new FormService(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('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 // ─── 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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {serializeForm,deserializeForm}from'@msbci/form-core';import {z}from'zod';var g=class m extends Error{constructor(a,r,i){super(r);this.statusCode=a;this.errors=i;this.name="ApiError";}static notFound(a="Resource not found"){return new m(404,a)}static badRequest(a,r){return new m(400,a,r)}static unauthorized(a="Unauthorized"){return new m(401,a)}static conflict(a){return new m(409,a)}};function x(m,e="Success"){return {status:200,message:e,data:m}}function T(m,e,a,r){return {status:200,message:"Success",data:{items:m,total:e,page:a,pageSize:r,totalPages:Math.ceil(e/r)}}}function u(m){return m==null?null:JSON.stringify(m)}function f(m){if(m)try{return JSON.parse(m)}catch{return}}var b=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let a=await this.prisma.formType.findUnique({where:{id:e}});if(!a)throw g.notFound("FormType not found");return a}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:u(e.metadata)}})}async updateFormType(e,a){let{metadata:r,...i}=a;return this.prisma.formType.update({where:{id:e},data:{...i,...r!==void 0?{metadata:u(r)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let a={};e.tenantId&&(a.tenantId=e.tenantId),e.search&&(a.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[r,i]=await Promise.all([this.prisma.formDefinition.findMany({where:a,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:a})]);return {items:r,total:i}}async getFormDefinition(e){let a=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!a)throw g.notFound("FormDefinition not found");return a}async createFormDefinition(e,a){return this.prisma.formDefinition.create({data:{...e,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateFormDefinition(e,a,r){let{metadata:i,...s}=a;return this.prisma.formDefinition.update({where:{id:e},data:{...s,...i!==void 0?{metadata:u(i)}:{},updatedBy:r?.userId}})}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,a){return this.prisma.formPage.create({data:{...a,formId:e,conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormPage(e,a){let{conditions:r,metadata:i,...s}=a;return this.prisma.formPage.update({where:{id:e},data:{...s,...r!==void 0?{conditions:u(r)}:{},...i!==void 0?{metadata:u(i)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,a){return this.prisma.formRoster.create({data:{...a,pageId:e,options:u(a.options),conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormRoster(e,a){let{options:r,conditions:i,metadata:s,...d}=a;return this.prisma.formRoster.update({where:{id:e},data:{...d,...r!==void 0?{options:u(r)}:{},...i!==void 0?{conditions:u(i)}:{},...s!==void 0?{metadata:u(s)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw g.badRequest("Variable must belong to a page or a roster");return this.prisma.formVariable.create({data:{...e,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:u(e.options),validationRules:u(e.validationRules),conditions:u(e.conditions),dataSourceDependencies:u(e.dataSourceDependencies),style:u(e.style),metadata:u(e.metadata)}})}async updateFormVariable(e,a){let{options:r,validationRules:i,conditions:s,dataSourceDependencies:d,style:c,metadata:y,defaultValue:t,...o}=a;return this.prisma.formVariable.update({where:{id:e},data:{...o,...t!==void 0?{defaultValue:String(t)}:{},...r!==void 0?{options:u(r)}:{},...i!==void 0?{validationRules:u(i)}:{},...s!==void 0?{conditions:u(s)}:{},...d!==void 0?{dataSourceDependencies:u(d)}:{},...c!==void 0?{style:u(c)}:{},...y!==void 0?{metadata:u(y)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let a={formId:e.formId};e.status&&(a.status=e.status),e.tenantId&&(a.tenantId=e.tenantId);let[r,i]=await Promise.all([this.prisma.formSubmission.findMany({where:a,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:a})]);return {items:r,total:i}}async getSubmission(e){let a=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!a)throw g.notFound("Submission not found");return a}async createSubmission(e,a){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateSubmission(e,a,r){return this.prisma.formSubmission.update({where:{id:e},data:{...a.status?{status:a.status}:{},...a.data?{data:JSON.stringify(a.data)}:{},...a.metadata!==void 0?{metadata:u(a.metadata)}:{},updatedBy:r?.userId}})}async exportForm(e){let a=await this.getFormDefinition(e),r=this.dbToFormDefinition(a);return serializeForm(r)}async importForm(e,a){let r=deserializeForm(e),i=await this.createFormDefinition({code:r.code,name:r.name,description:r.description,version:r.version,isPublished:r.isPublished,tenantId:a,formTypeId:r.formTypeId});for(let s of r.pages){let d=await this.createFormPage(i.id,{code:s.code,name:s.name,order:s.order,isRepeatable:s.isRepeatable,repeatMinInstances:s.repeatConfig?.min,repeatMaxInstances:s.repeatConfig?.max,repeatControlVarCode:s.repeatConfig?.controlVariableCode,repeatInstanceLabel:s.repeatConfig?.instanceLabel});for(let c of s.variables)await this.createFormVariable(this.extractVariableData(c,d.id,void 0));for(let c of s.rosters){let y=await this.createFormRoster(d.id,{code:c.code,name:c.name,rosterType:c.rosterType,order:c.order,pilotVariableCode:c.pilotVariableCode,options:c.options});for(let t of c.variables)await this.createFormVariable(this.extractVariableData(t,void 0,y.id));}}return i.id}extractVariableData(e,a,r){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:a,rosterId:r,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata}}dbToFormDefinition(e){return {id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,metadata:f(e.metadata),pages:(e.pages??[]).map(a=>({id:a.id,code:a.code,name:a.name,order:a.order,isRepeatable:a.isRepeatable,repeatConfig:a.isRepeatable?{min:a.repeatMinInstances??void 0,max:a.repeatMaxInstances??void 0,controlVariableCode:a.repeatControlVarCode??void 0,instanceLabel:a.repeatInstanceLabel??void 0}:void 0,conditions:f(a.conditions)??[],variables:(a.variables??[]).map(r=>this.dbToVariable(r)),rosters:(a.rosters??[]).map(r=>({id:r.id,code:r.code,name:r.name,rosterType:r.rosterType,order:r.order,pilotVariableCode:r.pilotVariableCode??void 0,options:f(r.options),conditions:f(r.conditions)??[],variables:(r.variables??[]).map(i=>this.dbToVariable(i))}))}))}}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:f(e.options),validationRules:f(e.validationRules),conditions:f(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:f(e.dataSourceDependencies),style:f(e.style),metadata:f(e.metadata)}}};var k=async()=>({});var h=z.object({code:z.string().min(1).max(50),name:z.string().min(1).max(200),description:z.string().max(1e3).optional(),metadata:z.record(z.unknown()).optional()}),P=h.partial(),R=z.object({code:z.string().min(1).max(50),name:z.string().min(1).max(200),description:z.string().max(1e3).optional(),version:z.string().default("1.0.0"),isPublished:z.boolean().default(false),tenantId:z.string().optional(),formTypeId:z.string().optional(),metadata:z.record(z.unknown()).optional()}),V=R.partial(),S=z.object({code:z.string().min(1).max(50),name:z.string().min(1).max(200),order:z.number().int().min(0),isRepeatable:z.boolean().default(false),repeatMinInstances:z.number().int().min(0).optional(),repeatMaxInstances:z.number().int().min(1).optional(),repeatControlVarCode:z.string().optional(),repeatInstanceLabel:z.string().optional(),conditions:z.array(z.unknown()).optional(),metadata:z.record(z.unknown()).optional()}),D=S.partial(),I=z.object({code:z.string().min(1).max(50),name:z.string().min(1).max(200),rosterType:z.enum(["check","list","collection","collection_extend"]),order:z.number().int().min(0),pilotVariableCode:z.string().optional(),options:z.array(z.object({label:z.string(),value:z.unknown(),metadata:z.record(z.unknown()).optional()})).optional(),conditions:z.array(z.unknown()).optional(),metadata:z.record(z.unknown()).optional()}),C=I.partial(),w=z.object({code:z.string().min(1).max(50),name:z.string().min(1).max(200),type:z.string().min(1),order:z.number().int().min(0),isRequired:z.boolean().default(false),isReadonly:z.boolean().default(false),isHidden:z.boolean().default(false),defaultValue:z.unknown().optional(),placeholder:z.string().optional(),description:z.string().max(1e3).optional(),options:z.array(z.object({label:z.string(),value:z.unknown(),metadata:z.record(z.unknown()).optional()})).optional(),validationRules:z.array(z.object({type:z.string(),value:z.unknown().optional(),message:z.string()})).optional(),conditions:z.array(z.unknown()).optional(),expression:z.string().optional(),dataSourceId:z.string().optional(),dataSourceDependencies:z.record(z.string()).optional(),style:z.record(z.unknown()).optional(),metadata:z.record(z.unknown()).optional()}),E=w.partial(),M=z.object({formId:z.string().min(1),tenantId:z.string().optional(),status:z.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:z.record(z.unknown()),submittedBy:z.string().optional(),metadata:z.record(z.unknown()).optional()}),B=z.object({status:z.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:z.record(z.unknown()).optional(),metadata:z.record(z.unknown()).optional()}),F=z.object({page:z.coerce.number().int().min(1).default(1),pageSize:z.coerce.number().int().min(1).max(100).default(20),search:z.string().optional(),tenantId:z.string().optional()});function H(m){let{prisma:e,auth:a=k}=m,r=new b(e),i=new Map;async function s(t){let o=await a({headers:t.headers,query:t.query});if(!o)throw g.unauthorized();return o}function d(t,o=200){return {status:o,body:x(t)}}function c(t,o,p,l){return {status:200,body:T(t,o,p,l)}}i.set("GET /form-types",async t=>{await s(t);let o=await r.getFormTypes();return d(o)}),i.set("GET /form-types/:id",async t=>(await s(t),d(await r.getFormType(t.params.id)))),i.set("POST /form-types",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormType(o),201)}),i.set("PUT /form-types/:id",async t=>{await s(t);let o=P.parse(t.body);return d(await r.updateFormType(t.params.id,o))}),i.set("DELETE /form-types/:id",async t=>(await s(t),await r.deleteFormType(t.params.id),d(null,204))),i.set("GET /forms",async t=>{await s(t);let o=F.parse(t.query),{items:p,total:l}=await r.getFormDefinitions(o);return c(p,l,o.page,o.pageSize)}),i.set("GET /forms/:id",async t=>(await s(t),d(await r.getFormDefinition(t.params.id)))),i.set("POST /forms",async t=>{let o=await s(t),p=R.parse(t.body);return d(await r.createFormDefinition(p,o),201)}),i.set("PUT /forms/:id",async t=>{let o=await s(t),p=V.parse(t.body);return d(await r.updateFormDefinition(t.params.id,p,o))}),i.set("DELETE /forms/:id",async t=>(await s(t),await r.deleteFormDefinition(t.params.id),d(null,204))),i.set("GET /forms/:id/export",async t=>(await s(t),{status:200,body:await r.exportForm(t.params.id)})),i.set("POST /forms/import",async t=>{await s(t);let{json:o,tenantId:p}=t.body,l=await r.importForm(o,p);return d({formId:l},201)}),i.set("POST /forms/:formId/pages",async t=>{await s(t);let o=S.parse(t.body);return d(await r.createFormPage(t.params.formId,o),201)}),i.set("PUT /pages/:id",async t=>{await s(t);let o=D.parse(t.body);return d(await r.updateFormPage(t.params.id,o))}),i.set("DELETE /pages/:id",async t=>(await s(t),await r.deleteFormPage(t.params.id),d(null,204))),i.set("POST /pages/:pageId/rosters",async t=>{await s(t);let o=I.parse(t.body);return d(await r.createFormRoster(t.params.pageId,o),201)}),i.set("PUT /rosters/:id",async t=>{await s(t);let o=C.parse(t.body);return d(await r.updateFormRoster(t.params.id,o))}),i.set("DELETE /rosters/:id",async t=>(await s(t),await r.deleteFormRoster(t.params.id),d(null,204))),i.set("POST /pages/:pageId/variables",async t=>{await s(t);let o=w.parse(t.body);return d(await r.createFormVariable({...o,pageId:t.params.pageId}),201)}),i.set("POST /rosters/:rosterId/variables",async t=>{await s(t);let o=w.parse(t.body);return d(await r.createFormVariable({...o,rosterId:t.params.rosterId}),201)}),i.set("PUT /variables/:id",async t=>{await s(t);let o=E.parse(t.body);return d(await r.updateFormVariable(t.params.id,o))}),i.set("DELETE /variables/:id",async t=>(await s(t),await r.deleteFormVariable(t.params.id),d(null,204))),i.set("GET /forms/:formId/submissions",async t=>{await s(t);let o=F.parse(t.query),{items:p,total:l}=await r.getSubmissions({formId:t.params.formId,...o});return c(p,l,o.page,o.pageSize)}),i.set("GET /submissions/:id",async t=>(await s(t),d(await r.getSubmission(t.params.id)))),i.set("POST /submissions",async t=>{let o=await s(t),p=M.parse(t.body);return d(await r.createSubmission(p,o),201)}),i.set("PUT /submissions/:id",async t=>{let o=await s(t),p=B.parse(t.body);return d(await r.updateSubmission(t.params.id,p,o))});function y(t,o){for(let[p,l]of i){let[j,z]=p.split(" ");if(j!==t)continue;let A=U(z,o);if(A)return {handler:l,params:A}}return null}return {routes:i,handle:async t=>{try{let o=y(t.method,t.path);return o?(t.params=o.params,await o.handler(t)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof g?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(l=>l.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function U(m,e){let a=m.split("/").filter(Boolean),r=e.split("/").filter(Boolean);if(a.length!==r.length)return null;let i={};for(let s=0;s<a.length;s++){let d=a[s],c=r[s];if(d.startsWith(":"))i[d.slice(1)]=c;else if(d!==c)return null}return i}export{g as ApiError,b as FormService,R as createFormDefinitionSchema,S as createFormPageSchema,I as createFormRosterSchema,H as createFormRouter,h as createFormTypeSchema,w as createFormVariableSchema,M as createSubmissionSchema,k as noAuth,T as paginatedResponse,F as paginationSchema,x as successResponse,V as updateFormDefinitionSchema,D as updateFormPageSchema,C as updateFormRosterSchema,P as updateFormTypeSchema,E as updateFormVariableSchema,B as updateSubmissionSchema};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import {serializeForm,deserializeForm}from'@msbci/form-core';import {z as z$1}from'zod';var g=class m extends Error{constructor(a,r,i){super(r);this.statusCode=a;this.errors=i;this.name="ApiError";}static notFound(a="Resource not found"){return new m(404,a)}static badRequest(a,r){return new m(400,a,r)}static unauthorized(a="Unauthorized"){return new m(401,a)}static conflict(a){return new m(409,a)}};function T(m,e="Success"){return {status:200,message:e,data:m}}function k(m,e,a,r){return {status:200,message:"Success",data:{items:m,total:e,page:a,pageSize:r,totalPages:Math.ceil(e/r)}}}function u(m){return m==null?null:JSON.stringify(m)}function f(m){if(m)try{return JSON.parse(m)}catch{return}}function b(m){if(m!=null)return typeof m=="string"?m:JSON.stringify(m)}var w=class{constructor(e){this.prisma=e;}async getFormTypes(e){return this.prisma.formType.findMany({orderBy:{name:"asc"}})}async getFormType(e){let a=await this.prisma.formType.findUnique({where:{id:e}});if(!a)throw g.notFound("FormType not found");return a}async createFormType(e){return this.prisma.formType.create({data:{...e,metadata:u(e.metadata)}})}async updateFormType(e,a){let{metadata:r,...i}=a;return this.prisma.formType.update({where:{id:e},data:{...i,...r!==void 0?{metadata:u(r)}:{}}})}async deleteFormType(e){return this.prisma.formType.delete({where:{id:e}})}async getFormDefinitions(e){let a={};e.tenantId&&(a.tenantId=e.tenantId),e.search&&(a.OR=[{name:{contains:e.search}},{code:{contains:e.search}}]);let[r,i]=await Promise.all([this.prisma.formDefinition.findMany({where:a,include:{formType:true,_count:{select:{pages:true,submissions:true}}},skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{updatedAt:"desc"}}),this.prisma.formDefinition.count({where:a})]);return {items:r,total:i}}async getFormDefinition(e){let a=await this.prisma.formDefinition.findUnique({where:{id:e},include:{formType:true,pages:{orderBy:{order:"asc"},include:{variables:{where:{pageId:{not:null}},orderBy:{order:"asc"}},rosters:{orderBy:{order:"asc"},include:{variables:{orderBy:{order:"asc"}}}}}}}});if(!a)throw g.notFound("FormDefinition not found");return a}async createFormDefinition(e,a){return this.prisma.formDefinition.create({data:{...e,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateFormDefinition(e,a,r){let{metadata:i,...s}=a;return this.prisma.formDefinition.update({where:{id:e},data:{...s,...i!==void 0?{metadata:u(i)}:{},updatedBy:r?.userId}})}async deleteFormDefinition(e){return this.prisma.formDefinition.delete({where:{id:e}})}async createFormPage(e,a){return this.prisma.formPage.create({data:{...a,formId:e,conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormPage(e,a){let{conditions:r,metadata:i,...s}=a;return this.prisma.formPage.update({where:{id:e},data:{...s,...r!==void 0?{conditions:u(r)}:{},...i!==void 0?{metadata:u(i)}:{}}})}async deleteFormPage(e){return this.prisma.formPage.delete({where:{id:e}})}async createFormRoster(e,a){return this.prisma.formRoster.create({data:{...a,pageId:e,options:u(a.options),conditions:u(a.conditions),metadata:u(a.metadata)}})}async updateFormRoster(e,a){let{options:r,conditions:i,metadata:s,...d}=a;return this.prisma.formRoster.update({where:{id:e},data:{...d,...r!==void 0?{options:u(r)}:{},...i!==void 0?{conditions:u(i)}:{},...s!==void 0?{metadata:u(s)}:{}}})}async deleteFormRoster(e){return this.prisma.formRoster.delete({where:{id:e}})}async createFormVariable(e){if(!e.pageId&&!e.rosterId)throw g.badRequest("Variable must belong to a page or a roster");return this.prisma.formVariable.create({data:{...e,defaultValue:e.defaultValue!==void 0?String(e.defaultValue):null,options:u(e.options),validationRules:u(e.validationRules),conditions:u(e.conditions),dataSourceDependencies:u(e.dataSourceDependencies),style:u(e.style),metadata:u(e.metadata)}})}async updateFormVariable(e,a){let{options:r,validationRules:i,conditions:s,dataSourceDependencies:d,style:c,metadata:y,defaultValue:t,...o}=a;return this.prisma.formVariable.update({where:{id:e},data:{...o,...t!==void 0?{defaultValue:String(t)}:{},...r!==void 0?{options:u(r)}:{},...i!==void 0?{validationRules:u(i)}:{},...s!==void 0?{conditions:u(s)}:{},...d!==void 0?{dataSourceDependencies:u(d)}:{},...c!==void 0?{style:u(c)}:{},...y!==void 0?{metadata:u(y)}:{}}})}async deleteFormVariable(e){return this.prisma.formVariable.delete({where:{id:e}})}async getSubmissions(e){let a={formId:e.formId};e.status&&(a.status=e.status),e.tenantId&&(a.tenantId=e.tenantId);let[r,i]=await Promise.all([this.prisma.formSubmission.findMany({where:a,skip:(e.page-1)*e.pageSize,take:e.pageSize,orderBy:{createdAt:"desc"}}),this.prisma.formSubmission.count({where:a})]);return {items:r,total:i}}async getSubmission(e){let a=await this.prisma.formSubmission.findUnique({where:{id:e}});if(!a)throw g.notFound("Submission not found");return a}async createSubmission(e,a){return this.prisma.formSubmission.create({data:{formId:e.formId,tenantId:e.tenantId,status:e.status??"draft",data:JSON.stringify(e.data),submittedBy:e.submittedBy,metadata:u(e.metadata),createdBy:a?.userId,updatedBy:a?.userId}})}async updateSubmission(e,a,r){return this.prisma.formSubmission.update({where:{id:e},data:{...a.status?{status:a.status}:{},...a.data?{data:JSON.stringify(a.data)}:{},...a.metadata!==void 0?{metadata:u(a.metadata)}:{},updatedBy:r?.userId}})}async exportForm(e){let a=await this.getFormDefinition(e),r=this.dbToFormDefinition(a);return serializeForm(r)}async importForm(e,a){let r=deserializeForm(e),i=await this.createFormDefinition({code:r.code,name:b(r.name)??"",description:b(r.description),version:r.version,isPublished:r.isPublished,tenantId:a,formTypeId:r.formTypeId});for(let s of r.pages){let d=await this.createFormPage(i.id,{code:s.code,name:b(s.name)??"",order:s.order,isRepeatable:s.isRepeatable,repeatMinInstances:s.repeatConfig?.min,repeatMaxInstances:s.repeatConfig?.max,repeatControlVarCode:s.repeatConfig?.controlVariableCode,repeatInstanceLabel:b(s.repeatConfig?.instanceLabel)});for(let c of s.variables)await this.createFormVariable(this.extractVariableData(c,d.id,void 0));for(let c of s.rosters){let y=await this.createFormRoster(d.id,{code:c.code,name:b(c.name)??"",rosterType:c.rosterType,order:c.order,pilotVariableCode:c.pilotVariableCode,options:c.options});for(let t of c.variables)await this.createFormVariable(this.extractVariableData(t,void 0,y.id));}}return i.id}extractVariableData(e,a,r){return {code:e.code,name:e.name,type:e.type,order:e.order,pageId:a,rosterId:r,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue,placeholder:e.placeholder,description:e.description,options:e.options,validationRules:e.validationRules,conditions:e.conditions,expression:e.expression,dataSourceId:e.dataSourceId,dataSourceDependencies:e.dataSourceDependencies,style:e.style,metadata:e.metadata}}dbToFormDefinition(e){return {id:e.id,code:e.code,name:e.name,description:e.description??void 0,version:e.version,isPublished:e.isPublished,formTypeId:e.formTypeId??void 0,metadata:f(e.metadata),pages:(e.pages??[]).map(a=>({id:a.id,code:a.code,name:a.name,order:a.order,isRepeatable:a.isRepeatable,repeatConfig:a.isRepeatable?{min:a.repeatMinInstances??void 0,max:a.repeatMaxInstances??void 0,controlVariableCode:a.repeatControlVarCode??void 0,instanceLabel:a.repeatInstanceLabel??void 0}:void 0,conditions:f(a.conditions)??[],variables:(a.variables??[]).map(r=>this.dbToVariable(r)),rosters:(a.rosters??[]).map(r=>({id:r.id,code:r.code,name:r.name,rosterType:r.rosterType,order:r.order,pilotVariableCode:r.pilotVariableCode??void 0,options:f(r.options),conditions:f(r.conditions)??[],variables:(r.variables??[]).map(i=>this.dbToVariable(i))}))}))}}dbToVariable(e){return {id:e.id,code:e.code,name:e.name,type:e.type,order:e.order,isRequired:e.isRequired,isReadonly:e.isReadonly,isHidden:e.isHidden,defaultValue:e.defaultValue??void 0,placeholder:e.placeholder??void 0,description:e.description??void 0,options:f(e.options),validationRules:f(e.validationRules),conditions:f(e.conditions),expression:e.expression??void 0,dataSourceId:e.dataSourceId??void 0,dataSourceDependencies:f(e.dataSourceDependencies),style:f(e.style),metadata:f(e.metadata)}}};var P=async()=>({});var R=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),metadata:z$1.record(z$1.unknown()).optional()}),V=R.partial(),S=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),description:z$1.string().max(1e3).optional(),version:z$1.string().default("1.0.0"),isPublished:z$1.boolean().default(false),tenantId:z$1.string().optional(),formTypeId:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),D=S.partial(),I=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),order:z$1.number().int().min(0),isRepeatable:z$1.boolean().default(false),repeatMinInstances:z$1.number().int().min(0).optional(),repeatMaxInstances:z$1.number().int().min(1).optional(),repeatControlVarCode:z$1.string().optional(),repeatInstanceLabel:z$1.string().optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),C=I.partial(),F=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),rosterType:z$1.enum(["check","list","collection","collection_extend"]),order:z$1.number().int().min(0),pilotVariableCode:z$1.string().optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),E=F.partial(),h=z$1.object({code:z$1.string().min(1).max(50),name:z$1.string().min(1).max(200),type:z$1.string().min(1),order:z$1.number().int().min(0),isRequired:z$1.boolean().default(false),isReadonly:z$1.boolean().default(false),isHidden:z$1.boolean().default(false),defaultValue:z$1.unknown().optional(),placeholder:z$1.string().optional(),description:z$1.string().max(1e3).optional(),options:z$1.array(z$1.object({label:z$1.string(),value:z$1.unknown(),metadata:z$1.record(z$1.unknown()).optional()})).optional(),validationRules:z$1.array(z$1.object({type:z$1.string(),value:z$1.unknown().optional(),message:z$1.string()})).optional(),conditions:z$1.array(z$1.unknown()).optional(),expression:z$1.string().optional(),dataSourceId:z$1.string().optional(),dataSourceDependencies:z$1.record(z$1.string()).optional(),style:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),M=h.partial(),z=z$1.object({formId:z$1.string().min(1),tenantId:z$1.string().optional(),status:z$1.enum(["draft","submitted","approved","rejected","completed"]).default("draft"),data:z$1.record(z$1.unknown()),submittedBy:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional()}),B=z$1.object({status:z$1.enum(["draft","submitted","approved","rejected","completed"]).optional(),data:z$1.record(z$1.unknown()).optional(),metadata:z$1.record(z$1.unknown()).optional()}),x=z$1.object({page:z$1.coerce.number().int().min(1).default(1),pageSize:z$1.coerce.number().int().min(1).max(100).default(20),search:z$1.string().optional(),tenantId:z$1.string().optional()});function U(m){let{prisma:e,auth:a=P}=m,r=new w(e),i=new Map;async function s(t){let o=await a({headers:t.headers,query:t.query});if(!o)throw g.unauthorized();return o}function d(t,o=200){return {status:o,body:T(t)}}function c(t,o,p,l){return {status:200,body:k(t,o,p,l)}}i.set("GET /form-types",async t=>{await s(t);let o=await r.getFormTypes();return d(o)}),i.set("GET /form-types/:id",async t=>(await s(t),d(await r.getFormType(t.params.id)))),i.set("POST /form-types",async t=>{await s(t);let o=R.parse(t.body);return d(await r.createFormType(o),201)}),i.set("PUT /form-types/:id",async t=>{await s(t);let o=V.parse(t.body);return d(await r.updateFormType(t.params.id,o))}),i.set("DELETE /form-types/:id",async t=>(await s(t),await r.deleteFormType(t.params.id),d(null,204))),i.set("GET /forms",async t=>{await s(t);let o=x.parse(t.query),{items:p,total:l}=await r.getFormDefinitions(o);return c(p,l,o.page,o.pageSize)}),i.set("GET /forms/:id",async t=>(await s(t),d(await r.getFormDefinition(t.params.id)))),i.set("POST /forms",async t=>{let o=await s(t),p=S.parse(t.body);return d(await r.createFormDefinition(p,o),201)}),i.set("PUT /forms/:id",async t=>{let o=await s(t),p=D.parse(t.body);return d(await r.updateFormDefinition(t.params.id,p,o))}),i.set("DELETE /forms/:id",async t=>(await s(t),await r.deleteFormDefinition(t.params.id),d(null,204))),i.set("GET /forms/:id/export",async t=>(await s(t),{status:200,body:await r.exportForm(t.params.id)})),i.set("POST /forms/import",async t=>{await s(t);let{json:o,tenantId:p}=t.body,l=await r.importForm(o,p);return d({formId:l},201)}),i.set("POST /forms/:formId/pages",async t=>{await s(t);let o=I.parse(t.body);return d(await r.createFormPage(t.params.formId,o),201)}),i.set("PUT /pages/:id",async t=>{await s(t);let o=C.parse(t.body);return d(await r.updateFormPage(t.params.id,o))}),i.set("DELETE /pages/:id",async t=>(await s(t),await r.deleteFormPage(t.params.id),d(null,204))),i.set("POST /pages/:pageId/rosters",async t=>{await s(t);let o=F.parse(t.body);return d(await r.createFormRoster(t.params.pageId,o),201)}),i.set("PUT /rosters/:id",async t=>{await s(t);let o=E.parse(t.body);return d(await r.updateFormRoster(t.params.id,o))}),i.set("DELETE /rosters/:id",async t=>(await s(t),await r.deleteFormRoster(t.params.id),d(null,204))),i.set("POST /pages/:pageId/variables",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormVariable({...o,pageId:t.params.pageId}),201)}),i.set("POST /rosters/:rosterId/variables",async t=>{await s(t);let o=h.parse(t.body);return d(await r.createFormVariable({...o,rosterId:t.params.rosterId}),201)}),i.set("PUT /variables/:id",async t=>{await s(t);let o=M.parse(t.body);return d(await r.updateFormVariable(t.params.id,o))}),i.set("DELETE /variables/:id",async t=>(await s(t),await r.deleteFormVariable(t.params.id),d(null,204))),i.set("GET /forms/:formId/submissions",async t=>{await s(t);let o=x.parse(t.query),{items:p,total:l}=await r.getSubmissions({formId:t.params.formId,...o});return c(p,l,o.page,o.pageSize)}),i.set("GET /submissions/:id",async t=>(await s(t),d(await r.getSubmission(t.params.id)))),i.set("POST /submissions",async t=>{let o=await s(t),p=z.parse(t.body);return d(await r.createSubmission(p,o),201)}),i.set("PUT /submissions/:id",async t=>{let o=await s(t),p=B.parse(t.body);return d(await r.updateSubmission(t.params.id,p,o))});function y(t,o){for(let[p,l]of i){let[j,O]=p.split(" ");if(j!==t)continue;let A=G(O,o);if(A)return {handler:l,params:A}}return null}return {routes:i,handle:async t=>{try{let o=y(t.method,t.path);return o?(t.params=o.params,await o.handler(t)):{status:404,body:{status:404,message:"Route not found",data:null}}}catch(o){return o instanceof g?{status:o.statusCode,body:{status:o.statusCode,message:o.message,data:null,errors:o.errors}}:o instanceof Error&&o.name==="ZodError"?{status:400,body:{status:400,message:"Validation error",data:null,errors:o.issues?.map(l=>l.message)}}:{status:500,body:{status:500,message:"Internal server error",data:null}}}}}}function G(m,e){let a=m.split("/").filter(Boolean),r=e.split("/").filter(Boolean);if(a.length!==r.length)return null;let i={};for(let s=0;s<a.length;s++){let d=a[s],c=r[s];if(d.startsWith(":"))i[d.slice(1)]=c;else if(d!==c)return null}return i}export{g as ApiError,w as FormService,S as createFormDefinitionSchema,I as createFormPageSchema,F as createFormRosterSchema,U as createFormRouter,R as createFormTypeSchema,h as createFormVariableSchema,z as createSubmissionSchema,P as noAuth,k as paginatedResponse,x as paginationSchema,T as successResponse,D as updateFormDefinitionSchema,C as updateFormPageSchema,E as updateFormRosterSchema,V as updateFormTypeSchema,M as updateFormVariableSchema,B as updateSubmissionSchema};//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.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","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","formId","conditions","pageId","options","validationRules","dataSourceDependencies","style","defaultValue","sub","dbForm","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","roster","dbRoster","v","rosterId","p","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","createFormRouter","auth","service","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\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 { serializeForm, deserializeForm } from '@msbci/form-core'\nimport type { IFormDefinition } 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\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 }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\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 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; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formDefinition.create({\n data: {\n ...data,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\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; metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, ...rest } = data\n return 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\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 }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n return this.prisma.formVariable.create({\n data: {\n ...data,\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 },\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 }>) {\n const { options, validationRules, conditions, dataSourceDependencies, style, metadata, defaultValue, ...rest } = 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 },\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 = 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: formDef.name,\n description: formDef.description,\n version: formDef.version,\n isPublished: formDef.isPublished,\n tenantId,\n formTypeId: formDef.formTypeId,\n })\n\n for (const page of formDef.pages) {\n const dbPage = await this.createFormPage(created.id, {\n code: page.code,\n name: 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: page.repeatConfig?.instanceLabel,\n })\n\n for (const variable of page.variables) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of page.rosters) {\n const dbRoster = await this.createFormRoster(dbPage.id, {\n code: roster.code,\n name: 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 }\n }\n\n /** Convert Prisma DB result to IFormDefinition */\n private dbToFormDefinition(dbForm: any): IFormDefinition {\n return {\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 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\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 }\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 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})\n\nexport const updateFormVariableSchema = createFormVariableSchema.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 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 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\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n const service = new FormService(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('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 // ─── 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/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","formId","conditions","pageId","options","validationRules","dataSourceDependencies","style","defaultValue","sub","dbForm","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","roster","dbRoster","v","rosterId","p","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","createFormRouter","auth","service","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\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 { serializeForm, deserializeForm } from '@msbci/form-core'\nimport type { IFormDefinition, LocalizedString } 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 }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\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 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; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formDefinition.create({\n data: {\n ...data,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\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; metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, ...rest } = data\n return 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\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 }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n return this.prisma.formVariable.create({\n data: {\n ...data,\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 },\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 }>) {\n const { options, validationRules, conditions, dataSourceDependencies, style, metadata, defaultValue, ...rest } = 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 },\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 = 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 })\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 page.variables) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of page.rosters) {\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 }\n }\n\n /** Convert Prisma DB result to IFormDefinition */\n private dbToFormDefinition(dbForm: any): IFormDefinition {\n return {\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 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\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 }\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 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})\n\nexport const updateFormVariableSchema = createFormVariableSchema.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 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 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\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n const service = new FormService(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('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 // ─── 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@msbci/form-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Form server — REST API with Prisma, multi-tenant, multi-database",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -21,20 +21,6 @@
|
|
|
21
21
|
"publishConfig": {
|
|
22
22
|
"access": "public"
|
|
23
23
|
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@prisma/client": "^6.2.0",
|
|
26
|
-
"zod": "^3.24.0",
|
|
27
|
-
"@msbci/form-core": "1.1.0"
|
|
28
|
-
},
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"prisma": "^6.2.0",
|
|
31
|
-
"tsup": "^8.3.0",
|
|
32
|
-
"vitest": "^2.1.0",
|
|
33
|
-
"@vitest/coverage-v8": "^2.1.0",
|
|
34
|
-
"typescript": "^5.7.0"
|
|
35
|
-
},
|
|
36
|
-
"sideEffects": false,
|
|
37
|
-
"license": "SEE LICENSE IN LICENSE.md",
|
|
38
24
|
"scripts": {
|
|
39
25
|
"prisma:generate": "prisma generate --schema=src/prisma/schema.prisma",
|
|
40
26
|
"prisma:sync": "prisma db push --schema=src/prisma/schema.prisma --skip-generate --accept-data-loss",
|
|
@@ -52,5 +38,19 @@
|
|
|
52
38
|
"db:generate": "prisma generate --schema=src/prisma/schema.prisma",
|
|
53
39
|
"db:migrate": "prisma migrate dev --schema=src/prisma/schema.prisma",
|
|
54
40
|
"db:push": "prisma db push --schema=src/prisma/schema.prisma"
|
|
55
|
-
}
|
|
56
|
-
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@msbci/form-core": "workspace:*",
|
|
44
|
+
"@prisma/client": "^6.2.0",
|
|
45
|
+
"zod": "^3.24.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"prisma": "^6.2.0",
|
|
49
|
+
"tsup": "^8.3.0",
|
|
50
|
+
"vitest": "^2.1.0",
|
|
51
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
52
|
+
"typescript": "^5.7.0"
|
|
53
|
+
},
|
|
54
|
+
"sideEffects": false,
|
|
55
|
+
"license": "SEE LICENSE IN LICENSE.md"
|
|
56
|
+
}
|