{"record":{"id":"a121833b38579060","repo":"amruthpillai/reactive-resume","slug":"bad-request-a12183","errorCode":"BAD_REQUEST","errorMessage":"Resume data does not match the canonical schema.","messagePattern":"Resume data does not match the canonical schema\\.","errorType":"exception","errorClass":"ORPCError","httpStatus":400,"severity":"error","filePath":"packages/api/src/features/resume/resume-data-validation.ts","lineNumber":9,"sourceCode":"import type { ResumeData } from \"@reactive-resume/schema/resume/data\";\nimport { ORPCError } from \"@orpc/client\";\nimport { parseResumeData } from \"@reactive-resume/schema/resume/data\";\n\nfunction parseApiResumeData(data: unknown, code: \"BAD_REQUEST\" | \"INTERNAL_SERVER_ERROR\", message: string): ResumeData {\n\ttry {\n\t\treturn parseResumeData(data);\n\t} catch (cause) {\n\t\tthrow new ORPCError(code, {\n\t\t\tstatus: code === \"BAD_REQUEST\" ? 400 : 500,\n\t\t\tmessage,\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport const parseWritableResumeData = (data: unknown) =>\n\tparseApiResumeData(data, \"BAD_REQUEST\", \"Resume data does not match the canonical schema.\");\n\nexport const parseStoredResumeData = (data: unknown) =>\n\tparseApiResumeData(data, \"INTERNAL_SERVER_ERROR\", \"Stored resume data does not match the canonical schema.\");\n","sourceCodeStart":1,"sourceCodeEnd":22,"githubUrl":"https://github.com/amruthpillai/reactive-resume/blob/3a5b12e2a40374a9571988701fcb75c5a1831c42/packages/api/src/features/resume/resume-data-validation.ts#L1-L22","documentation":"parseWritableResumeData() runs the canonical Zod resume schema (parseResumeData) over client-supplied data and maps any failure to BAD_REQUEST. This is the validation gate for create/update/patch inputs. The original Zod error is attached as error.cause for diagnostics.","triggerScenarios":"POST/PUT/PATCH resume data missing required fields, with wrong-typed values, or structurally invalid sections (e.g. a section array containing a non-object).","commonSituations":"A frontend sending a stale data shape after a schema upgrade, an API client hand-building the payload, or a partial object from an incomplete form.","solutions":["Run parseResumeData (the shared Zod schema) on the client before submitting.","After a schema or @reactive-resume/schema bump, regenerate any seeded/default data.","Inspect error.cause for the exact Zod path and issue to locate the offending field."],"exampleFix":"// before\nresumeService.update({ id, userId, data: partialData });\n// after\nimport { parseResumeData } from '@reactive-resume/schema/resume/data';\nconst data = parseResumeData(partialData); // throws ZodError with precise path\nresumeService.update({ id, userId, data });","handlingStrategy":"validation","validationCode":"import { parseResumeData } from '@reactive-resume/schema/resume/data';\nfunction validateResumeData(data: unknown) {\n  return parseResumeData(data); // throws ZodError with precise path before the API call\n}","typeGuard":"import { resumeDataSchema } from '@reactive-resume/schema/resume/data';\nfunction isResumeData(value: unknown): value is ResumeData {\n  return resumeDataSchema.safeParse(value).success;\n}","tryCatchPattern":null,"preventionTips":["Validate with the shared Zod schema on the client before any create/update/patch.","Regenerate default/seed resume data after @reactive-resume/schema bumps.","When an error occurs, inspect error.cause for the exact Zod path."],"tags":["resume","schema","validation","zod","bad-request"],"backgroundTag":null,"analyzedSha":"3a5b12e2a40374a9571988701fcb75c5a1831c42","analyzedAt":"2026-08-12T22:31:22.666Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}