All files / src/controllers linkedin_jobs_controller.ts

6.66% Statements 2/30
0% Branches 0/18
0% Functions 0/4
6.66% Lines 2/30

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        7x                                                                                                         7x                            
import { Request, Response } from 'express';
import linkedIn from 'linkedin-jobs-api';
import { getCompanyLogo } from '../services/company_logo_service';
 
export const getJobsBySkillsAndRole = async (req: Request, res: Response) => {
    try {
        const skillsParam = String(req.query.skills || '').trim();
        const role = String(req.query.role || '').trim();
        const location = String(req.query.location || 'Israel').trim();
        const dateSincePosted = String(req.query.dateSincePosted || 'past week').trim();
        const jobType = String(req.query.jobType || 'full time').trim();
        const experienceLevel = String(req.query.experienceLevel || 'entry level').trim();
 
        if (!skillsParam || !role) {
            return res.status(400).json({ error: 'Skills and role are required' });
        }
 
        // Split skills by comma and trim whitespace
        const skillsArray = skillsParam
            .split(',')
            .map(skill => skill.trim())
            .filter(Boolean);
 
        // Construct keyword by combining role and skills
        const keyword = `${role} ${skillsArray.join(' ')}`.trim();
 
        const queryOptions = {
            keyword,
            location,
            dateSincePosted,
            jobType,
            experienceLevel,
            limit: '10',
            page: '0',
        };
 
        const jobs = await linkedIn.query(queryOptions);
 
        // Fetch company logos for each job
        const jobsWithLogos = await Promise.all(
            jobs.map(async (job: any) => {
                const companyLogo = await getCompanyLogo(job.company);
                return { 
                    ...job, 
                    companyLogo, 
                    position: job.position // Add position field
                };
            })
        );
 
        res.status(200).json(jobsWithLogos);
    } catch (error: any) {
        console.error('Error fetching jobs from LinkedIn Jobs API:', error.message);
        res.status(500).json({ error: 'Failed to fetch jobs from LinkedIn Jobs API' });
    }
};
 
export const viewJobDetails = async (req: Request, res: Response) => {
    try {
        const jobId = req.params.id;
        if (!jobId) {
            return res.status(400).json({ error: 'Job ID is required' });
        }
 
        const jobDetails = await linkedIn.query({ keyword: jobId, limit: '1' });
        res.status(200).json(jobDetails);
    } catch (error: any) {
        console.error('Error fetching job details:', error.message);
        res.status(500).json({ error: 'Failed to fetch job details' });
    }
};