Este archivo define los servicios relacionados con la gestión de ofertas de empleo en Matchify, utilizando el repositorio jobRepository.js para interactuar con los datos. Los servicios encapsulan la lógica de negocio, como validaciones específicas y la gestión de errores, asegurando un flujo controlado y consistente.

import {
    createJobOffer,
    searchJobOffers,
    getEmpresasByIds,
    getUserById,
    getJobOfferById,
    updateJobOffer,
    deleteJobOffer,
    getJobOffersByCompany,
    getActiveJobOffers,
    getJobCountByStatus,
    getJobOffersByStatus,
    countCandidatesForJobOffer
} from '../repositories/jobRepository.js';

// Servicio para crear una nueva oferta de empleo
export const createJobOfferService = async (jobData) => {
    try {
        const newJobOffer = await createJobOffer(jobData);
        return newJobOffer;
    } catch (error) {
        throw new Error(`Error al crear la oferta de empleo: ${error.message}`);
    }
};

// Servicio para buscar ofertas de empleo con filtros
export const searchJobOffersService = async (filters, userId) => {
    try {
        const ofertas = await searchJobOffers(filters);

        if (!ofertas.length) return [];

        const empresaIds = [...new Set(ofertas.map(oferta => oferta.empresaId))];
        const empresas = await getEmpresasByIds(empresaIds);
        const usuario = await getUserById(userId);
        if (!usuario) throw new Error('Usuario no encontrado');

        const ofertasConEmpresaYUsuario = ofertas.map(oferta => ({
            ...oferta.toJSON(),
            empresa: empresas.find(empresa => empresa.id === oferta.empresaId),
            usuario: usuario.username,
        }));

        return ofertasConEmpresaYUsuario;
    } catch (error) {
        throw new Error(`Error buscando ofertas de empleo: ${error.message}`);
    }
};

export const updateJobOfferService = async (id, updatedData) => {
    try {
        if (updatedData.estatus && !['Activo', 'Inactivo'].includes(updatedData.estatus)) {
            throw new Error('Valor de estatus inválido. Solo se permiten "Activo" o "Inactivo".');
        }

        const result = await updateJobOffer(id, updatedData);

        if (result[0] === 0) {
            throw new Error('Oferta de empleo no encontrada o no se pudo actualizar.');
        }

        return result;
    } catch (error) {
        throw new Error(`Error actualizando la oferta de empleo: ${error.message}`);
    }
};

// Servicio para eliminar una oferta de empleo
export const deleteJobOfferService = async (id) => {
    try {
        await deleteJobOffer(id);
    } catch (error) {
        throw new Error(`Error eliminando la oferta de empleo: ${error.message}`);
    }
};

// Servicio para obtener ofertas de empleo por empresa
export const getJobOffersByCompanyService = async (empresaId, userId = null) => {
    try {
        const ofertas = await getJobOffersByCompany(empresaId, userId);
        return ofertas;
    } catch (error) {
        throw new Error(`Error obteniendo ofertas de empleo por empresa: ${error.message}`);
    }
};

// Servicio para obtener una oferta de empleo por ID
export const getJobOfferByIdService = async (id) => {
    try {
        const oferta = await getJobOfferById(id);
        return oferta;
    } catch (error) {
        throw new Error(`Error obteniendo la oferta de empleo: ${error.message}`);
    }
};

// Servicio para obtener las ofertas de empleo activas
export const getActiveJobOffersService = async () => {
    try {
        const ofertas = await getActiveJobOffers();
        return ofertas;
    } catch (error) {
        throw new Error(`Error obteniendo ofertas activas: ${error.message}`);
    }
};

export const getJobSummaryService = async (empresaId) => {
    try {
        const activeJobCount = await getJobCountByStatus(empresaId, 'Activo');
        const inactiveJobCount = await getJobCountByStatus(empresaId, 'Inactivo');
        const activeJobs = await getJobOffersByStatus(empresaId, 'Activo');
        const inactiveJobs = await getJobOffersByStatus(empresaId, 'Inactivo');

        return { activeJobCount, inactiveJobCount, activeJobs, inactiveJobs };
    } catch (error) {
        throw new Error(`Error al obtener el resumen de trabajos: ${error.message}`);
    }
};

// Servicio para contar los candidatos de una oferta de empleo específica
export const getCandidateCountService = async (jobOfferId) => {
    return await countCandidatesForJobOffer(jobOfferId);
};

Explicación de cada función

  1. createJobOfferService(jobData):
  2. searchJobOffersService(filters, userId):
  3. updateJobOfferService(id, updatedData):
  4. deleteJobOfferService(id):
  5. getJobOffersByCompanyService(empresaId, userId):
  6. getJobOfferByIdService(id):
  7. getActiveJobOffersService():
  8. getJobSummaryService(empresaId):
  9. getCandidateCountService(jobOfferId):