Files
plaidware-wms-core/src/controller/sublevel.controller.js
2022-02-17 18:14:25 +05:30

187 lines
4.8 KiB
JavaScript

const Sublevel = require("../models/Sublevel");
const mongoose = require("mongoose");
const { addSublevelToParent, deleteSubLevelTreeFromRoot, validPositions } = require("./utils/sublevel");
const { SubLevelTypes } = require("../config/constants");
module.exports = {
/**
* Gets the sublevel data by `id`
*/
getSubLevelByID: async (req, res, next) => {
const { id } = req.params;
if (!id) {
res.status(400).send("Missing id param");
return;
}
try {
const subLevelData = await Sublevel.findById(id);
if (!subLevelData) {
res.status(404);
return;
}
req.send(subLevelData);
} catch (error) {
next(error);
}
},
/**
* Create a sublevel
*/
createSubLevel: async (req, res, next) => {
console.log(req.body);
const { name, type, specs, parent_id, parentIsLevel, positions } = req.body;
if (!(name && type && parent_id && positions)) {
res.status(400).send("Missing params param");
return;
}
if (!SubLevelTypes.includes(type)) {
res.status(400).send("Invalid type");
return;
}
if (!validPositions(positions)) {
res.status(400).send("Invalid positions");
return;
}
try {
const parentData = parentIsLevel ? { parent_current_depth: 0, parent_main_level_id: parent_id } : await Sublevel.findById(parent_id);
const { parent_current_depth, parent_main_level_id } = parentData;
const sublevelData = new Sublevel({
name,
type: type,
specs,
main_level_id: parent_main_level_id,
current_depth: parent_current_depth + 1,
parent_sublevel_id: mongoose.Types.ObjectId(parent_id),
preferred_inventory: [],
});
await addSublevelToParent({ type, positions, sub_level_id: sublevelData._id.toString() }, parent_id, parentIsLevel);
await sublevelData.save();
if (!sublevelData) {
res.status(404);
return;
}
res.send(sublevelData);
} catch (error) {
next(error);
}
},
/**
* Update a sublevels' detail
*/
updateSubLevelDetailsByID: async (req, res, next) => {
const { name, type, specs } = req.body;
const { id } = req.params;
if (!(name || type || specs)) {
res.status(400).send("Missing params param");
return;
}
if (type && !SubLevelTypes.includes(type)) {
res.status(400).send("Invalid type");
return;
}
try {
const sublevelData = await Sublevel.findById(id);
if (!sublevelData) {
res.status(404);
return;
}
if (name) sublevelData.name = name;
if (type) sublevelData.type = type;
if (specs) sublevelData.specs = specs;
const newData = await sublevelData.save();
req.send(newData);
} catch (error) {
next(error);
}
},
/**
* Deletes a sublevel
*/
deleteSublevel: async (req, res, next) => {
const { id } = req.params;
if (!id) {
res.status(404).send("Provide an ID");
}
try {
const deletedSublevels = deleteSubLevelTreeFromRoot(id);
res.send({ success: deletedSublevels.length, data: { deletedSublevels: deletedSublevels } });
} catch (err) {
next(err);
}
},
/**
* Add preferred_inventory to a sublevel
*/
addInventory: async (req, res, next) => {
const { id, inventory } = req.body;
const sublevelData = await Sublevel.findById(id);
if (!sublevelData) {
res.status(404);
return;
}
// eslint-disable-next-line no-prototype-builtins
if (inventory.every((_) => _.hasOwnProperty("id") && _.hasOwnProperty("type"))) {
res.status(404).send({ success: false, message: "invalid inventory data" });
return;
}
try {
sublevelData.preferred_inventory.push(...inventory);
await sublevelData.save();
res.send({ success: true, data: sublevelData.preferred_inventory });
} catch (err) {
next(err);
}
},
getAllSublevel: async (req, res, next) => {
try {
const { getAllWithPagination } = require("./utils/pagination");
const { page, perPage } = req.query;
const data = await getAllWithPagination(Sublevel, page, perPage);
res.send({ success: true, data: data });
} catch (error) {
next(error);
}
},
getSubLevelChildrenByID: async (req, res, next) => {
const { id } = req.params;
if (!id) {
res.status(400).send({ success: false, message: "Missing id param" });
return;
}
try {
const sublevelData = await Sublevel.findById(id).populate({ path: "sub_levels", populate: { path: "sub_level_id" } });
if (!sublevelData) {
res.status(404).send({ success: false, message: "not found" });
return;
}
res.send({ success: true, data: sublevelData.sub_levels });
} catch (error) {
next(error);
}
},
};