Este archivo define los controladores relacionados con la gestión de ofertas de empleo en Matchify, utilizando los servicios jobService.js para realizar las operaciones. Los controladores manejan las solicitudes HTTP y las respuestas correspondientes.

import {
    createJobOfferService,
    searchJobOffersService,
    updateJobOfferService,
    deleteJobOfferService,
    getJobOffersByCompanyService,
    getJobOfferByIdService,
    getActiveJobOffersService,
    getJobSummaryService,
    getCandidateCountService
} from '../services/jobService.js';

export const createJobOfferController = async (req, res) => {
    const jobData = req.body;

    try {
        const newJobOffer = await createJobOfferService(jobData);
        return res.status(201).json({ success: true, oferta: newJobOffer });
    } catch (error) {
        console.error('Error creating job offer:', error);
        return res.status(500).json({ success: false, message: error.message });
    }
};

export const searchJobOffersController = async (req, res) => {
    const filters = req.query;
    const userId = req.query.userId;

    try {
        const ofertas = await searchJobOffersService(filters, userId);
        return res.status(200).json({ success: true, ofertas });
    } catch (error) {
        console.error('Error searching job offers:', error);
        return res.status(500).json({ success: false, message: error.message });
    }
};

export const updateJobOfferController = async (req, res) => {
    const { id } = req.params;
    const updatedData = req.body;

    try {
        const updatedJobOffer = await updateJobOfferService(id, updatedData);
        return res.status(200).json({ success: true, oferta: updatedJobOffer });
    } catch (error) {
        console.error('Error updating job offer:', error);
        return res.status(500).json({ success: false, message: error.message });
    }
};

export const deleteJobOfferController = async (req, res) => {
    const { id } = req.params;

    try {
        await deleteJobOfferService(id);
        return res.status(200).json({ success: true, message: 'Job offer deleted' });
    } catch (error) {
        console.error('Error deleting job offer:', error);
        return res.status(500).json({ success: false, message: error.message });
    }
};

export const getJobOffersByCompanyController = async (req, res) => {
    const { empresaId, userId } = req.query;

    if (!empresaId) {
        return res.status(400).json({ success: false, message: 'El campo empresaId es obligatorio.' });
    }

    try {
        const ofertas = await getJobOffersByCompanyService(empresaId, userId);

        if (!ofertas || ofertas.length === 0) {
            return res.status(404).json({ success: false, message: 'No se encontraron ofertas de empleo para esta empresa.' });
        }

        return res.status(200).json({ success: true, ofertas });
    } catch (error) {
        console.error('Error al obtener ofertas de empleo:', error);
        return res.status(500).json({ success: false, message: 'Error interno del servidor.' });
    }
};

export const getJobOfferByIdController = async (req, res) => {
    const { id } = req.params;

    try {
        const oferta = await getJobOfferByIdService(id);

        if (!oferta) {
            return res.status(404).json({ success: false, message: 'Oferta no encontrada.' });
        }

        return res.status(200).json({ success: true, oferta });
    } catch (error) {
        console.error('Error al obtener la oferta de empleo:', error.message);
        return res.status(500).json({ success: false, message: 'Error interno del servidor.' });
    }
};

export const getActiveJobOffersController = async (req, res) => {
    try {
        const ofertas = await getActiveJobOffersService();
        if (!ofertas || ofertas.length === 0) {
            return res.status(404).json({ success: false, message: 'No se encontraron ofertas activas.' });
        }
        return res.status(200).json({ success: true, ofertas });
    } catch (error) {
        console.error('Error al obtener ofertas activas:', error);
        return res.status(500).json({ success: false, message: 'Error interno del servidor.' });
    }
};

export const toggleJobOfferStatusController = async (req, res) => {
    const { id } = req.params;
    const { estatus } = req.body;

    const validStatuses = ['Activo', 'Inactivo'];
    if (!validStatuses.includes(estatus)) {
        return res.status(400).json({ success: false, message: 'El valor de estatus no es válido.' });
    }

    try {
        const updatedJobOffer = await updateJobOfferService(id, { estatus });

        if (!updatedJobOffer) {
            return res.status(404).json({ success: false, message: 'Oferta no encontrada.' });
        }

        return res.status(200).json({ success: true, oferta: updatedJobOffer });
    } catch (error) {
        console.error('Error al cambiar el estado de la oferta de empleo:', error);
        return res.status(500).json({ success: false, message: `Error interno del servidor: ${error.message}` });
    }
};

export const getJobSummaryController = async (req, res) => {
    const { empresaId } = req.query;

    if (!empresaId) {
        return res.status(400).json({ success: false, message: 'El campo empresaId es obligatorio.' });
    }

    try {
        const { activeJobCount, inactiveJobCount, activeJobs, inactiveJobs } = await getJobSummaryService(empresaId);
        return res.status(200).json({
            success: true,
            activeJobCount,
            inactiveJobCount,
            activeJobs,
            inactiveJobs,
        });
    } catch (error) {
        console.error('Error al obtener el resumen de trabajos:', error);
        return res.status(500).json({ success: false, message: 'Error interno del servidor.' });
    }
};

export const getCandidateCountController = async (req, res) => {
    const { id } = req.params;

    try {
        const count = await getCandidateCountService(id);
        return res.status(200).json({ success: true, candidateCount: count });
    } catch (error) {
        console.error('Error al obtener el conteo de candidatos:', error);
        return res.status(500).json({ success: false, message: 'Error interno del servidor.' });
    }
};

Explicación de cada función

  1. createJobOfferController(req, res):
  2. searchJobOffersController(req, res):
  3. updateJobOfferController(req, res):
  4. deleteJobOfferController(req, res):
  5. getJobOffersByCompanyController(req, res):
  6. getJobOfferByIdController(req, res):
  7. getActiveJobOffersController(req, res):
  8. toggleJobOfferStatusController(req, res):
  9. getJobSummaryController(req, res):
  10. getCandidateCountController(req, res):