Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 8x 3x 3x 3x 3x 3x 1x 2x 1x 1x 1x 8x 8x 8x 8x | import { Request, Response } from 'express'; import { config } from '../config/config'; import fs from 'fs'; import path from 'path'; import { scoreResume, streamScoreResume, getResumeTemplates, generateImprovedResume, parseResumeFields } from '../services/resume_service'; import multer from 'multer'; import { CustomRequest } from "types/customRequest"; import { handleError } from "../utils/handle_error"; const getResumeScore = async (req: Request, res: Response) => { try { const { filename } = req.params; const resumePath = path.resolve(config.resources.resumesDirectoryPath(), filename); const jobDescription = req.query.jobDescription as string; if (!fs.existsSync(resumePath)) { return res.status(404).send('Resume not found'); } const scoreAndFeedback = await scoreResume(resumePath, jobDescription); return res.status(200).send(scoreAndFeedback); } catch (error) { Iif (error instanceof TypeError) { return res.status(400).send(error.message); } else { handleError(error, res); } } }; const getStreamResumeScore = async (req: Request, res: Response) => { try { const { filename } = req.params; const resumePath = path.resolve(config.resources.resumesDirectoryPath(), filename); const jobDescription = req.query.jobDescription as string; if (!fs.existsSync(resumePath)) { return res.status(404).send('Resume not found'); } // Set headers for SSE res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // Handle client disconnect req.on('close', () => { res.end(); }); // Stream the response const score = await streamScoreResume( resumePath, jobDescription, (chunk) => { res.write(`data: ${JSON.stringify({ chunk })}\n\n`); } ); // Send the final score res.write(`data: ${JSON.stringify({ score, done: true })}\n\n`); res.end(); } catch (error) { if (error instanceof TypeError) { return res.status(400).send(error.message); } else { handleError(error, res); } } }; const getTemplates = async (req: Request, res: Response) => { try { const templates = await getResumeTemplates(); return res.status(200).json(templates); } catch (error) { handleError(error, res); } }; const generateResume = async (req: Request, res: Response) => { try { const { feedback, jobDescription, templateName } = req.body; if (!feedback || !jobDescription || !templateName) { return res.status(400).json({ error: 'Missing required fields' }); } const result = await generateImprovedResume(feedback, jobDescription, templateName); return res.status(200).json(result); } catch (error) { handleError(error, res); } }; const parseResume = async (req: Request, res: Response) => { try { if (!req.file) { return res.status(400).json({ error: 'No resume file uploaded' }); } const parsed = await parseResumeFields(req.file.buffer, req.file.originalname); return res.status(200).json(parsed); } catch (err: any) { console.error('Error parsing resume:', err); return handleError(err, res); } }; export default { parseResume, getResumeScore, getStreamResumeScore, getTemplates, generateResume }; |