import { createVenue, getVenueById, getVenuesByQuery, getAllVenues, updateVenue, aggregateVenue, } from "../models/Venue/operations.js"; import { ObjectId } from "mongodb"; import { aggregateAssignment } from "../models/Assignment/operations.js"; import { coordinatesToGeoJson } from "../helpers/geoJson.helper.js"; import dayjs from "dayjs"; export const createVenueController = async (req, res, next) => { try { const { user } = res.locals; const { location } = req.body; const geoJson = coordinatesToGeoJson({ latitude: location.lat, longitude: location.lng, }); const dbPayload = { ...req.body, location: geoJson, createdBy: user.id, createdOn: dayjs().toISOString(), }; const venue = await createVenue(dbPayload); res.status(200).json({ result: venue }); } catch (error) { console.log("createVenueController Error", error); next(error); } }; export const deleteVenueController = async (req, res, next) => { try { const { id } = req.params; const venue = await updateVenue(id, { isActive: false }); res.status(200).json({ result: venue }); } catch (error) { console.log("deleteVenueController Error", error); next(error); } }; export const getVenuesByEntityController = async (req, res, next) => { try { const { id } = req.params; const venues = await getVenuesByQuery({ entity: id }); res.status(200).json({ result: venues }); } catch (error) { console.log("getVenuesByEntity Error", error); next(error); } }; export const getVenueController = async (req, res, next) => { try { const { id } = req.params; const venue = await getVenueById(id); res.status(200).json({ result: venue }); } catch (error) { console.log("getVenueController Error", error); next(error); } }; export const getAssignedVenuesController = async (req, res, next) => { try { const { userId } = req.params; // const { user } = res.locals; const assignedVenues = await aggregateAssignment([ { $match: { user: ObjectId.createFromHexString(userId), isActive: true, }, }, { $lookup: { from: "venues", localField: "venue", foreignField: "_id", as: "venue", }, }, { $unwind: { path: "$venue", preserveNullAndEmptyArrays: true, }, }, { $lookup: { from: "partners", localField: "venue.entity", foreignField: "_id", as: "partner", }, }, { $unwind: { path: "$partner", preserveNullAndEmptyArrays: true, }, }, ]); res.status(200).json({ result: assignedVenues }); } catch (error) { console.log("getAssignedVenues Error", error); next(error); } }; export const getUnassignedVenuesController = async (req, res, next) => { try { const unassignedVenues = await aggregateVenue([ { $match: { category: "PARTNER" }, }, { $lookup: { from: "assignments", localField: "_id", foreignField: "venue", pipeline: [ { $match: { isActive: true, }, }, ], as: "activeAssignments", }, }, { $match: { $or: [ { activeAssignments: { $size: 0 } }, { activeAssignments: { $exists: false } }, ], }, }, { $lookup: { from: "partners", localField: "entity", foreignField: "_id", as: "partner", }, }, { $unwind: { path: "$partner", preserveNullAndEmptyArrays: true, }, }, ]); res.status(200).json({ result: unassignedVenues }); } catch (error) { console.log("getUnassignedVenuesController Error", error); next(error); } };