All files / src/controllers resume_controller.ts

28.84% Statements 15/52
20% Branches 3/15
14.28% Functions 1/7
28.84% Lines 15/52

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 };