Files

177 lines
4.0 KiB
JavaScript

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);
}
};