From 54d9508dc8d69fc0774e73695b0a3fe7b76314a1 Mon Sep 17 00:00:00 2001 From: Shibi Chakkaravarthy Date: Mon, 4 May 2026 20:57:03 +0530 Subject: [PATCH] location controller updated with heading and created new models and controllers for remaining modules --- controllers/admin.controller.js | 302 +++++++++++-- controllers/assignment.controller.js | 63 +++ controllers/location.controller.js | 39 ++ controllers/partner.controller.js | 194 +++++++++ controllers/profile.controller.js | 3 +- controllers/venue.controller.js | 71 +++ controllers/workflow.controller.js | 13 +- documentation/admin.js | 72 +++- documentation/assignment.js | 148 +++++++ documentation/documentation.json | 618 ++++++++++++++++++++++++++- documentation/index.js | 8 +- documentation/partner.js | 216 ++++++++++ documentation/venue.js | 156 +++++++ index.js | 12 +- models/Assignment/model.js | 31 +- models/Assignment/operations.js | 7 +- models/Invoice/model.js | 105 ++++- models/Location/model.js | 29 +- models/Location/operations.js | 7 +- models/Partner/model.js | 18 +- models/Partner/operations.js | 7 +- models/Profile/model.js | 1 + models/User/model.js | 2 +- models/Venue/model.js | 23 + models/Venue/operations.js | 4 +- routes/admin.route.js | 20 + routes/assignment.route.js | 19 + routes/index.js | 3 + routes/partner.route.js | 20 + routes/profile.route.js | 4 +- routes/venue.route.js | 21 + 31 files changed, 2140 insertions(+), 96 deletions(-) create mode 100644 controllers/assignment.controller.js create mode 100644 controllers/partner.controller.js create mode 100644 controllers/venue.controller.js create mode 100644 documentation/assignment.js create mode 100644 documentation/partner.js create mode 100644 documentation/venue.js create mode 100644 routes/assignment.route.js create mode 100644 routes/partner.route.js create mode 100644 routes/venue.route.js diff --git a/controllers/admin.controller.js b/controllers/admin.controller.js index cadb1ac..0c726c6 100644 --- a/controllers/admin.controller.js +++ b/controllers/admin.controller.js @@ -2,15 +2,19 @@ import { createAccess } from "../models/Access/operations.js"; import { createRole, getAllRoles } from "../models/Role/operations.js"; import { createDesignation, + updateDesignation, getAllDesignations, } from "../models/Designation/operations.js"; +import { aggregateUser } from "../models/User/operations.js"; import { createDepartment, getAllDepartments, } from "../models/Department/operations.js"; import { getAllVenues, createVenue } from "../models/Venue/operations.js"; import { coordinatesToGeoJson } from "../helpers/geoJson.helper.js"; +import { getLocationsByQuery } from "../models/Location/operations.js"; import dayjs from "dayjs"; +import { ObjectId } from "mongodb"; export const createAccessController = async (req, res) => { try { @@ -31,57 +35,36 @@ export const createAccessController = async (req, res) => { } }; -export const getAllMetadataController = async (req, res) => { +export const updateDesignationController = async (req, res, next) => { try { - const roles = await getAllRoles(); - const designations = await getAllDesignations(); - const departments = await getAllDepartments(); - const branches = await getAllVenues({ category: "OWN" }); - const metadata = { - roles, - designations, - departments, - branches, - }; - res.status(200).json({ result: metadata }); + const { id } = req.params; + const designation = await updateDesignation(id, req.body); + res.status(200).json({ result: designation }); } catch (error) { - res.status(500).json({ error: error.message }); + console.log("updateDesignationController Error", error); + next(error); } }; -export const getAllRolesController = async (req, res) => { +export const updateDepartmentController = async (req, res, next) => { try { - const roles = await getAllRoles(); - res.status(200).json({ result: roles }); + const { id } = req.params; + const department = await updateDepartment(id, req.body); + res.status(200).json({ result: department }); } catch (error) { - res.status(500).json({ error: error.message }); + console.log("updateDepartmentController Error", error); + next(error); } }; -export const getAllDesignationsController = async (req, res) => { +export const updateRoleController = async (req, res, next) => { try { - const designations = await getAllDesignations(); - res.status(200).json({ result: designations }); + const { id } = req.params; + const role = await updateRole(id, req.body); + res.status(200).json({ result: role }); } catch (error) { - res.status(500).json({ error: error.message }); - } -}; - -export const getAllDepartmentsController = async (req, res) => { - try { - const departments = await getAllDepartments(); - res.status(200).json({ result: departments }); - } catch (error) { - res.status(500).json({ error: error.message }); - } -}; - -export const getAllBranchesController = async (req, res) => { - try { - const branches = await getAllVenues({ category: "OWN" }); - res.status(200).json({ result: branches }); - } catch (error) { - res.status(500).json({ error: error.message }); + console.log("updateRoleController Error", error); + next(error); } }; @@ -149,3 +132,244 @@ export const createBranchController = async (req, res) => { res.status(500).json({ error: error.message }); } }; + +export const getAllEmployeeController = async (req, res, next) => { + try { + const pipeline = [ + { + $match: { + isActive: true, + }, + }, + { + $lookup: { + from: "profiles", + localField: "_id", + foreignField: "user", + as: "profile", + }, + }, + { + $unwind: { + path: "$profile", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "accesses", + localField: "_id", + foreignField: "user", + as: "access", + }, + }, + { + $unwind: { + path: "$access", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "designations", + localField: "access.designation", + foreignField: "_id", + as: "designation", + }, + }, + { + $unwind: { + path: "$designation", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "departments", + localField: "access.department", + foreignField: "_id", + as: "department", + }, + }, + { + $unwind: { + path: "$department", + preserveNullAndEmptyArrays: true, + }, + }, + { + $project: { + _id: 1, + name: 1, + id: 1, + profile: 1, + designation: "$designation.name", + department: "$department.name", + }, + }, + ]; + + const data = await aggregateUser(pipeline); + + res.status(200).json({ result: data }); + } catch (error) { + console.log("getAllEmployeeController Error", error); + next(error); + } +}; + +export const getAllMetadataController = async (req, res) => { + try { + const roles = await getAllRoles(); + const designations = await getAllDesignations(); + const departments = await getAllDepartments(); + const branches = await getAllVenues({ category: "OWN" }); + const metadata = { + roles, + designations, + departments, + branches, + }; + res.status(200).json({ result: metadata }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}; + +export const getAllBranchesController = async (req, res) => { + try { + const branches = await getAllVenues({ category: "OWN" }); + res.status(200).json({ result: branches }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}; + +export const getEmployeeDetailsController = async (req, res, next) => { + try { + const { id } = req.params; + const pipeline = [ + { + $match: { + _id: new ObjectId.createFromHexString(id), + }, + }, + { + $lookup: { + from: "profiles", + localField: "_id", + foreignField: "user", + as: "profile", + }, + }, + { + $unwind: { + path: "$profile", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "accesses", + localField: "_id", + foreignField: "user", + as: "access", + }, + }, + { + $unwind: { + path: "$access", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "designations", + localField: "access.designation", + foreignField: "_id", + as: "designation", + }, + }, + { + $unwind: { + path: "$designation", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "departments", + localField: "access.department", + foreignField: "_id", + as: "department", + }, + }, + { + $unwind: { + path: "$department", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "roles", + localField: "access.role", + foreignField: "_id", + as: "role", + }, + }, + { + $unwind: { + path: "$role", + preserveNullAndEmptyArrays: true, + }, + }, + { + $lookup: { + from: "venues", + localField: "access.branch", + foreignField: "_id", + as: "branches", + }, + }, + { + $project: { + _id: 1, + name: 1, + department: "$department.name", + designation: "$designation.name", + role: "$role.name", + profile: 1, + branches: 1, + }, + }, + ]; + + const [data] = await aggregateUser(pipeline); + res.status(200).json({ result: data }); + } catch (error) { + console.log("getEmployeeDetails Error", error); + next(error); + } +}; + +export const getEmployeeLocationHistoryController = async (req, res, next) => { + try { + const { user } = req.params; + const { date = dayjs().subtract(330, "minute").toISOString() } = req.query; + const start = dayjs(date).startOf("day").toISOString(); + const end = dayjs(date).endOf("day").toISOString(); + + console.log("Start Date", start, end, user); + + const locations = await getLocationsByQuery({ + user, + createdOn: { $gte: start, $lte: end }, + }); + console.log("LOCATIONS", locations); + res.status(200).json({ result: locations }); + } catch (error) { + console.log("getEmployeeLocationHistory Error", error); + next(error); + } +}; diff --git a/controllers/assignment.controller.js b/controllers/assignment.controller.js new file mode 100644 index 0000000..18893b4 --- /dev/null +++ b/controllers/assignment.controller.js @@ -0,0 +1,63 @@ +import { + createAssignment, + updateAssignment, + getAssignmentsByQuery, +} from "../models/Assignment/operations.js"; +import dayjs from "dayjs"; + +export const createAssignmentHandler = async (req, res) => { + try { + const { user } = res.locals; + const previousAssignment = await updateAssignment(req.body.venue, { + isActive: false, + }); + const assignment = await createAssignment({ + ...req.body, + createdOn: dayjs().toISOString(), + createdBy: user.id, + }); + res.status(201).json({ result: { assignment, previousAssignment } }); + } catch (error) { + res.status(500).json({ message: "Error creating assignment", error }); + } +}; + +export const updateAssignmentHandler = async (req, res) => { + try { + const { id } = req.params; + const assignment = await updateAssignment(id, req.body); + res.status(200).json({ result: assignment }); + } catch (error) { + res.status(500).json({ message: "Error updating assignment", error }); + } +}; + +export const getAssignmentsByUserHandler = async (req, res) => { + try { + const { id } = req.params; + const assignment = await getAssignmentsByQuery({ user: id }); + res.status(200).json({ result: assignment }); + } catch (error) { + res.status(500).json({ message: "Error getting assignment", error }); + } +}; + +export const deactivateAssignmentHandler = async (req, res) => { + try { + const { id } = req.params; + const assignment = await updateAssignment(id, { isActive: false }); + res.status(200).json({ result: assignment }); + } catch (error) { + res.status(500).json({ message: "Error deactivating assignment", error }); + } +}; + +export const getAssignmentByVenueHandler = async (req, res) => { + try { + const { id } = req.params; + const assignment = await getAssignmentsByQuery({ venue: id }); + res.status(200).json({ result: assignment }); + } catch (error) { + res.status(500).json({ message: "Error getting assignment", error }); + } +}; diff --git a/controllers/location.controller.js b/controllers/location.controller.js index dd9cf47..7e0bb12 100644 --- a/controllers/location.controller.js +++ b/controllers/location.controller.js @@ -4,6 +4,42 @@ import { getLocationByRadius, } from "../models/Location/operations"; +/* +Sample Location Payload + +{ + "extras": {}, + "activity": { + "confidence": 100, + "type": "still" + }, + "timestamp": "2026-04-25T17:31:25.320Z", + "battery": { + "level": 0.57, + "is_charging": false + }, + "recorded_at": "2026-04-25T17:31:25.388Z", + "age": 0.074, + "is_moving": false, + "event": "motionchange", + "uuid": "4c476d94-b7db-4823-9270-805235ed0ec8", + "coords": { + "ellipsoidal_altitude": 0, + "altitude": 0, + "altitude_accuracy": 0.5, + "heading_accuracy": -1, + "heading": -1, + "speed": 0, + "accuracy": 5, + "longitude": 77.48675, + "speed_accuracy": 0.5, + "latitude": 9.9707883 + }, + "odometer_error": 0, + "odometer": 0 +} +*/ + export const createLocationController = async (req, res) => { try { const { user } = res.locals; @@ -11,6 +47,9 @@ export const createLocationController = async (req, res) => { const dbPayload = { battery: location.battery.level, coordinates: location.coords, + event: location.event, + heading: location.coords.heading, + activity: location?.activity?.type, recorded_at: location.recorded_at, }; const uploaded = await createLocation({ ...dbPayload, user: user?.id }); diff --git a/controllers/partner.controller.js b/controllers/partner.controller.js new file mode 100644 index 0000000..27c0679 --- /dev/null +++ b/controllers/partner.controller.js @@ -0,0 +1,194 @@ +import { + createPartner, + getPartnerById, + getPartnerByQuery, + getPartnersByQuery, + getAllPartners, + updatePartner, + aggregatePartner, +} from "../models/Partner/operations"; +import dayjs from "dayjs"; +import { ObjectId } from "mongodb"; + +export const createPartnerController = async (req, res) => { + try { + const { user } = res.locals; + const partner = await createPartner({ + ...req.body, + createdBy: user.id, + createdOn: dayjs().toISOString(), + }); + res.status(200).json({ result: partner }); + } catch (error) { + console.log("createPartnerController Error", error); + next(error); + } +}; + +export const getPartnerController = async (req, res, next) => { + try { + const { id } = req.params; + const pipeline = [ + // 1. Match the specific partner (Satisfies Req #1) + { + $match: { + _id: ObjectId.createFromHexString(id), + }, + }, + + // 2. Fetch all invoices for this partner + { + $lookup: { + from: "invoices", // Ensure this matches your actual collection name + localField: "_id", + foreignField: "customer", + as: "partnerInvoices", + }, + }, + + // 3. Calculate Invoice Metrics without unwinding (Satisfies Reqs #3, #4, #5) + { + $addFields: { + totalInvoicesCount: { $size: "$partnerInvoices" }, + pendingOrPartialInvoicesCount: { + $size: { + $filter: { + input: "$partnerInvoices", + as: "invoice", + cond: { + $in: ["$$invoice.status", ["PENDING", "PARTIAL"]], + }, + }, + }, + }, + // Note: Your schema uses "PAID", assuming that correlates to "COMPLETED" + totalInvoicesAmount: { $sum: "$partnerInvoices.total" }, + }, + }, + + // 4. Remove the heavy invoices array from memory before doing more lookups + { + $project: { + partnerInvoices: 0, + }, + }, + + // 5. Lookup Venues and nested Users/Profiles (Satisfies Reqs #2 & #6) + { + $lookup: { + from: "venues", + let: { partnerId: "$_id" }, + pipeline: [ + // Match venues to the partner (Assuming 'entity' field links to Partner _id) + { + $match: { + $expr: { $eq: ["$entity", "$$partnerId"] }, + }, + }, + + // Lookup Assignments for this specific venue + { + $lookup: { + from: "assignments", + let: { venueId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { $eq: ["$venue", "$$venueId"] }, + isActive: true, // Optional: ensuring we only get active assignments + }, + }, + // Lookup the User for the assignment + { + $lookup: { + from: "users", + localField: "user", + foreignField: "_id", + as: "userDetails", + }, + }, + { + $unwind: { + path: "$userDetails", + preserveNullAndEmptyArrays: true, + }, + }, + + // Lookup the Profile for the assigned User + { + $lookup: { + from: "profiles", + localField: "user", + foreignField: "user", + as: "userProfile", + }, + }, + { + $unwind: { + path: "$userProfile", + preserveNullAndEmptyArrays: true, + }, + }, + + // Clean up the assignment shape + { + $project: { + _id: 1, + targetedVisits: 1, + user: "$userDetails", + profile: "$userProfile", + }, + }, + ], + as: "assignedUsers", + }, + }, + ], + as: "venues", + }, + }, + ]; + const partner = await aggregatePartner(pipeline); + + if (!partner?.length) { + throw new Error("Partner not found"); + } + + res.status(200).json({ result: partner[0] || {} }); + } catch (error) { + console.log("getPartnerController Error", error); + next(error); + } +}; + +export const getAllPartnersController = async (req, res) => { + try { + const partners = await getAllPartners(); + res.status(200).json({ result: partners }); + } catch (error) { + console.log("getAllPartnersController Error", error); + next(error); + } +}; + +export const updatePartnerController = async (req, res) => { + try { + const { id } = req.params; + const partner = await updatePartner(id, req.body); + res.status(200).json({ result: partner }); + } catch (error) { + console.log("updatePartnerController Error", error); + next(error); + } +}; + +export const deletePartnerController = async (req, res, next) => { + try { + const { id } = req.params; + const partner = await updatePartner(id, { isActive: false }); + res.status(200).json({ result: partner }); + } catch (error) { + console.log("deletePartnerController Error", error); + next(error); + } +}; diff --git a/controllers/profile.controller.js b/controllers/profile.controller.js index 8579403..0269801 100644 --- a/controllers/profile.controller.js +++ b/controllers/profile.controller.js @@ -20,7 +20,7 @@ export const createOrEditProfileController = async (req, res, next) => { } }; -export const getProfileController = async (req, res, next) => { +export const getOwnProfileController = async (req, res, next) => { try { const { user } = res.locals; const profile = await getProfileByQuery({ userId: user.id }); @@ -30,4 +30,3 @@ export const getProfileController = async (req, res, next) => { next(error); } }; - diff --git a/controllers/venue.controller.js b/controllers/venue.controller.js new file mode 100644 index 0000000..6950dbe --- /dev/null +++ b/controllers/venue.controller.js @@ -0,0 +1,71 @@ +import { + createVenue, + getVenueById, + getVenuesByQuery, + getAllVenues, + updateVenue, + aggregateVenue, +} from "../models/Venue/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); + } +}; diff --git a/controllers/workflow.controller.js b/controllers/workflow.controller.js index 5e65d69..1fb1ecd 100644 --- a/controllers/workflow.controller.js +++ b/controllers/workflow.controller.js @@ -11,7 +11,7 @@ import { import dayjs from "dayjs"; import mongoose from "mongoose"; import { coordinatesToGeoJson } from "../helpers/geoJson.helper.js"; -import bcrypt from "bcryptjs"; +import bcrypt from "bcrypt"; export const createEmployee = async (req, res) => { const session = await mongoose.startSession(); @@ -41,7 +41,7 @@ export const createEmployee = async (req, res) => { throw { code: 400, message: "ID already assigned for Another Employee" }; } - const employee = await User.create( + const [employee] = await User.create( [ { name, @@ -49,11 +49,15 @@ export const createEmployee = async (req, res) => { hash, createdOn: dayjs().toISOString(), createdBy: user.id, + isFirstTime: true, + isActive: true, }, ], { session }, ); + console.log("EMPLOYEE", employee); + const profile = await Profile.create( [ { @@ -83,8 +87,13 @@ export const createEmployee = async (req, res) => { ], { session }, ); + await session.commitTransaction(); + session.endSession(); res.status(200).json({ result: access }); } catch (error) { + console.log("createEmployee Error", error); + await session.abortTransaction(); + session.endSession(); res.status(500).json({ error: error.message }); } }; diff --git a/documentation/admin.js b/documentation/admin.js index eaa9c3f..9d916e0 100644 --- a/documentation/admin.js +++ b/documentation/admin.js @@ -60,10 +60,10 @@ export default { }, }, }, - "/admin/designations": { + "/admin/metadata": { get: { tags: ["Admin"], - summary: "Get All Designations", + summary: "Get All Metadata", responses: { 200: { description: "OK", @@ -72,22 +72,10 @@ export default { }, }, }, - "/admin/departments": { + "/admin/employees": { get: { tags: ["Admin"], - summary: "Get All Departments", - responses: { - 200: { - description: "OK", - content: {}, - }, - }, - }, - }, - "/admin/roles": { - get: { - tags: ["Admin"], - summary: "Get All Roles", + summary: "Get All Employees", responses: { 200: { description: "OK", @@ -238,4 +226,56 @@ export default { }, }, }, + "/admin/employee/{id}": { + get: { + tags: ["Admin"], + summary: "Get Employee Details by ID", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, + "/admin/employee/{user}/locations": { + get: { + tags: ["Admin"], + summary: "Get Employee Details by ID", + parameters: [ + { + in: "path", + name: "user", + required: true, + schema: { + type: "string", + }, + }, + { + in: "query", + name: "date", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, }; diff --git a/documentation/assignment.js b/documentation/assignment.js new file mode 100644 index 0000000..2fe3a48 --- /dev/null +++ b/documentation/assignment.js @@ -0,0 +1,148 @@ +export default { + "/assignment": { + post: { + tags: ["Assignment"], + summary: "Create an assignment", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + user: { + type: "string", + required: true, + }, + venue: { + type: "string", + required: true, + }, + targetedVisits: { + type: "number", + required: true, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, + "/assignment/{id}": { + patch: { + tags: ["Assignment"], + summary: "Update an assignment", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + user: { + type: "string", + required: true, + }, + venue: { + type: "string", + required: true, + }, + targetedVisits: { + type: "number", + required: true, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + delete: { + tags: ["Assignment"], + summary: "Delete an assignment", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, + "/assignment/user/{id}": { + get: { + tags: ["Assignment"], + summary: "Get all assignments for a user", + parameters: [ + { + in: "path", + name: "id", + description: "User ID", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, + "/assignment/venue/{id}": { + get: { + tags: ["Assignment"], + summary: "Get all assignments for a Venue", + parameters: [ + { + in: "path", + name: "id", + description: "Venue ID", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, +}; diff --git a/documentation/documentation.json b/documentation/documentation.json index 384265f..adb4471 100644 --- a/documentation/documentation.json +++ b/documentation/documentation.json @@ -343,12 +343,12 @@ } } }, - "/admin/designations": { + "/admin/metadata": { "get": { "tags": [ "Admin" ], - "summary": "Get All Designations", + "summary": "Get All Metadata", "responses": { "200": { "description": "OK", @@ -357,26 +357,12 @@ } } }, - "/admin/departments": { + "/admin/employees": { "get": { "tags": [ "Admin" ], - "summary": "Get All Departments", - "responses": { - "200": { - "description": "OK", - "content": {} - } - } - } - }, - "/admin/roles": { - "get": { - "tags": [ - "Admin" - ], - "summary": "Get All Roles", + "summary": "Get All Employees", "responses": { "200": { "description": "OK", @@ -534,6 +520,602 @@ } } } + }, + "/admin/employee/{id}": { + "get": { + "tags": [ + "Admin" + ], + "summary": "Get Employee Details by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/admin/employee/{user}/locations": { + "get": { + "tags": [ + "Admin" + ], + "summary": "Get Employee Details by ID", + "parameters": [ + { + "in": "path", + "name": "user", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "date", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/assignment": { + "post": { + "tags": [ + "Assignment" + ], + "summary": "Create an assignment", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "type": "string", + "required": true + }, + "venue": { + "type": "string", + "required": true + }, + "targetedVisits": { + "type": "number", + "required": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/assignment/{id}": { + "patch": { + "tags": [ + "Assignment" + ], + "summary": "Update an assignment", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "type": "string", + "required": true + }, + "venue": { + "type": "string", + "required": true + }, + "targetedVisits": { + "type": "number", + "required": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + }, + "delete": { + "tags": [ + "Assignment" + ], + "summary": "Delete an assignment", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/assignment/user/{id}": { + "get": { + "tags": [ + "Assignment" + ], + "summary": "Get all assignments for a user", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "User ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/assignment/venue/{id}": { + "get": { + "tags": [ + "Assignment" + ], + "summary": "Get all assignments for a Venue", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Venue ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/partner": { + "get": { + "tags": [ + "Partner" + ], + "summary": "Get all Partners", + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + }, + "post": { + "tags": [ + "Partner" + ], + "summary": "Create New Partner", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "required": true + }, + "email": { + "type": "string", + "required": true + }, + "phone": { + "type": "string", + "required": true + }, + "address": { + "type": "string", + "required": true + }, + "city": { + "type": "string", + "required": true + }, + "state": { + "type": "string", + "required": true + }, + "pincode": { + "type": "string", + "required": true + }, + "contactPersons": { + "type": "array", + "required": true, + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "required": true + }, + "email": { + "type": "string", + "required": true + }, + "mobile": { + "type": "string", + "required": true + }, + "designation": { + "type": "string", + "required": true + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/partner/{id}": { + "get": { + "tags": [ + "Partner" + ], + "summary": "Get Partner Details by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + }, + "patch": { + "tags": [ + "Partner" + ], + "summary": "Update Partner Details by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "required": true + }, + "email": { + "type": "string", + "required": true + }, + "phone": { + "type": "string", + "required": true + }, + "address": { + "type": "string", + "required": true + }, + "city": { + "type": "string", + "required": true + }, + "state": { + "type": "string", + "required": true + }, + "pincode": { + "type": "string", + "required": true + }, + "contactPersons": { + "type": "array", + "required": true, + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "required": true + }, + "email": { + "type": "string", + "required": true + }, + "mobile": { + "type": "string", + "required": true + }, + "designation": { + "type": "string", + "required": true + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + }, + "delete": { + "tags": [ + "Partner" + ], + "summary": "Deactivate Partner by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": {} + } + } + } + }, + "/venue/": { + "post": { + "tags": [ + "Venues" + ], + "summary": "Create New Venue", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "required": true + }, + "category": { + "type": "string", + "required": true + }, + "type": { + "type": "string", + "required": true + }, + "entity": { + "type": "string", + "required": true + }, + "address": { + "type": "string", + "required": true + }, + "city": { + "type": "string", + "required": true + }, + "state": { + "type": "string", + "required": true + }, + "pincode": { + "type": "string", + "required": true + }, + "contactPerson": { + "type": "object", + "required": true, + "properties": { + "name": { + "type": "string", + "required": true + }, + "email": { + "type": "string", + "required": true + }, + "mobile": { + "type": "string", + "required": true + }, + "designation": { + "type": "string", + "required": true + } + }, + "location": { + "type": "object", + "required": true, + "properties": { + "latitude": { + "type": "number", + "required": true + }, + "longitude": { + "type": "number", + "required": true + } + } + } + } + } + } + } + } + } + } + }, + "/venue/entity/{id}": { + "get": { + "tags": [ + "Venues" + ], + "summary": "Get Venues by Entity", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Entity ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "response": { + "200": { + "description": "Success", + "content": {} + } + } + } + }, + "/venue/{id}": { + "get": { + "tags": [ + "Venues" + ], + "summary": "Get Venue by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Venue ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "respose": { + "200": { + "description": "Success", + "content": {} + } + } + }, + "delete": { + "tags": [ + "Venues" + ], + "summary": "Delete Venue by ID", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Venue ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "respose": { + "200": { + "description": "Success", + "content": {} + } + } + } } } } \ No newline at end of file diff --git a/documentation/index.js b/documentation/index.js index 2b840dd..282aed6 100644 --- a/documentation/index.js +++ b/documentation/index.js @@ -4,7 +4,10 @@ import upload from "./upload.js"; import user from "./user.js"; import profile from "./profile.js"; import admin from "./admin.js"; -import location from "./location.js" +import location from "./location.js"; +import assignment from "./assignment.js"; +import partner from "./partner.js"; +import venue from "./venue.js"; const GENERAL_CONFIG = { openapi: "3.0.1", @@ -47,6 +50,9 @@ let paths = { ...location, ...upload, ...admin, + ...assignment, + ...partner, + ...venue, }; const getSwaggerDocument = () => { diff --git a/documentation/partner.js b/documentation/partner.js new file mode 100644 index 0000000..06f444b --- /dev/null +++ b/documentation/partner.js @@ -0,0 +1,216 @@ +export default { + "/partner": { + get: { + tags: ["Partner"], + summary: "Get all Partners", + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + post: { + tags: ["Partner"], + summary: "Create New Partner", + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string", + required: true, + }, + email: { + type: "string", + required: true, + }, + phone: { + type: "string", + required: true, + }, + address: { + type: "string", + required: true, + }, + city: { + type: "string", + required: true, + }, + state: { + type: "string", + required: true, + }, + pincode: { + type: "string", + required: true, + }, + contactPersons: { + type: "array", + required: true, + items: { + type: "object", + properties: { + name: { + type: "string", + required: true, + }, + email: { + type: "string", + required: true, + }, + mobile: { + type: "string", + required: true, + }, + designation: { + type: "string", + required: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, + "/partner/{id}": { + get: { + tags: ["Partner"], + summary: "Get Partner Details by ID", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + patch: { + tags: ["Partner"], + summary: "Update Partner Details by ID", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string", + required: true, + }, + email: { + type: "string", + required: true, + }, + phone: { + type: "string", + required: true, + }, + address: { + type: "string", + required: true, + }, + city: { + type: "string", + required: true, + }, + state: { + type: "string", + required: true, + }, + pincode: { + type: "string", + required: true, + }, + contactPersons: { + type: "array", + required: true, + items: { + type: "object", + properties: { + name: { + type: "string", + required: true, + }, + email: { + type: "string", + required: true, + }, + mobile: { + type: "string", + required: true, + }, + designation: { + type: "string", + required: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + delete: { + tags: ["Partner"], + summary: "Deactivate Partner by ID", + parameters: [ + { + in: "path", + name: "id", + required: true, + schema: { + type: "string", + }, + }, + ], + responses: { + 200: { + description: "OK", + content: {}, + }, + }, + }, + }, +}; diff --git a/documentation/venue.js b/documentation/venue.js new file mode 100644 index 0000000..e5f1753 --- /dev/null +++ b/documentation/venue.js @@ -0,0 +1,156 @@ +import { response } from "express"; + +export default { + "/venue/": { + post: { + tags: ["Venues"], + summary: "Create New Venue", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string", + required: true, + }, + category: { + type: "string", + required: true, + }, + type: { + type: "string", + required: true, + }, + entity: { + type: "string", + required: true, + }, + address: { + type: "string", + required: true, + }, + city: { + type: "string", + required: true, + }, + state: { + type: "string", + required: true, + }, + pincode: { + type: "string", + required: true, + }, + contactPerson: { + type: "object", + required: true, + properties: { + name: { + type: "string", + required: true, + }, + email: { + type: "string", + required: true, + }, + mobile: { + type: "string", + required: true, + }, + designation: { + type: "string", + required: true, + }, + }, + location: { + type: "object", + required: true, + properties: { + latitude: { + type: "number", + required: true, + }, + longitude: { + type: "number", + required: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + "/venue/entity/{id}": { + get: { + tags: ["Venues"], + summary: "Get Venues by Entity", + parameters: [ + { + in: "path", + name: "id", + description: "Entity ID", + required: true, + schema: { + type: "string", + }, + }, + ], + response: { + 200: { + description: "Success", + content: {}, + }, + }, + }, + }, + "/venue/{id}": { + get: { + tags: ["Venues"], + summary: "Get Venue by ID", + parameters: [ + { + in: "path", + name: "id", + description: "Venue ID", + required: true, + schema: { + type: "string", + }, + }, + ], + respose: { + 200: { + description: "Success", + content: {}, + }, + }, + }, + delete: { + tags: ["Venues"], + summary: "Delete Venue by ID", + parameters: [ + { + in: "path", + name: "id", + description: "Venue ID", + required: true, + schema: { + type: "string", + }, + }, + ], + respose: { + 200: { + description: "Success", + content: {}, + }, + }, + }, + }, +}; diff --git a/index.js b/index.js index 1137db9..f319c27 100644 --- a/index.js +++ b/index.js @@ -11,7 +11,14 @@ import swaggerUi from "swagger-ui-express"; import swaggerDoc from "./documentation/documentation.json"; import getSwaggerDocument from "./documentation"; // import socketState from "./state/socketState.js"; -import { AdminRoutes, UserRoutes, LocationRoutes } from "./routes"; +import { + AdminRoutes, + UserRoutes, + LocationRoutes, + AssignmentRoutes, + PartnerRoutes, + VenueRoutes +} from "./routes"; dotenv.config(); @@ -44,6 +51,9 @@ app.use("/v0/docs", swaggerUi.serve, swaggerUi.setup(swaggerDoc)); app.use("/v0/user", UserRoutes); app.use("/v0/admin", AdminRoutes); app.use("/v0/location", LocationRoutes); +app.use("/v0/assignment", AssignmentRoutes); +app.use("/v0/partner", PartnerRoutes); +app.use("/v0/venue", VenueRoutes); app.use((err, req, res, next) => { const statusCode = err.status || 500; diff --git a/models/Assignment/model.js b/models/Assignment/model.js index 941c80c..c90a5de 100644 --- a/models/Assignment/model.js +++ b/models/Assignment/model.js @@ -1,5 +1,34 @@ import { model, Schema, Types } from "mongoose"; -const schema = new Schema({}); +const schema = new Schema({ + createdOn: { + type: Date, + required: true, + }, + createdBy: { + type: Types.ObjectId, + required: true, + ref: "user", + }, + isActive: { + type: Boolean, + default: true, + }, + user: { + type: Types.ObjectId, + required: true, + ref: "user", + }, + venue: { + type: Types.ObjectId, + required: true, + ref: "venue", + }, + targetedVisits: { + type: Number, + required: true, + default: 5, + }, +}); export default model("assignment", schema); diff --git a/models/Assignment/operations.js b/models/Assignment/operations.js index 4dca652..58e647b 100644 --- a/models/Assignment/operations.js +++ b/models/Assignment/operations.js @@ -10,11 +10,16 @@ export const getAssignmentById = async (id) => { return await Model.findById(id); }; -// Read (Get by Query) +// Read (Get One by Query) export const getAssignmentByQuery = async (query) => { return await Model.findOne(query); } +// Read (Get All by Query) +export const getAssignmentsByQuery = async (query) => { + return await Model.find(query); +}; + // Read (Get all) export const getAllAssignments = async () => { return await Model.find(); diff --git a/models/Invoice/model.js b/models/Invoice/model.js index fb2eb99..790cb1f 100644 --- a/models/Invoice/model.js +++ b/models/Invoice/model.js @@ -1,5 +1,108 @@ import { model, Schema, Types } from "mongoose"; -const schema = new Schema({}); +const paymentHistorySchema = new Schema({ + amount: { + type: Number, + required: true, + }, + paymentDate: { + type: Date, + required: true, + }, + paymentMethod: { + type: String, + required: true, + }, + transactionId: { + type: String, + required: true, + }, + createdOn: { + type: Date, + required: true, + }, + createdBy: { + type: Types.ObjectId, + ref: "user", + required: true, + }, +}); + +const itemSchema = new Schema({ + id: { + type: Types.ObjectId, + required: true, + }, + unitCostPrice: { + type: Number, + required: true, + }, + unitSellingPrice: { + type: Number, + required: true, + }, + qty: { + type: Number, + required: true, + }, + taxPercent: { + type: Number, + required: true, + }, + taxAmount: { + type: Number, + required: true, + }, + discount: { + type: Number, + required: true, + }, + total: { + type: Number, + required: true, + }, +}); + +const schema = new Schema({ + customer: { + type: Types.ObjectId, + ref: "partner", + required: true, + }, + items: { + type: [itemSchema], + required: true, + }, + netTotal: { + type: Number, + required: true, + }, + total: { + type: Number, + required: true, + }, + status: { + type: String, + enum: ["PENDING", "COMPLETED", "PARTIAL"], + default: "PENDING", + }, + dueDate: { + type: Date, + required: true, + }, + createdOn: { + type: Date, + required: true, + }, + createdBy: { + type: Types.ObjectId, + ref: "user", + required: true, + }, + paymentHistory: { + type: [paymentHistorySchema], + default: [], + }, +}); export default model("invoice", schema); diff --git a/models/Location/model.js b/models/Location/model.js index d960c4e..9a3ca55 100644 --- a/models/Location/model.js +++ b/models/Location/model.js @@ -1,6 +1,18 @@ import { model, Schema, Types } from "mongoose"; import { locationSchema } from "../../helpers"; +const geofenceSchema = new Schema({ + venue: { + type: Types.ObjectId, + required: false, + ref: "venue", + }, + action: { + type: String, + required: false, + }, +}); + const schema = new Schema({ user: { type: Types.ObjectId, @@ -16,10 +28,21 @@ const schema = new Schema({ type: Number, required: true, }, - venue: { - type: Types.ObjectId, + event: { + type: String, + required: true, + }, + activity: { + type: String, + required: false, + }, + heading: { + type: Number, + required: false, + }, + geofence: { + type: geofenceSchema, required: false, - ref: "venue", }, }); diff --git a/models/Location/operations.js b/models/Location/operations.js index 45b9f72..7a99f36 100644 --- a/models/Location/operations.js +++ b/models/Location/operations.js @@ -17,12 +17,13 @@ export const getLocationById = async (id) => { }; // Read (Get by Query) -export const getLocationByQuery = async (query) => { - return await Model.findOne(query).sort({ createdOn: -1 }); +export const getLocationsByQuery = async (query) => { + console.log("QUERY", query); + return await Model.find(query).sort({ createdOn: -1 }); }; // Read (Get by Radius) -export const getLocationByRadius = async (radius) => { +export const getLocationsByRadius = async (radius) => { return await Model.find(query); }; diff --git a/models/Partner/model.js b/models/Partner/model.js index 6be23dd..84631ca 100644 --- a/models/Partner/model.js +++ b/models/Partner/model.js @@ -20,10 +20,17 @@ const contactPersonSchema = new Schema({ }); const schema = new Schema({ + id: { + type: String, + required: true, + }, name: { type: String, required: true, }, + tags: { + type: [String], + }, createdBy: { type: Types.ObjectId, required: true, @@ -37,7 +44,7 @@ const schema = new Schema({ type: String, required: true, }, - mobile: { + phone: { type: String, required: true, }, @@ -57,11 +64,18 @@ const schema = new Schema({ type: String, required: true, }, + gst: { + type: String, + required: true, + }, isActive: { type: Boolean, default: true, }, - contactPersons: [contactPersonSchema], + contactPersons: { + type: [contactPersonSchema], + required: true, + }, }); export default model("partner", schema); diff --git a/models/Partner/operations.js b/models/Partner/operations.js index 80f13aa..0744655 100644 --- a/models/Partner/operations.js +++ b/models/Partner/operations.js @@ -13,7 +13,12 @@ export const getPartnerById = async (id) => { // Read (Get by Query) export const getPartnerByQuery = async (query) => { return await Model.findOne(query); -} +}; + +// Read (Get all) +export const getPartnersByQuery = async (query) => { + return await Model.find(query); +}; // Read (Get all) export const getAllPartners = async () => { diff --git a/models/Profile/model.js b/models/Profile/model.js index d1da52c..09983c1 100644 --- a/models/Profile/model.js +++ b/models/Profile/model.js @@ -32,6 +32,7 @@ const schema = new Schema({ user: { type: Types.ObjectId, required: true, + ref: 'user' }, }); diff --git a/models/User/model.js b/models/User/model.js index e093e72..8017d5f 100644 --- a/models/User/model.js +++ b/models/User/model.js @@ -15,7 +15,7 @@ const schema = new Schema({ }, refreshToken: { type: String, - required: true, + required: false, }, isFirstTime: { type: Boolean, diff --git a/models/Venue/model.js b/models/Venue/model.js index 2eecdf5..f72537e 100644 --- a/models/Venue/model.js +++ b/models/Venue/model.js @@ -1,6 +1,25 @@ import { model, Schema, Types } from "mongoose"; import { locationSchema } from "../../helpers"; +const contactPersonSchema = new Schema({ + name: { + type: String, + required: true, + }, + email: { + type: String, + required: true, + }, + mobile: { + type: String, + required: true, + }, + designation: { + type: String, + required: true, + }, +}); + const schema = new Schema({ name: { type: String, @@ -47,6 +66,10 @@ const schema = new Schema({ type: Types.ObjectId, required: false, }, + contactPerson: { + type: contactPersonSchema, + required: false, + }, }); schema.index({ location: "2dsphere" }); diff --git a/models/Venue/operations.js b/models/Venue/operations.js index 38ae3f7..da7f0b5 100644 --- a/models/Venue/operations.js +++ b/models/Venue/operations.js @@ -11,8 +11,8 @@ export const getVenueById = async (id) => { }; // Read (Get by Query) -export const getVenueByQuery = async (query) => { - return await Model.findOne(query); +export const getVenuesByQuery = async (query) => { + return await Model.find(query); }; // Read (Get all) diff --git a/routes/admin.route.js b/routes/admin.route.js index abab500..240e582 100644 --- a/routes/admin.route.js +++ b/routes/admin.route.js @@ -8,7 +8,11 @@ import { createDepartmentController, createDesignationController, createRoleController, + getAllEmployeeController, + getEmployeeDetailsController, + getEmployeeLocationHistoryController, } from "../controllers/admin.controller"; +import { createEmployee } from "../controllers/workflow.controller"; const router = new Router(); @@ -25,6 +29,22 @@ router.post( authorize("department", "write"), createDepartmentController, ); +router.get( + "/employees", + authorize("employee", "read"), + getAllEmployeeController, +); +router.post("/employee", authorize("employee", "write"), createEmployee); +router.get( + "/employee/:id", + authorize("employee", "read"), + getEmployeeDetailsController, +); +router.get( + "/employee/:user/locations", + authorize("employee", "read"), + getEmployeeLocationHistoryController, +); router.post( "/designation", authorize("designation", "write"), diff --git a/routes/assignment.route.js b/routes/assignment.route.js new file mode 100644 index 0000000..3fa13d6 --- /dev/null +++ b/routes/assignment.route.js @@ -0,0 +1,19 @@ +import { Router } from "express"; +import { + createAssignmentHandler, + updateAssignmentHandler, + getAssignmentsByUserHandler, + deactivateAssignmentHandler, + getAssignmentByVenueHandler, +} from "../controllers/assignment.controller"; +import {authorize} from "../middlewares/jwt.middleware"; + +const router = new Router(); + +router.post("/", authorize("assignment", "write"), createAssignmentHandler); +router.patch("/:id", authorize("assignment", "write"), updateAssignmentHandler); +router.get("/user/:id", authorize("assignment", "read"), getAssignmentsByUserHandler); +router.delete("/:id", authorize("assignment", "write"), deactivateAssignmentHandler); +router.get("/venue/:id", authorize("assignment", "read"), getAssignmentByVenueHandler); + +export default router; diff --git a/routes/index.js b/routes/index.js index ca17bde..9f2165f 100644 --- a/routes/index.js +++ b/routes/index.js @@ -2,3 +2,6 @@ export { default as UserRoutes } from "./user.route"; export { default as ProfileRoutes } from "./profile.route"; export { default as AdminRoutes } from "./admin.route"; export { default as LocationRoutes } from "./location.route"; +export { default as AssignmentRoutes } from "./assignment.route"; +export { default as VenueRoutes } from "./venue.route"; +export { default as PartnerRoutes } from "./partner.route"; diff --git a/routes/partner.route.js b/routes/partner.route.js new file mode 100644 index 0000000..bec2f5b --- /dev/null +++ b/routes/partner.route.js @@ -0,0 +1,20 @@ +import { Router } from "express"; +import { + createPartnerController, + getPartnerController, + getPartnersController, + getAllPartnersController, + updatePartnerController, + deletePartnerController, +} from "../controllers/partner.controller"; +import { authorize } from "../middlewares/jwt.middleware"; + +const router = new Router(); + +router.post("/", authorize("partner", "write"), createPartnerController); +router.get("/", authorize("partner", "read"), getAllPartnersController); +router.get("/:id", authorize("partner", "read"), getPartnerController); +router.patch("/:id", authorize("partner", "write"), updatePartnerController); +router.delete("/:id", authorize("partner", "write"), deletePartnerController); + +export default router; diff --git a/routes/profile.route.js b/routes/profile.route.js index d62ac7e..e022b71 100644 --- a/routes/profile.route.js +++ b/routes/profile.route.js @@ -1,7 +1,7 @@ import { Router } from "express"; import { createOrEditProfileController, - getProfileController, + getOwnProfileController, } from "../controllers/profile.controller"; import { authorize } from "../middlewares/jwt.middleware"; @@ -12,6 +12,6 @@ router.post( authorize("generic", "generic"), createOrEditProfileController, ); -router.get("/", authorize("generic", "generic"), getProfileController); +router.get("/", authorize("generic", "generic"), getOwnProfileController); export default router; diff --git a/routes/venue.route.js b/routes/venue.route.js new file mode 100644 index 0000000..22bee36 --- /dev/null +++ b/routes/venue.route.js @@ -0,0 +1,21 @@ +import { Router } from "express"; +import { + createVenueController, + deleteVenueController, + getVenuesByEntityController, + getVenueController, +} from "../controllers/venue.controller"; +import { authorize } from "../middlewares/jwt.middleware"; + +const router = new Router(); + +router.post("/", authorize("venue", "write"), createVenueController); +router.get( + "/entity/:id", + authorize("venue", "read"), + getVenuesByEntityController, +); +router.get("/:id", authorize("venue", "read"), getVenueController); +router.delete("/:id", authorize("venue", "write"), deleteVenueController); + +export default router;