From e66a3de28384ab64115ab65fb32e996d4a3fb2e6 Mon Sep 17 00:00:00 2001 From: DaKheera47 Date: Tue, 20 Jan 2026 14:56:35 +0000 Subject: [PATCH] ensure skills always have the right spec --- orchestrator/src/server/services/pdf.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/orchestrator/src/server/services/pdf.ts b/orchestrator/src/server/services/pdf.ts index 63c45b4..5697553 100644 --- a/orchestrator/src/server/services/pdf.ts +++ b/orchestrator/src/server/services/pdf.ts @@ -78,14 +78,24 @@ export async function generatePdf( // Inject tailored skills if (tailoredContent.skills) { - const newSkills = Array.isArray(tailoredContent.skills) + const rawSkills = Array.isArray(tailoredContent.skills) ? tailoredContent.skills : typeof tailoredContent.skills === 'string' ? JSON.parse(tailoredContent.skills) : null; - if (newSkills && resumeData.sections?.skills) { - resumeData.sections.skills.items = newSkills; + if (rawSkills && resumeData.sections?.skills) { + // Ensure each skill item has all required fields per OpenAPI spec + const normalizedSkills = rawSkills.map((skill: any, index: number) => ({ + id: skill.id || `skill-${index}-${Date.now()}`, + hidden: skill.hidden ?? false, + icon: skill.icon || '', + name: skill.name || '', + proficiency: skill.proficiency || '', + level: skill.level ?? 0, + keywords: Array.isArray(skill.keywords) ? skill.keywords : [], + })); + resumeData.sections.skills.items = normalizedSkills; } } @@ -131,14 +141,8 @@ export async function generatePdf( // 5. Import as temporary resume console.log(` Importing temporary resume for job ${jobId}...`); - const timestamp = new Date().getTime(); - const tempName = `[TEMP] ${resumeData.basics?.name || 'Resume'} - ${jobId.slice(0, 8)} (${timestamp})`; - tempResumeId = await importResume({ - name: tempName, - slug: `temp-${jobId}-${timestamp}`, - data: resumeData, - }); + tempResumeId = await importResume(resumeData); if (!tempResumeId) { throw new Error('Failed to get ID for imported resume');