Operational Endpoints for Admin, Products, Assignments, Location, Vendor, Venue completed. Geofence Testing PEnding

This commit is contained in:
Shibi Chakkaravarthy
2026-06-14 08:04:31 +05:30
parent 5326235183
commit 36e1bf664f
26 changed files with 1392 additions and 25 deletions
+11 -5
View File
@@ -1,5 +1,9 @@
import { createAccess } from "../models/Access/operations.js";
import { createRole, getAllRoles } from "../models/Role/operations.js";
import {
createRole,
getAllRoles,
updateRole,
} from "../models/Role/operations.js";
import {
createDesignation,
updateDesignation,
@@ -60,6 +64,7 @@ export const updateDepartmentController = async (req, res, next) => {
export const updateRoleController = async (req, res, next) => {
try {
const { id } = req.params;
console.log("REQ BODY", req.body, id);
const role = await updateRole(id, req.body);
res.status(200).json({ result: role });
} catch (error) {
@@ -78,6 +83,7 @@ export const createRoleController = async (req, res) => {
});
res.status(200).json({ result: role });
} catch (error) {
console.log("createRoleController Error", error);
res.status(500).json({ error: error.message });
}
};
@@ -251,7 +257,7 @@ export const getEmployeeDetailsController = async (req, res, next) => {
const pipeline = [
{
$match: {
_id: new ObjectId.createFromHexString(id),
_id: ObjectId.createFromHexString(id),
},
},
{
@@ -336,9 +342,9 @@ export const getEmployeeDetailsController = async (req, res, next) => {
$project: {
_id: 1,
name: 1,
department: "$department.name",
designation: "$designation.name",
role: "$role.name",
department: 1,
designation: 1,
role: 1,
profile: 1,
branches: 1,
},
+38 -1
View File
@@ -2,8 +2,10 @@ import {
createAssignment,
updateAssignment,
getAssignmentsByQuery,
aggregateAssignment,
} from "../models/Assignment/operations.js";
import dayjs from "dayjs";
import { ObjectId } from "mongodb";
export const createAssignmentHandler = async (req, res) => {
try {
@@ -13,6 +15,7 @@ export const createAssignmentHandler = async (req, res) => {
});
const assignment = await createAssignment({
...req.body,
isActive: true,
createdOn: dayjs().toISOString(),
createdBy: user.id,
});
@@ -35,7 +38,41 @@ export const updateAssignmentHandler = async (req, res) => {
export const getAssignmentsByUserHandler = async (req, res) => {
try {
const { id } = req.params;
const assignment = await getAssignmentsByQuery({ user: id });
const pipeline = [
{
$match: {
user: ObjectId?.createFromHexString(id),
isActive: true,
},
},
{
$lookup: {
from: "venues",
localField: "venue",
foreignField: "_id",
as: "venue",
},
},
{
$unwind: {
path: "$venue",
},
},
{
$lookup: {
from: "partners",
localField: "venue.entity",
foreignField: "_id",
as: "partner",
},
},
{
$unwind: {
path: "$partner",
},
},
];
const assignment = await aggregateAssignment(pipeline);
res.status(200).json({ result: assignment });
} catch (error) {
res.status(500).json({ message: "Error getting assignment", error });
+47
View File
@@ -3,6 +3,8 @@ import {
getLocationByQuery,
getLocationByRadius,
} from "../models/Location/operations";
import { aggregateAssignment } from "../models/Assignment/operations";
import { ObjectId } from "mongodb";
/*
Sample Location Payload
@@ -69,3 +71,48 @@ export const getLocationController = async (req, res) => {
res.status(500).json({ error: error.message });
}
};
export const getMyAssignedVenuesHandler = async (req, res, next) => {
try {
const { user } = res.locals;
const pipeline = [
{
$match: {
user: ObjectId?.createFromHexString(user.id),
isActive: true,
},
},
{
$lookup: {
from: "venues",
localField: "venue",
foreignField: "_id",
as: "venue",
},
},
{
$unwind: {
path: "$venue",
},
},
{
$lookup: {
from: "partners",
localField: "venue.entity",
foreignField: "_id",
as: "partner",
},
},
{
$unwind: {
path: "$partner",
},
},
];
const assignment = await aggregateAssignment(pipeline);
res.status(200).json({ result: assignment });
} catch (error) {
console.log("getMyAssignedVenuesHandler Error", error);
next(error);
}
};
+70
View File
@@ -0,0 +1,70 @@
import {
createProduct,
updateProduct,
getAllProducts,
getProductByQuery,
getProductById,
deleteProduct,
} from "../models/Product/operations";
import dayjs from "dayjs";
export const createProductController = async (req, res, next) => {
try {
const { user } = res.locals;
const product = await createProduct({
...req.body,
createdBy: user.id,
createdOn: dayjs().toISOString(),
});
res.status(200).json({
result: product,
});
} catch (error) {
console.log("createProductController Error", error);
next(error);
}
};
export const updateProductController = async (req, res, next) => {
try {
const { id } = req.params;
const product = await updateProduct(id, {
...req.body,
});
res.status(200).json({
result: product,
});
} catch (error) {
console.log("updateProductController Error", error);
next(error);
}
};
export const getAllProductsController = async (req, res, next) => {
try {
const products = await getAllProducts();
res.status(200).json({
result: products,
});
} catch (error) {
console.log("getAllProductsController Error", error);
next(error);
}
};
export const deleteProductController = async (req, res, next) => {
try {
const { id } = req.params;
const product = await deleteProduct(id);
res.status(200).json({
result: product,
});
} catch (error) {
console.log("deleteProductController Error", error);
next(error);
}
};
+79
View File
@@ -0,0 +1,79 @@
import dayjs from "dayjs";
import {
createVendor,
updateVendor,
deleteVendor,
getVendorsByQuery,
getVendorById,
getAllVendors,
} from "../models/Vendor/operations";
export const createVendorController = async (req, res, next) => {
try {
const { user } = res.locals;
const vendor = await createVendor({
...req.body,
createdBy: user?.id,
createdOn: dayjs().toISOString(),
});
res.status(201).json({ result: vendor });
} catch (error) {
console.log("createVendorController Error", error);
next(error);
}
};
export const updateVendorController = async (req, res, next) => {
try {
const { id } = req.params;
const vendor = await updateVendor(id, req.body);
res.status(200).json({ result: vendor });
} catch (error) {
console.log("updateVendorController Error", error);
next(error);
}
};
export const getActiveVendorsController = async (req, res, next) => {
try {
const vendors = await getVendorsByQuery({ isActive: true });
res.status(200).json({ result: vendors });
} catch (error) {
console.log("getActiveVendorsController Error", error);
next(error);
}
};
export const getAllVendorsController = async (req, res, next) => {
try {
const vendors = await getAllVendors();
res.status(200).json({ result: vendors });
} catch (error) {
console.log("getAllVendorsController Error", error);
next(error);
}
};
export const deactivateVendorController = async (req, res, next) => {
try {
const { id } = req.params;
const deactivatedVendor = await updateVendor(id, { isActive: false });
res.status(200).json({ result: deactivatedVendor });
} catch (error) {
console.log("deactivateVendorController Error", error);
next(error);
}
};
export const getVendorByIdController = async (req, res, next) => {
try {
const { id } = req.params;
const vendor = await getVendorById(id);
res.status(200).json({ result: vendor });
} catch (error) {
console.log("getVendorByIdController Error", error);
next(error);
}
};
+105
View File
@@ -6,6 +6,8 @@ import {
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";
@@ -69,3 +71,106 @@ export const getVenueController = async (req, res, next) => {
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);
}
};
+34
View File
@@ -226,6 +226,40 @@ export default {
},
},
},
"/admin/role/{id}": {
patch: {
tags: ["Admin"],
summary: "Edit New Role",
parameters: [
{
in: "path",
name: "id",
},
],
requestBody: {
required: true,
content: {
"application/json": {
schema: {
type: "object",
properties: {
name: {
type: "string",
required: true,
},
},
},
},
},
},
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
"/admin/employee/{id}": {
get: {
tags: ["Admin"],
+454
View File
@@ -244,6 +244,20 @@
}
}
},
"/location/venues/assigned/me": {
"get": {
"tags": [
"Location"
],
"summary": "Get Assigned Venues for creating Geofence",
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/uploads/single/{folder}": {
"post": {
"tags": [
@@ -521,6 +535,42 @@
}
}
},
"/admin/role/{id}": {
"patch": {
"tags": [
"Admin"
],
"summary": "Edit New Role",
"parameters": [
{
"in": "path",
"name": "id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true
}
}
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/admin/employee/{id}": {
"get": {
"tags": [
@@ -1116,6 +1166,410 @@
}
}
}
},
"/product": {
"post": {
"summary": "Create a New Product",
"tags": [
"Product"
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"required": true
},
"name": {
"type": "string",
"required": true
},
"stock": {
"type": "number",
"required": true
},
"buyingPrice": {
"type": "number",
"required": true
},
"sellingPrice": {
"type": "number",
"required": true
},
"description": {
"type": "string",
"required": true
},
"gst": {
"type": "number",
"required": true
},
"hsn": {
"type": "string",
"required": true
},
"vendors": {
"type": "array",
"items": {
"type": "string"
},
"required": true
}
}
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
},
"get": {
"summary": "Get All Products",
"tags": [
"Product"
],
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/product/{id}": {
"patch": {
"summary": "Update a Product",
"tags": [
"Product"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "Product ID",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"required": true
},
"name": {
"type": "string",
"required": true
},
"stock": {
"type": "number",
"required": true
},
"buyingPrice": {
"type": "number",
"required": true
},
"sellingPrice": {
"type": "number",
"required": true
},
"description": {
"type": "string",
"required": true
},
"gst": {
"type": "number",
"required": true
},
"hsn": {
"type": "string",
"required": true
},
"vendors": {
"type": "array",
"items": {
"type": "string"
},
"required": true
}
}
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
},
"delete": {
"summary": "Delete a Product",
"tags": [
"Product"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "Product ID",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/vendor/all": {
"get": {
"summary": "Get All Vendors",
"tags": [
"Vendor"
],
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/vendor/{id}": {
"get": {
"summary": "Get Vendor Details",
"tags": [
"Vendor"
],
"parameters": [
{
"in": "path",
"required": true,
"description": "Vendor ID",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
},
"patch": {
"summary": "Get Vendor Details",
"tags": [
"Vendor"
],
"parameters": [
{
"in": "path",
"required": true,
"description": "Vendor ID",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true
},
"email": {
"type": "string",
"required": true
},
"mobile": {
"type": "string",
"required": true
},
"address": {
"type": "string",
"required": true
},
"city": {
"type": "string",
"required": true
},
"state": {
"type": "string",
"required": true
},
"picode": {
"type": "string",
"required": true
},
"isActive": {
"type": "boolean",
"required": true
},
"contactPersons": {
"type": "array",
"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": {
"summary": "Deactivate Vendor",
"tags": [
"Vendor"
],
"parameters": [
{
"in": "path",
"required": true,
"description": "Vendor ID",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {}
}
}
}
},
"/vendor": {
"post": {
"summary": "Create New Vendor",
"tags": [
"Vendor"
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true
},
"email": {
"type": "string",
"required": true
},
"mobile": {
"type": "string",
"required": true
},
"address": {
"type": "string",
"required": true
},
"city": {
"type": "string",
"required": true
},
"state": {
"type": "string",
"required": true
},
"picode": {
"type": "string",
"required": true
},
"isActive": {
"type": "boolean",
"required": true
},
"contactPersons": {
"type": "array",
"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": {}
}
}
}
}
}
}
+4
View File
@@ -8,6 +8,8 @@ import location from "./location.js";
import assignment from "./assignment.js";
import partner from "./partner.js";
import venue from "./venue.js";
import product from "./product.js";
import vendor from "./vendor.js";
const GENERAL_CONFIG = {
openapi: "3.0.1",
@@ -53,6 +55,8 @@ let paths = {
...assignment,
...partner,
...venue,
...product,
...vendor,
};
const getSwaggerDocument = () => {
+12 -1
View File
@@ -32,7 +32,6 @@ export default {
type: "string",
required: false,
},
},
},
},
@@ -46,4 +45,16 @@ export default {
},
},
},
"/location/venues/assigned/me": {
get: {
tags: ["Location"],
summary: "Get Assigned Venues for creating Geofence",
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
};
+176
View File
@@ -0,0 +1,176 @@
export default {
"/product": {
post: {
summary: "Create a New Product",
tags: ["Product"],
requestBody: {
content: {
"application/json": {
schema: {
type: "object",
properties: {
sku: {
type: "string",
required: true,
},
name: {
type: "string",
required: true,
},
stock: {
type: "number",
required: true,
},
buyingPrice: {
type: "number",
required: true,
},
sellingPrice: {
type: "number",
required: true,
},
description: {
type: "string",
required: true,
},
gst: {
type: "number",
required: true,
},
hsn: {
type: "string",
required: true,
},
stock: {
type: "number",
required: true,
},
vendors: {
type: "array",
items: {
type: "string",
},
required: true,
},
},
},
},
},
},
responses: {
200: {
description: "OK",
content: {},
},
},
},
get: {
summary: "Get All Products",
tags: ["Product"],
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
"/product/{id}": {
patch: {
summary: "Update a Product",
tags: ["Product"],
parameters: [
{
name: "id",
in: "path",
required: true,
description: "Product ID",
schema: {
type: "string",
},
},
],
requestBody: {
content: {
"application/json": {
schema: {
type: "object",
properties: {
sku: {
type: "string",
required: true,
},
name: {
type: "string",
required: true,
},
stock: {
type: "number",
required: true,
},
buyingPrice: {
type: "number",
required: true,
},
sellingPrice: {
type: "number",
required: true,
},
description: {
type: "string",
required: true,
},
gst: {
type: "number",
required: true,
},
hsn: {
type: "string",
required: true,
},
stock: {
type: "number",
required: true,
},
vendors: {
type: "array",
items: {
type: "string",
},
required: true,
},
},
},
},
},
},
responses: {
200: {
description: "OK",
content: {},
},
},
},
delete: {
summary: "Delete a Product",
tags: ["Product"],
parameters: [
{
name: "id",
in: "path",
required: true,
description: "Product ID",
schema: {
type: "string",
},
},
],
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
};
+222
View File
@@ -0,0 +1,222 @@
export default {
"/vendor/all": {
get: {
summary: "Get All Vendors",
tags: ["Vendor"],
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
"/vendor/{id}": {
get: {
summary: "Get Vendor Details",
tags: ["Vendor"],
parameters: [
{
in: "path",
required: true,
description: "Vendor ID",
schema: {
type: "string",
},
},
],
responses: {
200: {
description: "OK",
content: {},
},
},
},
patch: {
summary: "Get Vendor Details",
tags: ["Vendor"],
parameters: [
{
in: "path",
required: true,
description: "Vendor ID",
schema: {
type: "string",
},
},
],
requestBody: {
content: {
"application/json": {
schema: {
type: "object",
properties: {
name: {
type: "string",
required: true,
},
email: {
type: "string",
required: true,
},
mobile: {
type: "string",
required: true,
},
address: {
type: "string",
required: true,
},
city: {
type: "string",
required: true,
},
state: {
type: "string",
required: true,
},
picode: {
type: "string",
required: true,
},
isActive: {
type: "boolean",
required: true,
},
contactPersons: {
type: "array",
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: {
summary: "Deactivate Vendor",
tags: ["Vendor"],
parameters: [
{
in: "path",
required: true,
description: "Vendor ID",
schema: {
type: "string",
},
},
],
responses: {
200: {
description: "OK",
content: {},
},
},
},
},
"/vendor": {
post: {
summary: "Create New Vendor",
tags: ["Vendor"],
requestBody: {
content: {
"application/json": {
schema: {
type: "object",
properties: {
name: {
type: "string",
required: true,
},
email: {
type: "string",
required: true,
},
mobile: {
type: "string",
required: true,
},
address: {
type: "string",
required: true,
},
city: {
type: "string",
required: true,
},
state: {
type: "string",
required: true,
},
picode: {
type: "string",
required: true,
},
isActive: {
type: "boolean",
required: true,
},
contactPersons: {
type: "array",
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: {},
},
},
},
},
};
+19 -2
View File
@@ -17,7 +17,9 @@ import {
LocationRoutes,
AssignmentRoutes,
PartnerRoutes,
VenueRoutes
VenueRoutes,
ProductRoutes,
VendorRoutes,
} from "./routes";
dotenv.config();
@@ -44,9 +46,22 @@ db.once("open", () =>
const app = express();
app.use(cors());
app.use(
cors({
origin: [
"http://localhost:1420",
"tauri://localhost",
"https://tauri.localhost",
"http://tauri.localhost",
],
}),
);
app.use(express.json());
app.get("/test", (req, res, next) => {
res.json({status: "success"})
})
app.use("/v0/docs", swaggerUi.serve, swaggerUi.setup(swaggerDoc));
app.use("/v0/user", UserRoutes);
app.use("/v0/admin", AdminRoutes);
@@ -54,6 +69,8 @@ app.use("/v0/location", LocationRoutes);
app.use("/v0/assignment", AssignmentRoutes);
app.use("/v0/partner", PartnerRoutes);
app.use("/v0/venue", VenueRoutes);
app.use("/v0/product", ProductRoutes);
app.use("/v0/vendor", VendorRoutes);
app.use((err, req, res, next) => {
const statusCode = err.status || 500;
BIN
View File
Binary file not shown.
+8
View File
@@ -36,6 +36,14 @@ const schema = new Schema({
type: Date,
required: true,
},
city: {
type: String,
required: true,
},
state: {
type: String,
required: true,
},
});
export default model("access", schema);
+4
View File
@@ -25,6 +25,10 @@ const schema = new Schema({
type: Number,
required: true,
},
hsn: {
type: String,
required: true,
},
stock: {
type: Number,
required: true,
+10 -1
View File
@@ -17,7 +17,16 @@ export const getProductByQuery = async (query) => {
// Read (Get all)
export const getAllProducts = async () => {
return await Model.find();
return await Model.aggregate([
{
$lookup: {
from: "vendors",
localField: "vendors",
foreignField: "_id",
as: "vendors"
}
}
]);
};
// Update
+8
View File
@@ -18,6 +18,8 @@ const moduleSchema = new Schema({
"salary",
"vendor",
"expense",
"venue",
"metadata",
"product",
"invoice",
"partner",
@@ -28,6 +30,12 @@ const moduleSchema = new Schema({
"inventoryLog",
],
},
region: {
type: String,
required: true,
default: "CITY",
enum: ["CITY", "STATE", "COUNTRY"],
},
permission: {
type: String,
required: true,
+4
View File
@@ -30,6 +30,10 @@ const schema = new Schema({
required: true,
ref: "user",
},
isActive: {
type: Boolean,
required: true,
},
});
export default model("user", schema);
+7 -2
View File
@@ -10,10 +10,15 @@ export const getVendorById = async (id) => {
return await Model.findById(id);
};
// Read (Get by Query)
// Read (Get One by Query)
export const getVendorByQuery = async (query) => {
return await Model.findOne(query);
}
};
// Read (Get All by Query)
export const getVendorsByQuery = async (query) => {
return await Model.find(query);
};
// Read (Get all)
export const getAllVendors = async () => {
+7 -8
View File
@@ -8,6 +8,7 @@ import {
createDepartmentController,
createDesignationController,
createRoleController,
updateRoleController,
getAllEmployeeController,
getEmployeeDetailsController,
getEmployeeLocationHistoryController,
@@ -29,20 +30,16 @@ router.post(
authorize("department", "write"),
createDepartmentController,
);
router.get(
"/employees",
authorize("employee", "read"),
getAllEmployeeController,
);
router.post("/employee", authorize("employee", "write"), createEmployee);
router.get("/employees", authorize("user", "read"), getAllEmployeeController);
router.post("/employee", authorize("user", "write"), createEmployee);
router.get(
"/employee/:id",
authorize("employee", "read"),
authorize("user", "read"),
getEmployeeDetailsController,
);
router.get(
"/employee/:user/locations",
authorize("employee", "read"),
authorize("user", "read"),
getEmployeeLocationHistoryController,
);
router.post(
@@ -52,4 +49,6 @@ router.post(
);
router.post("/role", authorize("role", "write"), createRoleController);
router.patch("/role/:id", authorize("role", "write"), updateRoleController);
export default router;
+2
View File
@@ -5,3 +5,5 @@ 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";
export { default as ProductRoutes } from "./product.route";
export { default as VendorRoutes } from "./vendor.route";
+14 -2
View File
@@ -1,6 +1,12 @@
import { Router } from "express";
import { authorizeWithEncryptedKey } from "../middlewares/jwt.middleware";
import { createLocationController } from "../controllers/location.controller";
import {
authorize,
authorizeWithEncryptedKey,
} from "../middlewares/jwt.middleware";
import {
createLocationController,
getMyAssignedVenuesHandler,
} from "../controllers/location.controller";
const router = new Router();
@@ -10,4 +16,10 @@ router.post(
createLocationController,
);
router.get(
"/venues/assigned/me",
authorize("generic", "generic"),
getMyAssignedVenuesHandler,
);
export default router;
+17
View File
@@ -0,0 +1,17 @@
import { Router } from "express";
import { authorize } from "../middlewares/jwt.middleware";
import {
createProductController,
deleteProductController,
getAllProductsController,
updateProductController,
} from "../controllers/product.controller";
const router = Router();
router.post("/", authorize("product", "write"), createProductController);
router.get("/", authorize("product", "read"), getAllProductsController);
router.patch("/:id", authorize("product", "write"), updateProductController);
router.delete("/:id", authorize("product", "delete"), deleteProductController);
export default router;
+25
View File
@@ -0,0 +1,25 @@
import { Router } from "express";
import {
createVendorController,
updateVendorController,
getActiveVendorsController,
getAllVendorsController,
deactivateVendorController,
getVendorByIdController,
} from "../controllers/vendor.controller";
import { authorize } from "../middlewares/jwt.middleware";
const router = Router();
router.post("/", authorize("vendor", "write"), createVendorController);
router.patch("/:id", authorize("vendor", "write"), updateVendorController);
router.get("/active", authorize("vendor", "read"), getActiveVendorsController);
router.get("/all", authorize("vendor", "read"), getAllVendorsController);
router.delete(
"/:id",
authorize("vendor", "delete"),
deactivateVendorController,
);
router.get("/:id", authorize("vendor", "read"), getVendorByIdController);
export default router;
+13 -1
View File
@@ -4,6 +4,8 @@ import {
deleteVenueController,
getVenuesByEntityController,
getVenueController,
getAssignedVenuesController,
getUnassignedVenuesController,
} from "../controllers/venue.controller";
import { authorize } from "../middlewares/jwt.middleware";
@@ -15,7 +17,17 @@ router.get(
authorize("venue", "read"),
getVenuesByEntityController,
);
router.get("/:id", authorize("venue", "read"), getVenueController);
router.get("/details/:id", authorize("venue", "read"), getVenueController);
router.get(
"/assigned/:userId",
authorize("venue", "read"),
getAssignedVenuesController,
);
router.get(
"/unassigned",
authorize("venue", "read"),
getUnassignedVenuesController,
);
router.delete("/:id", authorize("venue", "write"), deleteVenueController);
export default router;