Files
plaidware-wms-core/src/controller/userRole.controller.js
2022-02-28 23:45:50 +05:30

118 lines
3.8 KiB
JavaScript

const mongoose = require("mongoose");
const UserRole = require("../models/UserRole");
const { getScopes } = require("./utils/access-control");
const { InventoryScopes, WarehouseScopes, UserActions, AllUIModules } = require("./../config/constants");
module.exports = {
getAllRoles: async (req, res, next) => {
let { page, perPage } = req.query;
page = page ? parseInt(page) : 0;
perPage = perPage ? parseInt(perPage) : 10;
const result = await UserRole.find(
{},
{
id: 1,
name: 1,
permissions: 1,
},
{ skip: page * perPage, limit: perPage }
);
res.send({ success: true, data: result });
},
getRole: async (req, res, next) => {
try {
const { id } = req.params;
if (mongoose.isValidObjectId(id)) {
const role = await UserRole.findById(id);
res.send({ success: true, data: role });
} else {
throw new Error(`invalid data format for object-id - ${id}`);
}
} catch (e) {
next(e);
}
},
createRole: async (req, res, next) => {
try {
const {
name,
permissions: { inventoryScopes, warehouseScopes, actions, allowedUIModules },
status,
} = req.body;
const verifiedInventoryScopes = await getScopes(inventoryScopes, InventoryScopes);
const verifiedWarehouseScopes = await getScopes(warehouseScopes, WarehouseScopes);
const newUserRole = await UserRole.create({
name,
status,
permissions: {
inventoryScopes: verifiedInventoryScopes,
warehouseScopes: verifiedWarehouseScopes,
actions: actions == undefined ? [] : actions.filter((_) => UserActions.includes(_)),
allowedUIModules: allowedUIModules == undefined ? [] : allowedUIModules.filter((_) => AllUIModules.includes(_)),
},
});
res.send({ success: true, data: newUserRole });
} catch (e) {
next(e);
}
},
updateRole: async (req, res, next) => {
try {
const { id } = req.params;
if (!(id && mongoose.isValidObjectId(id))) {
res.status(400).send({ success: false, error: "invalid Id params" });
}
const role = await UserRole.findById(id);
if (!role) {
res.status(404).send({ success: false, error: "Role not found" });
}
const {
name,
permissions: { inventoryScopes, warehouseScopes, actions, allowedUIModules },
} = req.body;
if (name) {
role.name = name;
role.markModified("name");
}
if (inventoryScopes) {
const verifiedInventoryScopes = await getScopes(inventoryScopes, InventoryScopes);
role.permissions.inventoryScopes = verifiedInventoryScopes;
role.markModified("permissions.inventoryScopes");
}
if (warehouseScopes) {
const verifiedWarehouseScopes = await getScopes(warehouseScopes, WarehouseScopes);
role.permissions.warehouseScopes = verifiedWarehouseScopes;
role.markModified("permissions.warehouseScopes");
}
if (actions) {
role.permissions.actions = actions.filter((_) => UserActions.includes(_));
role.markModified("permissions.actions");
}
if (allowedUIModules) {
role.permissions.allowedUIModules = allowedUIModules.filter((_) => AllUIModules.includes(_));
role.markModified("permissions.allowedUIModules");
}
await role.save();
res.send({ success: true, data: role });
} catch (e) {
next(e);
}
},
deleteRole: async (req, res, next) => {
try {
const { id } = req.params;
if (mongoose.isValidObjectId(id)) {
const result = await UserRole.deleteOne({ _id: id });
res.send({ success: true, data: result });
} else {
throw new Error(`invalid data format for object-id - ${id}`);
}
} catch (e) {
next(e);
}
},
};