From 291eea44f840bacd2564e6f411465f0387a976b1 Mon Sep 17 00:00:00 2001 From: Sathishkumar Krishnan Date: Wed, 22 Dec 2021 05:23:00 +0530 Subject: [PATCH] feat: added models Inventory, Material, Item & User --- package-lock.json | 16 ++++++- package.json | 3 +- src/config/constants.js | 46 ++++++++++++++++++++ src/models/Inventory.js | 39 +++++++++++++++++ src/models/Item.js | 93 +++++++++++++++++++++++++++++++++++++++++ src/models/Material.js | 33 +++++++++++++++ src/models/User.js | 71 +++++++++++++++++++++++++++++++ 7 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 src/config/constants.js create mode 100644 src/models/Inventory.js create mode 100644 src/models/Item.js create mode 100644 src/models/Material.js create mode 100644 src/models/User.js diff --git a/package-lock.json b/package-lock.json index 9341fd4..28f7db2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "express": "^4.17.2", "helmet": "^4.6.0", "jsonwebtoken": "^8.5.1", - "mongoose": "^6.1.2" + "mongoose": "^6.1.2", + "validator": "^13.7.0" }, "devDependencies": { "eslint": "^8.5.0", @@ -3089,6 +3090,14 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5549,6 +5558,11 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index e651b8b..abd8714 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "express": "^4.17.2", "helmet": "^4.6.0", "jsonwebtoken": "^8.5.1", - "mongoose": "^6.1.2" + "mongoose": "^6.1.2", + "validator": "^13.7.0" }, "devDependencies": { "eslint": "^8.5.0", diff --git a/src/config/constants.js b/src/config/constants.js new file mode 100644 index 0000000..0c15e10 --- /dev/null +++ b/src/config/constants.js @@ -0,0 +1,46 @@ +const UserActions = [ + "Read", + "Add", + "Delete", + "Edit", + "Pick", + "Put Away", + "Cycle Count", + "Query", + "Report", + "Order", + "Receive", +]; + +const WarehouseScopes = [ + "Warehouse", + "Zone", + "Area", + "Bay", + "Row", + "Level", + "Sublevel", +]; + +const InventoryTypes = [ + "Perishable", + "Material", + "Product", + "Equipment", + "Fleet", +]; + +const CustomAttributeTypes = [ + "Date", + "Number", + "Decimal", + "String", + "Enumerable", +]; + +module.exports = { + UserActions, + WarehouseScopes, + InventoryTypes, + CustomAttributeTypes, +}; diff --git a/src/models/Inventory.js b/src/models/Inventory.js new file mode 100644 index 0000000..786724a --- /dev/null +++ b/src/models/Inventory.js @@ -0,0 +1,39 @@ +const mongoose = require("mongoose"); +const { InventoryTypes } = require("./../config/constants"); + +const schema = new mongoose.Schema( + { + name: { + type: String, + required: true, + trim: true, + }, + type: { + type: String, + required: true, + trim: true, + enum: InventoryTypes, + }, + policies: { + tracking: { + type: Object, // Create a different model and reference it here once more details available + required: true, + }, + alerting: { + type: Object, // Create a different model and reference it here once more details available + required: true, + }, + replenishment: { + type: Object, // Create a different model and reference it here once more details available + required: true, + }, + }, + }, + { + timestamps: true, + } +); + +const Inventory = mongoose.model("Inventory", schema); + +module.exports = Inventory; diff --git a/src/models/Item.js b/src/models/Item.js new file mode 100644 index 0000000..1d83044 --- /dev/null +++ b/src/models/Item.js @@ -0,0 +1,93 @@ +const mongoose = require("mongoose"); +const { CustomAttributeTypes } = require("./../config/constants"); + +const schema = new mongoose.Schema( + { + commonName: { + type: String, + required: true, + trim: true, + }, + formalName: { + type: String, + required: true, + trim: true, + }, + description: { + type: String, + required: true, + trim: true, + }, + manufacturer: { + type: String, + required: true, + trim: true, + }, + size: { + type: String, + required: true, + trim: true, + }, + color: { + type: String, + required: true, + trim: true, + }, + type: { + type: String, + required: true, + trim: true, + }, + unitOfMaterial: { + type: String, + required: true, + trim: true, + }, + unitCost: { + type: Number, + required: true, + }, + unitQuantity: { + type: Number, + required: true, + }, + packageCount: { + type: Number, + required: true, + }, + countPerPallet: { + type: Number, + required: true, + }, + countPerPalletPackage: { + type: Number, + required: true, + }, + customAttributes: [ + { + fieldName: { + type: String, + required: true, + trim: true, + }, + fieldType: { + type: String, + required: true, + trim: true, + enum: CustomAttributeTypes, + }, + fieldValue: { + type: mongoose.Schema.Types.Mixed, + required: true, + }, + }, + ], + }, + { + timestamps: true, + } +); + +const Item = mongoose.model("Item", schema); + +module.exports = Item; diff --git a/src/models/Material.js b/src/models/Material.js new file mode 100644 index 0000000..4aaf280 --- /dev/null +++ b/src/models/Material.js @@ -0,0 +1,33 @@ +const mongoose = require("mongoose"); + +const schema = new mongoose.Schema( + { + name: { + type: String, + required: true, + trim: true, + }, + family: [ + { + name: { + type: String, + required: true, + trim: true, + }, + depth: { + type: Number, + required: true, + min: 1, + max: 10 + }, + }, + ], + }, + { + timestamps: true, + } +); + +const Material = mongoose.model("Material", schema); + +module.exports = Material; diff --git a/src/models/User.js b/src/models/User.js new file mode 100644 index 0000000..9710693 --- /dev/null +++ b/src/models/User.js @@ -0,0 +1,71 @@ +const mongoose = require("mongoose"); +const { isEmail } = require("validator"); +const { UserActions, WarehouseScopes } = require("./../config/constants"); + +const schema = new mongoose.Schema( + { + fullName: { + type: String, + trim: true, + }, + email: { + type: String, + required: [true, "Please enter an email"], + unique: true, + lowercase: true, + validate: [isEmail, "Please enter a valid email"], + }, + password: { + type: String, + required: [true, "Please enter a password"], + minlength: [6, "Minimum password length is 6 characters"], + }, + refreshToken: { + type: String, + }, + forgotPasswordOTP: { + type: Number, + min: 1000, + max: 9999, + }, + forgotPasswordOTPRetries: { + type: Number, + min: 0, + max: 3, + }, + passwordResetToken: { + type: String, + }, + authPolicies: [ + { + inventory: { + type: mongoose.Schema.Types.ObjectId, + ref: "Inventory", + }, + warehouseScope: { + on: { + type: mongoose.Schema.Types.ObjectId, + refPath: "onModel", + }, + onModel: { + type: String, + required: true, + enum: WarehouseScopes, + }, + }, + actions: { + type: String, + required: true, + enum: UserActions, + }, + }, + ], + }, + { + timestamps: true, + } +); + +const User = mongoose.model("User", schema); + +module.exports = User;