reinitializing codebase and resuming development
This commit is contained in:
@@ -20,7 +20,7 @@ import { getLocationsByQuery } from "../models/Location/operations.js";
|
||||
import dayjs from "dayjs";
|
||||
import { ObjectId } from "mongodb";
|
||||
|
||||
export const createAccessController = async (req, res) => {
|
||||
export const createAccessController = async (req, res, next) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
const { employee, designation, department, branch, role } = req.body;
|
||||
@@ -35,7 +35,8 @@ export const createAccessController = async (req, res) => {
|
||||
});
|
||||
res.status(200).json({ result: access });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
console.log("createAccessController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -203,6 +204,74 @@ export const getAllEmployeeController = async (req, res, next) => {
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "assignments",
|
||||
localField: "_id",
|
||||
foreignField: "user",
|
||||
as: "assignments",
|
||||
pipeline: [
|
||||
{
|
||||
$match: {
|
||||
isActive: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$assignments",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "venues",
|
||||
localField: "assignments.venue",
|
||||
foreignField: "_id",
|
||||
as: "assignments.venue",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$assignments.venue",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "partners",
|
||||
localField: "assignments.venue.entity",
|
||||
foreignField: "_id",
|
||||
as: "assignments.venue.entity",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$assignments.venue.entity",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
// {
|
||||
// $unwind: {
|
||||
// path: "$assignedVenues",
|
||||
// preserveNullAndEmptyArrays: true,
|
||||
// },
|
||||
// },
|
||||
{
|
||||
$group: {
|
||||
_id: "$_id",
|
||||
name: { $first: "$name" },
|
||||
id: { $first: "$id" },
|
||||
profile: { $first: "$profile" },
|
||||
designation: { $first: "$designation" },
|
||||
department: { $first: "$department" },
|
||||
assignments: {
|
||||
$push: "$assignments",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
_id: 1,
|
||||
@@ -211,6 +280,7 @@ export const getAllEmployeeController = async (req, res, next) => {
|
||||
profile: 1,
|
||||
designation: "$designation.name",
|
||||
department: "$department.name",
|
||||
assignments: 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import {
|
||||
createEnquiry,
|
||||
updateEnquiry,
|
||||
getAllEnquiries,
|
||||
getEnquiryByQuery,
|
||||
aggregateEnquiry,
|
||||
} from "../models/Enquiry/operations";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
export const createEnquiryController = async (req, res) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
const enquiry = await createEnquiry({ ...req.body, createdBy: user.id });
|
||||
return res.json({ result: enquiry });
|
||||
} catch (error) {
|
||||
console.log("createEnquiryController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getMyEnquiriesController = async (req, res, next) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
const enquiries = getAllEnquiries({ createdBy: user.id });
|
||||
return res.json({ result: enquiries });
|
||||
} catch (error) {
|
||||
console.log("getMyEnquiriesController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getAllPendingEnquiriesController = async (req, res, next) => {
|
||||
try {
|
||||
const enquiries = await getAllEnquiries({ status: "CREATED" });
|
||||
return res.json({ result: enquiries });
|
||||
} catch (error) {
|
||||
console.log("getAllPendingEnquiriesController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getAllConfirmedEnquiriesController = async (req, res, next) => {
|
||||
try {
|
||||
const enquiries = await getAllEnquiries({ status: "CONFIRMED" });
|
||||
return res.json({ result: enquiries });
|
||||
} catch (error) {
|
||||
console.log("getAllConfirmedEnquiriesController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const updateEnquiryStatusController = async (req, res, next) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { status } = req.body;
|
||||
const enquiry = await updateEnquiry(id, { status });
|
||||
return res.json({ result: enquiry });
|
||||
} catch (error) {
|
||||
console.log("updateEnquiryStatusController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const addRemarkToEnquiryController = async (req, res, next) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { remark, type, createdBy } = req.body;
|
||||
const enquiry = await updateEnquiry(id, {
|
||||
$push: {
|
||||
remarks: {
|
||||
remark,
|
||||
type,
|
||||
createdBy,
|
||||
createdOn: dayjs().toISOString(),
|
||||
},
|
||||
},
|
||||
});
|
||||
return res.json({ result: enquiry });
|
||||
} catch (error) {
|
||||
console.log("addRemarkToEnquiryController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getEnquiryByIdController = async (req, res, next) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const enquiry = await getEnquiryById(id);
|
||||
return res.json({ result: enquiry });
|
||||
} catch (error) {
|
||||
console.log("getEnquiryByIdController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
getLocationByQuery,
|
||||
getLocationByRadius,
|
||||
} from "../models/Location/operations";
|
||||
import { createVisit } from "../models/Visit/operations";
|
||||
import { aggregateAssignment } from "../models/Assignment/operations";
|
||||
import { ObjectId } from "mongodb";
|
||||
|
||||
@@ -93,13 +94,14 @@ export const createLocationController = async (req, res) => {
|
||||
};
|
||||
|
||||
if (location.event === "geofence") {
|
||||
const [assignment, partner, venue] =
|
||||
location?.geofence?.identifier?.split("-");
|
||||
const { assignment, partner, venue } = location?.geofence?.extras;
|
||||
const visit = await createVisit({ assignment, venue });
|
||||
const geofencePayload = {
|
||||
assignment,
|
||||
partner,
|
||||
venue,
|
||||
action: location?.geofence?.action,
|
||||
visit: visit?._id,
|
||||
};
|
||||
|
||||
dbPayload.geofence = geofencePayload;
|
||||
|
||||
@@ -7,17 +7,74 @@ import {
|
||||
updatePartner,
|
||||
aggregatePartner,
|
||||
} from "../models/Partner/operations";
|
||||
import { aggregateAccess } from "../models/Access/operations";
|
||||
import {
|
||||
createApproval,
|
||||
updateApproval,
|
||||
aggregateApproval,
|
||||
} from "../models/Approval/operations";
|
||||
import dayjs from "dayjs";
|
||||
import { ObjectId } from "mongodb";
|
||||
|
||||
export const createPartnerController = async (req, res) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
const partner = await createPartner({
|
||||
|
||||
const accessRole = await aggregateAccess([
|
||||
{
|
||||
$match: {
|
||||
user: ObjectId.createFromHexString(user.id),
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "roles",
|
||||
localField: "role",
|
||||
foreignField: "_id",
|
||||
as: "role",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$role",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
console.log("ACCESS ROLE", accessRole[0]?.role?.modules);
|
||||
|
||||
const isAutoApproved = accessRole[0]?.role?.modules?.some(
|
||||
({ module, permission }) => {
|
||||
return module === "partner" && permission === "authorize";
|
||||
},
|
||||
);
|
||||
|
||||
const partnerPayload = {
|
||||
...req.body,
|
||||
createdBy: user.id,
|
||||
createdOn: dayjs().toISOString(),
|
||||
});
|
||||
temp: true,
|
||||
isApproved: isAutoApproved,
|
||||
};
|
||||
|
||||
const approvalPayload = {
|
||||
entity: partner.id,
|
||||
type: "partner",
|
||||
createdBy: user.id,
|
||||
createdOn: dayjs().toISOString(),
|
||||
};
|
||||
|
||||
if (isAutoApproved) {
|
||||
approvalPayload.approvedBy = user.id;
|
||||
approvalPayload.approvedOn = dayjs().toISOString();
|
||||
approvalPayload.isAutoApproved = true;
|
||||
approvalPayload.isApproved = true;
|
||||
}
|
||||
|
||||
const partner = await createPartner(partnerPayload);
|
||||
|
||||
const approval = await createApproval(approvalPayload);
|
||||
res.status(200).json({ result: partner });
|
||||
} catch (error) {
|
||||
console.log("createPartnerController Error", error);
|
||||
@@ -39,37 +96,37 @@ export const getPartnerController = async (req, res, next) => {
|
||||
// 2. Fetch all invoices for this partner
|
||||
{
|
||||
$lookup: {
|
||||
from: "invoices", // Ensure this matches your actual collection name
|
||||
from: "orders", // Ensure this matches your actual collection name
|
||||
localField: "_id",
|
||||
foreignField: "customer",
|
||||
as: "partnerInvoices",
|
||||
foreignField: "partner",
|
||||
as: "partnerOrders",
|
||||
},
|
||||
},
|
||||
|
||||
// 3. Calculate Invoice Metrics without unwinding (Satisfies Reqs #3, #4, #5)
|
||||
{
|
||||
$addFields: {
|
||||
totalInvoicesCount: { $size: "$partnerInvoices" },
|
||||
pendingOrPartialInvoicesCount: {
|
||||
totalOrdersCount: { $size: "$partnerOrders" },
|
||||
pendingOrPartialOrdersCount: {
|
||||
$size: {
|
||||
$filter: {
|
||||
input: "$partnerInvoices",
|
||||
as: "invoice",
|
||||
input: "$partnerOrders",
|
||||
as: "order",
|
||||
cond: {
|
||||
$in: ["$$invoice.status", ["PENDING", "PARTIAL"]],
|
||||
$in: ["$$order.status", ["INPROGRESS", "COMPLETED"]],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
// Note: Your schema uses "PAID", assuming that correlates to "COMPLETED"
|
||||
totalInvoicesAmount: { $sum: "$partnerInvoices.total" },
|
||||
totalOrdersAmount: { $sum: "$partnerOrders.total" },
|
||||
},
|
||||
},
|
||||
|
||||
// 4. Remove the heavy invoices array from memory before doing more lookups
|
||||
{
|
||||
$project: {
|
||||
partnerInvoices: 0,
|
||||
partnerOrders: 0,
|
||||
},
|
||||
},
|
||||
|
||||
@@ -163,7 +220,7 @@ export const getPartnerController = async (req, res, next) => {
|
||||
|
||||
export const getAllPartnersController = async (req, res) => {
|
||||
try {
|
||||
const partners = await getAllPartners();
|
||||
const partners = await getPartnersByQuery({ isApproved: true });
|
||||
res.status(200).json({ result: partners });
|
||||
} catch (error) {
|
||||
console.log("getAllPartnersController Error", error);
|
||||
@@ -192,3 +249,59 @@ export const deletePartnerController = async (req, res, next) => {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const approvePartnerController = async (req, res, next) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
const { id } = req.params;
|
||||
|
||||
const approval = await updateApproval(id, {
|
||||
isApproved: true,
|
||||
isAutoApproved: false,
|
||||
approvedBy: user.id,
|
||||
approvedOn: dayjs().toISOString(),
|
||||
});
|
||||
|
||||
const partner = await updatePartner(approval.entity, {
|
||||
isApproved: true,
|
||||
temp: true,
|
||||
});
|
||||
|
||||
res.status(200).json({ result: partner });
|
||||
} catch (error) {
|
||||
console.log("approvePartnerController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getUnapprovedPartnersController = async (req, res, next) => {
|
||||
try {
|
||||
const pipeline = [
|
||||
{
|
||||
$match: {
|
||||
isApproved: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "partners",
|
||||
localField: "entity",
|
||||
foreignField: "_id",
|
||||
as: "partner",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$partner",
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const unapprovedPartners = await aggregateApproval(pipeline);
|
||||
|
||||
res.status(200).json({ result: unapprovedPartners });
|
||||
} catch (error) {
|
||||
console.log("getUnapprovedPartnersController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { createUser, getUserByQuery } from "../models/User/operations.js";
|
||||
import { aggregateAccess } from "../models/Access/operations.js";
|
||||
import bcrypt from "bcrypt";
|
||||
import dayjs from "dayjs";
|
||||
import {
|
||||
@@ -6,6 +7,7 @@ import {
|
||||
getRefreshToken,
|
||||
getEncryptedPayload,
|
||||
} from "../middlewares/jwt.middleware.js";
|
||||
import { ObjectId } from "mongodb";
|
||||
|
||||
export const createUserController = async (req, res, next) => {
|
||||
try {
|
||||
@@ -80,3 +82,66 @@ export const renewAccessTokenController = async (req, res, next) => {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
export const getAccessibleModulesController = async (req, res, next) => {
|
||||
try {
|
||||
const { user } = res.locals;
|
||||
|
||||
const pipeline = [
|
||||
{
|
||||
$match: {
|
||||
user: ObjectId.createFromHexString(user.id),
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "roles",
|
||||
localField: "role",
|
||||
foreignField: "_id",
|
||||
as: "role",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$role",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "departments",
|
||||
localField: "department",
|
||||
foreignField: "_id",
|
||||
as: "department",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$department",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "designations",
|
||||
localField: "designation",
|
||||
foreignField: "_id",
|
||||
as: "designation",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: "$designation",
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const accessibleModules = await aggregateAccess(pipeline)
|
||||
|
||||
res.status(200).json({ result: accessibleModules[0] });
|
||||
} catch (error) {
|
||||
console.log("getAccessibleModulesController Error", error);
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user