Merge pull request #4 from kfnawaz/feat/new-models-1

Feat: Added models for Inventory, Material, Item & User
This commit is contained in:
bluestreamlds
2021-12-22 10:07:31 +05:30
committed by GitHub
7 changed files with 299 additions and 2 deletions

16
package-lock.json generated
View File

@@ -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",

View File

@@ -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",

46
src/config/constants.js Normal file
View File

@@ -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,
};

39
src/models/Inventory.js Normal file
View File

@@ -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;

93
src/models/Item.js Normal file
View File

@@ -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;

33
src/models/Material.js Normal file
View File

@@ -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;

71
src/models/User.js Normal file
View File

@@ -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;