diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 201f818..0000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.vscode -.DS_Store -*/node_modules/ -*.env -/express-auth-template/config/serviceAccountKey.json - diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3c571d1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/ndc-backend.iml b/.idea/ndc-backend.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/ndc-backend.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9a44bdf..144c00b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,9 @@ "express": "^4.18.2", "firebase-admin": "^11.2.0", "helmet": "^7.0.0", + "i": "^0.3.7", "mongodb": "^6.2.0", - "mongoose": "^7.6.3", + "mongoose": "^7.6.4", "morgan": "^1.10.0" }, "devDependencies": { @@ -5029,6 +5030,14 @@ "node": ">=10.17.0" } }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6867,9 +6876,9 @@ } }, "node_modules/mongoose": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.3.tgz", - "integrity": "sha512-moYP2qWCOdWRDeBxqB/zYwQmQnTBsF5DoolX5uPyI218BkiA1ujGY27P0NTd4oWIX+LLkZPw0LDzlc/7oh1plg==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.4.tgz", + "integrity": "sha512-kadPkS/f5iZJrrMxxOvSoOAErXmdnb28lMvHmuYgmV1ZQTpRqpp132PIPHkJMbG4OC2H0eSXYw/fNzYTH+LUcw==", "dependencies": { "bson": "^5.5.0", "kareem": "2.5.1", diff --git a/package.json b/package.json deleted file mode 100644 index 84353b1..0000000 --- a/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "express-ts-template", - "version": "1.0.0", - "description": " A basic starter for an express.js with Typescript", - "main": "src/index.ts", - "scripts": { - "start": "nodemon src/index.ts", - "build": "tsc", - "lint": "eslint --ext .ts . --fix", - "test": "jest", - "typecheck": "tsc --noEmit" - }, - "keywords": [], - "license": "MIT", - "dependencies": { - "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.18.2", - "firebase-admin": "^11.2.0", - "helmet": "^7.0.0", - "mongodb": "^6.2.0", - "mongoose": "^7.6.3", - "morgan": "^1.10.0" - }, - "devDependencies": { - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/morgan": "^1.9.4", - "@types/node": "^20.2.5", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^6.7.4", - "eslint": "^8.50.0", - "eslint-config-prettier": "^9.0.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.1.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "nodemon": "^3.0.1", - "prettier": "^3.0.3", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typescript": "<5.1.0" - } -} diff --git a/src/controllers/orders.controllers.ts b/src/controllers/orders.controllers.ts new file mode 100644 index 0000000..dc49c72 --- /dev/null +++ b/src/controllers/orders.controllers.ts @@ -0,0 +1,46 @@ +import {Request, Response} from 'express'; +const Order = require("../models/Order.ts"); + +const createOrder = async (req:Request, res:Response) => { + try { + const { numDiapers } = req.body; + if (!numDiapers) { + return res.status(400).send("Invalid Order query"); + } + const newOrder = await Order.create(numDiapers); + await newOrder.save(); + return res.status(200).json(newOrder); + } catch (err:any) { + console.error(err.message); + return res.status(500).send({message: err.message}); + } +} + +const getOrder = async (req:Request, res:Response) => { + try { + const { orderId, partnerId, status } = req.body; + + let allOrders = null; + if (orderId) { + allOrders = await Order.find({id: orderId}); + } else if (partnerId && status) { + allOrders = await Order.find({partner: partnerId, status: status}); + } else if (partnerId) { + allOrders = await Order.find({partner: partnerId}); + } else if (status) { + allOrders = await Order.find({status: status}); + } else { + return res.status(400).send("Invalid search query"); + } + + return res.status(200).json(allOrders); + } catch (err:any) { + console.error(err.message); + return res.status(500).send({message: err.message}); + } +} + +module.exports = { + createOrder, + getOrder, +}; \ No newline at end of file diff --git a/src/controllers/partnersControllers.ts b/src/controllers/partnersControllers.ts new file mode 100644 index 0000000..900900c --- /dev/null +++ b/src/controllers/partnersControllers.ts @@ -0,0 +1,128 @@ +import { ObjectId } from "mongodb"; +import Partner from "../models/Partner"; + +import { type Request, type Response } from "express"; + +const createPartner = async (req: Request, res: Response) => { + try { + const { + orders, + firstName, + lastName, + type, + phoneNumber, + email, + dateJoined, + numOrdersMonth, + numOrdersYTD, + numOrdersTotal, + location, + address, + deliveryInstructions, + } = req.body; + + if ( + !( + orders && + firstName && + lastName && + type && + phoneNumber && + email && + dateJoined && + numOrdersMonth && + numOrdersYTD && + numOrdersTotal && + location && + address && + deliveryInstructions + ) + ) { + return res.status(400).send({ message: "Missing Required Field" }); + } + + const databaseId = await Partner.find() + .sort({ id: -1 }) + .limit(1) + .then((docs: any) => { + return docs[0].get("id"); + }) + .catch((err: any) => { + console.log(err); + }); + + const newPartner = new Partner({ + ...req.body, + objectId: new ObjectId(databaseId + 1), + }); + const partner = await newPartner.save(); + + return res.status(200).json(partner); + } catch (err: any) { + console.error(err.message); + return res.status(400).send({ message: err.message }); + } +}; + +const getPartner = async (req: Request, res: Response) => { + try { + const id = req.query?.id; + if (id) { + const partner = await Partner.findById(id); + return res.status(200).json(partner); + } + console.log("No Partner ID Detected"); + + const partner = await Partner.find(); + return res.status(200).json(partner); + } catch (err: any) { + console.error(err.message); + return res.status(400).send({ message: err.message }); + } +}; + +const editPartner = async (req: Request, res: Response) => { + try { + const id = req.params?.id; + if (id) { + const partner = Partner.findByIdAndUpdate(id, req.body) + .then(() => { + console.log(partner); + return res.status(200).json(partner); + }) + .catch((err: any) => { + console.log(err); + return res.status(400).send({ message: err }); + }); + } else { + return res.status(400).send({ message: "Missing Partner ID" }); + } + } catch (err: any) { + console.error(err.message); + return res.status(400).send({ message: err.message }); + } +}; + +const deletePartner = async (req: Request, res: Response) => { + try { + const id = req.query?.id; + if (id) { + Partner.findByIdAndDelete(id) + .then(() => { + return res + .status(200) + .json({ message: "Successfully deleted." }); + }) + .catch((err: any) => { + return res.status(400).send({ message: err }); + }); + } else { + return res.status(400).send({ message: "Missing Partner ID" }); + } + } catch (err: any) { + console.error(err.message); + return res.status(400).send({ message: err.message }); + } +}; + +export { createPartner, getPartner, editPartner, deletePartner }; diff --git a/src/index.ts b/src/index.ts index 1578d94..844c456 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ import { connectDB } from "../config/database"; dotenv.config(); -// connectDB(); +connectDB(); const app: Express = express(); const PORT = process.env.PORT || 3001; diff --git a/src/models/Inventory.ts b/src/models/Inventory.ts new file mode 100644 index 0000000..06bbe87 --- /dev/null +++ b/src/models/Inventory.ts @@ -0,0 +1,91 @@ +const mongoose = require("mongoose"); +const { Schema } = mongoose; + +const InventorySchema = new Schema({ + id: { + type: Number, + unique: true, + required: true, + }, + wrapped: { + type: Object, + newborn: { + type: Number, + default: 0, + required: true, + }, + size1: { + type: Number, + default: 0, + required: true, + }, + size2: { + type: Number, + default: 0, + required: true, + }, + size3: { + type: Number, + default: 0, + required: true, + }, + size4: { + type: Number, + default: 0, + required: true, + }, + size5: { + type: Number, + default: 0, + required: true, + }, + size6: { + type: Number, + default: 0, + required: true, + }, + }, + unwrapped: { + type: Object, + newborn: { + type: Number, + default: 0, + required: true, + }, + size1: { + type: Number, + default: 0, + required: true, + }, + size2: { + type: Number, + default: 0, + required: true, + }, + size3: { + type: Number, + default: 0, + required: true, + }, + size4: { + type: Number, + default: 0, + required: true, + }, + size5: { + type: Number, + default: 0, + required: true, + }, + size6: { + type: Number, + default: 0, + required: true, + }, + }, +}); + +module.exports = mongoose.model( + "Inventory", + InventorySchema, +); \ No newline at end of file diff --git a/src/models/Order.ts b/src/models/Order.ts new file mode 100644 index 0000000..d582282 --- /dev/null +++ b/src/models/Order.ts @@ -0,0 +1,57 @@ +import {Schema, Types, model} from 'mongoose'; + +const OrderSchema = new Schema({ + id: { + type: Types.ObjectId, + unique: true, + required: true, + }, + partner: { + type: Types.ObjectId, + ref: "Partner", + required: true, + }, + datePlaced: { + type: Date, + default: () => Date.now(), + required: true, + }, + dateCompleted: { + type: Date, + default: null, + }, + status: { + type: String, + enum: ["PLACED", "OPEN", "FILLED", "CANCELLED"], + default: "PLACED", + required: true, + }, + numDiapers: { + type: Number, + required: true, + }, + newborn: { + type: Number, + }, + size1: { + type: Number, + }, + size2: { + type: Number, + }, + size3: { + type: Number, + }, + size4: { + type: Number, + }, + size5: { + type: Number, + }, + size6: { + type: Number, + }, +}); + +module.exports = model("Order", OrderSchema); + diff --git a/src/models/Staff.ts b/src/models/Staff.ts new file mode 100644 index 0000000..e69de29