const { ContactPerson, Position, Event, EventType, EventPlace } = require('../models'); const { Op } = require('sequelize'); const getAllContactPersons = async (req, res) => { try { const contactPersons = await ContactPerson.findAll({ include: [ { model: Position, as: 'positions', through: { attributes: [] } } ] }); res.json(contactPersons); } catch (error) { res.status(500).json({ error: 'Failed to fetch contact persons' }); console.error(error); } }; const createContactPerson = async (req, res) => { try { const { positions, ...contactPersonData } = req.body; const contactPerson = await ContactPerson.create(contactPersonData); if (positions && positions.length > 0) { const positionIds = positions.map(position => position.id); await contactPerson.setPositions(positionIds); } res.status(201).json(contactPerson); } catch (error) { res.status(500).json({ error: 'Failed to create contact person' }); console.error(error); } }; const updateContactPerson = async (req, res) => { try { const { id } = req.params; const { positions, ...contactPersonData } = req.body; const contactPerson = await ContactPerson.findByPk(id); if (!contactPerson) { return res.status(404).json({ error: 'Contact person not found' }); } await contactPerson.update(contactPersonData); if (positions && positions.length > 0) { const positionIds = positions.map(position => position.id); await contactPerson.setPositions(positionIds); } res.status(200).json(contactPerson); } catch (error) { res.status(500).json({ error: 'Failed to update contact person' }); console.error(error); } }; const deleteContactPerson = async (req, res) => { try { const { id } = req.params; const deleted = await ContactPerson.destroy({ where: { id: id } }); if (deleted) { res.status(204).json(); } else { res.status(404).json({ error: 'Contact person not found' }); } } catch (error) { res.status(500).json({ error: 'Failed to delete contact person' }); console.error(error); } }; const filterContactPersons = async (req, res) => { try { const { config: configString } = req.body; console.log(configString, typeof configString); const config = JSON.parse(configString); const where = {}; const having = []; console.log(config, typeof config); console.log(config.selection); if (config.selection.id && config.selection.id === 'all') { // No additional filter needed for "all" } else if (config.selection.id) { where.id = config.selection.id; } else { if (config.selection.types && config.selection.types.length > 0) { having.push({ '$positions.id$': { [Op.in]: config.selection.types } }); } if (config.selection.places && config.selection.places.length > 0) { having.push({ '$events.eventPlaceId$': { [Op.in]: config.selection.places } }); } if (config.selection.positions && config.selection.positions.length > 0) { having.push({ '$positions.id$': { [Op.in]: config.selection.positions } }); } } const contactPersons = await ContactPerson.findAll({ where, include: [ { model: Position, as: 'positions', through: { attributes: [] }, required: true, // Ensure only contact persons with matching positions are included }, { model: Event, as: 'events', through: { attributes: [] }, required: false, }, ], having: having.length > 0 ? { [Op.and]: having } : undefined, }); res.json(contactPersons); } catch (error) { res.status(500).json({ error: 'Failed to fetch contact persons' }); console.error(error); } }; module.exports = { getAllContactPersons, createContactPerson, updateContactPerson, deleteContactPerson, filterContactPersons };