Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17031 | Rev 17033 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Db\Sql\Select;
use Laminas\Db\Sql\Sql;
use Laminas\Db\ResultSet\HydratingResultSet;
use Laminas\Hydrator\ArraySerializableHydrator;
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
use LeadersLinked\Mapper\JobDescriptionMapper;
use LeadersLinked\Mapper\JobCategoryMapper;
use LeadersLinked\Mapper\LocationMapper;
use LeadersLinked\Library\QueryMapper;
use ArrayObject;


class RecruitmentSelectionVacancyCriteriaController extends AbstractActionController
{

    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;


    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;

    /**
     *
     * @var array
     */
    private $config;


    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;


    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    public function __construct($adapter, $cache, $logger, $config, $translator)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;
        $this->translator   = $translator;
    }

    public function indexAction()
    {
        $request = $this->getRequest();

        // 🔹 Validar si la solicitud es POST
        if (!$request->isPost()) {
            return new JsonModel([
                'success' => false,
                'message' => 'Invalid request method'
            ]);
        }

        // 🔹 Obtener el ID desde form-data
        $vacancyId = $this->params()->fromPost('id');

        // 🔹 Verificar si el ID es válido
        if (!$vacancyId) {
            return new JsonModel([
                'success' => false,
                'message' => 'Missing vacancy ID'
            ]);
        }

        // 🔹 Construcción de la consulta con QueryMapper
        $queryMapper = QueryMapper::getInstance($this->adapter);
        $select = $queryMapper->getSql()->select();
        $select->from(['tb1' => RecruitmentSelectionVacancyMapper::_TABLE]);
        $select->columns(['uuid', 'name', 'last_date', 'status']);

        // 🔹 JOIN con JobDescriptionMapper (incluyendo functions y objectives)
        $select->join(
            ['tb2' => JobDescriptionMapper::_TABLE],
            'tb1.job_description_id = tb2.id AND tb1.company_id = tb2.company_id',
            [
                'job_description' => 'name',
                'job_functions'   => 'functions',
                'job_objectives'  => 'objectives'
            ]
        );

        // 🔹 JOIN con JobCategoryMapper (para obtener nombre y descripción de la categoría)
        $select->join(
            ['tb3' => JobCategoryMapper::_TABLE],
            'tb1.job_category_id = tb3.id',
            [
                'job_category' => 'name',
                'category_description' => 'description'
            ]
        );

        // 🔹 JOIN con LocationMapper (para obtener país y dirección formateada)
        $select->join(
            ['tb4' => LocationMapper::_TABLE],
            'tb1.location_id = tb4.id',
            [
                'location_country' => 'country',
                'location_address' => 'formatted_address'
            ]
        );

        // 🔹 Filtrar por el ID de la vacante
        $select->where->equalTo('tb1.id', $vacancyId);

        // 🔹 Ejecutar la consulta
        $statement = $queryMapper->getSql()->prepareStatementForSqlObject($select);
        $resultSet = $statement->execute();

        // 🔹 Procesar los resultados
        $hydrator = new ArraySerializableHydrator();
        $hydratingResultSet = new HydratingResultSet($hydrator);
        $hydratingResultSet->initialize($resultSet);

        // 🔹 Obtener un solo resultado como diccionario
        $vacancyData = $hydratingResultSet->current();

        // 🔹 Validar si no se encontró la vacante
        if (!$vacancyData) {
            return new JsonModel([
                'success' => false,
                'message' => 'Vacancy not found'
            ]);
        }

        // 🔹 Retornar la vacante en formato JSON
        return new JsonModel([
            'success' => true,
            'data' => $vacancyData
        ]);
    }
}