From dd858c8451b61be7d8e0ce57809a662e6c34a3ce Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 29 Jun 2025 21:30:54 +0100 Subject: [PATCH] Refactor routes and schemas: reorganized service imports, updated user and auth routes, and modified schema paths for better structure. Removed unused routes and services to streamline the codebase. --- src/index.js | 2 +- src/mongo/ReseedAction.js | 2 +- src/routes/index.js | 36 ++-- .../index.js => inventory/filamentstocks.js} | 2 +- .../index.js => inventory/partstocks.js} | 2 +- .../index.js => inventory/stockaudits.js} | 2 +- .../index.js => inventory/stockevents.js} | 2 +- .../index.js => management/auditlogs.js} | 2 +- .../index.js => management/materials.js} | 2 +- .../index.js => management/notetypes.js} | 2 +- .../{parts/index.js => management/parts.js} | 2 +- .../index.js => management/products.js} | 2 +- .../{users/index.js => management/users.js} | 2 +- .../index.js => management/vendors.js} | 2 +- src/routes/{auth/index.js => misc/auth.js} | 2 +- src/routes/{notes/index.js => misc/notes.js} | 2 +- .../{spotlight/index.js => misc/spotlight.js} | 2 +- .../index.js => production/filaments.js} | 2 +- .../index.js => production/gcodefiles.js} | 2 +- .../{jobs/index.js => production/jobs.js} | 2 +- .../index.js => production/printers.js} | 2 +- .../{ => inventory}/filamentstock.schema.js | 0 .../{ => inventory}/partstock.schema.js | 0 .../{ => inventory}/stockaudit.schema.js | 0 .../{ => inventory}/stockevent.schema.js | 0 .../{ => management}/auditlog.schema.js | 0 .../{ => management}/filament.schema.js | 0 src/schemas/{ => management}/host.schema.js | 0 .../{ => management}/material.schema.js | 0 .../{ => management}/notetype.schema.js | 0 src/schemas/{ => management}/part.schema.js | 5 +- .../{ => management}/product.schema.js | 3 +- src/schemas/{ => management}/user.schema.js | 0 src/schemas/{ => management}/vendor.schema.js | 0 src/schemas/{ => misc}/note.schema.js | 0 src/schemas/passwordResets.schema.js | 15 -- .../{ => production}/gcodefile.schema.js | 0 src/schemas/{ => production}/job.schema.js | 0 .../{ => production}/printer.schema.js | 0 src/schemas/{ => production}/subjob.schema.js | 0 .../index.js => inventory/filamentstocks.js} | 8 +- .../index.js => inventory/partstocks.js} | 3 +- .../index.js => inventory/stockaudits.js} | 4 +- .../index.js => inventory/stockevents.js} | 2 +- .../index.js => management/auditlogs.js} | 2 +- .../index.js => management/filaments.js} | 4 +- .../index.js => management/materials.js} | 2 +- .../index.js => management/notetypes.js} | 4 +- .../{parts/index.js => management/parts.js} | 4 +- .../index.js => management/products.js} | 6 +- .../index.js => management/spotlight.js} | 32 ++-- .../{users/index.js => management/users.js} | 4 +- .../index.js => management/vendors.js} | 4 +- src/services/{auth/index.js => misc/auth.js} | 2 +- .../{notes/index.js => misc/notes.js} | 4 +- src/services/misc/spotlight.js | 169 ++++++++++++++++++ .../index.js => production/gcodefiles.js} | 6 +- .../{jobs/index.js => production/jobs.js} | 8 +- .../index.js => production/printers.js} | 4 +- src/util/index.js | 2 +- 60 files changed, 262 insertions(+), 111 deletions(-) rename src/routes/{filamentstocks/index.js => inventory/filamentstocks.js} (95%) rename src/routes/{partstocks/index.js => inventory/partstocks.js} (95%) rename src/routes/{stockaudits/index.js => inventory/stockaudits.js} (94%) rename src/routes/{stockevents/index.js => inventory/stockevents.js} (93%) rename src/routes/{auditlogs/index.js => management/auditlogs.js} (94%) rename src/routes/{materials/index.js => management/materials.js} (95%) rename src/routes/{notetypes/index.js => management/notetypes.js} (94%) rename src/routes/{parts/index.js => management/parts.js} (96%) rename src/routes/{products/index.js => management/products.js} (96%) rename src/routes/{users/index.js => management/users.js} (92%) rename src/routes/{vendors/index.js => management/vendors.js} (95%) rename src/routes/{auth/index.js => misc/auth.js} (95%) rename src/routes/{notes/index.js => misc/notes.js} (95%) rename src/routes/{spotlight/index.js => misc/spotlight.js} (75%) rename src/routes/{filaments/index.js => production/filaments.js} (95%) rename src/routes/{gcodefiles/index.js => production/gcodefiles.js} (97%) rename src/routes/{jobs/index.js => production/jobs.js} (95%) rename src/routes/{printers/index.js => production/printers.js} (95%) rename src/schemas/{ => inventory}/filamentstock.schema.js (100%) rename src/schemas/{ => inventory}/partstock.schema.js (100%) rename src/schemas/{ => inventory}/stockaudit.schema.js (100%) rename src/schemas/{ => inventory}/stockevent.schema.js (100%) rename src/schemas/{ => management}/auditlog.schema.js (100%) rename src/schemas/{ => management}/filament.schema.js (100%) rename src/schemas/{ => management}/host.schema.js (100%) rename src/schemas/{ => management}/material.schema.js (100%) rename src/schemas/{ => management}/notetype.schema.js (100%) rename src/schemas/{ => management}/part.schema.js (80%) rename src/schemas/{ => management}/product.schema.js (88%) rename src/schemas/{ => management}/user.schema.js (100%) rename src/schemas/{ => management}/vendor.schema.js (100%) rename src/schemas/{ => misc}/note.schema.js (100%) delete mode 100644 src/schemas/passwordResets.schema.js rename src/schemas/{ => production}/gcodefile.schema.js (100%) rename src/schemas/{ => production}/job.schema.js (100%) rename src/schemas/{ => production}/printer.schema.js (100%) rename src/schemas/{ => production}/subjob.schema.js (100%) rename src/services/{filamentstocks/index.js => inventory/filamentstocks.js} (95%) rename src/services/{partstocks/index.js => inventory/partstocks.js} (97%) rename src/services/{stockaudits/index.js => inventory/stockaudits.js} (96%) rename src/services/{stockevents/index.js => inventory/stockevents.js} (97%) rename src/services/{auditlogs/index.js => management/auditlogs.js} (95%) rename src/services/{filaments/index.js => management/filaments.js} (97%) rename src/services/{materials/index.js => management/materials.js} (98%) rename src/services/{notetypes/index.js => management/notetypes.js} (96%) rename src/services/{parts/index.js => management/parts.js} (98%) rename src/services/{products/index.js => management/products.js} (96%) rename src/services/{spotlight/index.js => management/spotlight.js} (81%) rename src/services/{users/index.js => management/users.js} (96%) rename src/services/{vendors/index.js => management/vendors.js} (96%) rename src/services/{auth/index.js => misc/auth.js} (99%) rename src/services/{notes/index.js => misc/notes.js} (97%) create mode 100644 src/services/misc/spotlight.js rename src/services/{gcodefiles/index.js => production/gcodefiles.js} (98%) rename src/services/{jobs/index.js => production/jobs.js} (95%) rename src/services/{printers/index.js => production/printers.js} (97%) diff --git a/src/index.js b/src/index.js index 5118f3a..27468cd 100644 --- a/src/index.js +++ b/src/index.js @@ -29,7 +29,7 @@ import * as fs from "fs"; import cron from "node-cron"; import ReseedAction from "./mongo/ReseedAction.js"; import log4js from "log4js"; -import { populateUserMiddleware } from "./services/auth/index.js"; +import { populateUserMiddleware } from "./services/misc/auth.js"; dotenv.config(); diff --git a/src/mongo/ReseedAction.js b/src/mongo/ReseedAction.js index 1409f1e..551d360 100644 --- a/src/mongo/ReseedAction.js +++ b/src/mongo/ReseedAction.js @@ -1,6 +1,6 @@ import mongoose from "mongoose"; import bcrypt from "bcrypt"; -import { userModel } from "../schemas/user.schema.js"; +import { userModel } from "../schemas/management/user.schema.js"; import { dbConnect } from "./index.js"; const ReseedAction = () => { diff --git a/src/routes/index.js b/src/routes/index.js index 4308613..6561864 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,21 +1,21 @@ -import userRoutes from "./users/index.js"; -import authRoutes from "./auth/index.js"; -import printerRoutes from "./printers/index.js"; -import jobRoutes from "./jobs/index.js"; -import gcodeFileRoutes from "./gcodefiles/index.js"; -import filamentRoutes from "./filaments/index.js"; -import spotlightRoutes from "./spotlight/index.js"; -import partRoutes from "./parts/index.js"; -import productRoutes from "./products/index.js"; -import vendorRoutes from "./vendors/index.js"; -import materialRoutes from "./materials/index.js"; -import partStockRoutes from "./partstocks/index.js"; -import filamentStockRoutes from "./filamentstocks/index.js"; -import stockEventRoutes from "./stockevents/index.js"; -import stockAuditRoutes from "./stockaudits/index.js"; -import auditLogRoutes from "./auditlogs/index.js"; -import noteTypeRoutes from "./notetypes/index.js"; -import noteRoutes from "./notes/index.js" +import userRoutes from "./management/users.js"; +import authRoutes from "./misc/auth.js"; +import printerRoutes from "./production/printers.js"; +import jobRoutes from "./production/jobs.js"; +import gcodeFileRoutes from "./production/gcodefiles.js"; +import filamentRoutes from "./production/filaments.js"; +import spotlightRoutes from "./misc/spotlight.js"; +import partRoutes from "./management/parts.js"; +import productRoutes from "./management/products.js"; +import vendorRoutes from "./management/vendors.js"; +import materialRoutes from "./management/materials.js"; +import partStockRoutes from "./inventory/partstocks.js"; +import filamentStockRoutes from "./inventory/filamentstocks.js"; +import stockEventRoutes from "./inventory/stockevents.js"; +import stockAuditRoutes from "./inventory/stockaudits.js"; +import auditLogRoutes from "./management/auditlogs.js"; +import noteTypeRoutes from "./management/notetypes.js"; +import noteRoutes from "./misc/notes.js"; export { userRoutes, diff --git a/src/routes/filamentstocks/index.js b/src/routes/inventory/filamentstocks.js similarity index 95% rename from src/routes/filamentstocks/index.js rename to src/routes/inventory/filamentstocks.js index 769c7d9..e60a6b6 100644 --- a/src/routes/filamentstocks/index.js +++ b/src/routes/inventory/filamentstocks.js @@ -8,7 +8,7 @@ import { getFilamentStockRouteHandler, editFilamentStockRouteHandler, newFilamentStockRouteHandler, -} from "../../services/filamentstocks/index.js"; +} from "../../services/inventory/filamentstocks.js"; // list of filamentStocks router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/partstocks/index.js b/src/routes/inventory/partstocks.js similarity index 95% rename from src/routes/partstocks/index.js rename to src/routes/inventory/partstocks.js index df8d6e8..e5c62e9 100644 --- a/src/routes/partstocks/index.js +++ b/src/routes/inventory/partstocks.js @@ -8,7 +8,7 @@ import { getPartStockRouteHandler, editPartStockRouteHandler, newPartStockRouteHandler, -} from "../../services/partstocks/index.js"; +} from "../../services/inventory/partstocks.js"; // list of partStocks router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/stockaudits/index.js b/src/routes/inventory/stockaudits.js similarity index 94% rename from src/routes/stockaudits/index.js rename to src/routes/inventory/stockaudits.js index e7a316f..5ac87fa 100644 --- a/src/routes/stockaudits/index.js +++ b/src/routes/inventory/stockaudits.js @@ -9,7 +9,7 @@ import { newStockAuditRouteHandler, updateStockAuditRouteHandler, deleteStockAuditRouteHandler, -} from "../../services/stockaudits/index.js"; +} from "../../services/inventory/stockaudits.js"; // List stock audits router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/stockevents/index.js b/src/routes/inventory/stockevents.js similarity index 93% rename from src/routes/stockevents/index.js rename to src/routes/inventory/stockevents.js index e73c601..e44857c 100644 --- a/src/routes/stockevents/index.js +++ b/src/routes/inventory/stockevents.js @@ -7,7 +7,7 @@ import { listStockEventsRouteHandler, getStockEventRouteHandler, newStockEventRouteHandler, -} from "../../services/stockevents/index.js"; +} from "../../services/inventory/stockevents.js"; // List stock events router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/auditlogs/index.js b/src/routes/management/auditlogs.js similarity index 94% rename from src/routes/auditlogs/index.js rename to src/routes/management/auditlogs.js index 58672a5..3078483 100644 --- a/src/routes/auditlogs/index.js +++ b/src/routes/management/auditlogs.js @@ -1,5 +1,5 @@ import express from 'express'; -import { listAuditLogsRouteHandler, getAuditLogRouteHandler } from '../../services/auditlogs/index.js'; +import { listAuditLogsRouteHandler, getAuditLogRouteHandler } from '../../services/management/auditlogs.js'; const router = express.Router(); diff --git a/src/routes/materials/index.js b/src/routes/management/materials.js similarity index 95% rename from src/routes/materials/index.js rename to src/routes/management/materials.js index 2b1fea4..b7266e5 100644 --- a/src/routes/materials/index.js +++ b/src/routes/management/materials.js @@ -8,7 +8,7 @@ import { getMaterialRouteHandler, editMaterialRouteHandler, newMaterialRouteHandler, -} from "../../services/materials/index.js"; +} from "../../services/management/materials.js"; // list of materials router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/notetypes/index.js b/src/routes/management/notetypes.js similarity index 94% rename from src/routes/notetypes/index.js rename to src/routes/management/notetypes.js index 6e1d67d..fe8e59a 100644 --- a/src/routes/notetypes/index.js +++ b/src/routes/management/notetypes.js @@ -5,7 +5,7 @@ import { getNoteTypeRouteHandler, editNoteTypeRouteHandler, newNoteTypeRouteHandler, -} from "../../services/notetypes/index.js"; +} from "../../services/management/notetypes.js"; import { parseFilter } from "../../util/index.js"; const router = express.Router(); diff --git a/src/routes/parts/index.js b/src/routes/management/parts.js similarity index 96% rename from src/routes/parts/index.js rename to src/routes/management/parts.js index 5bbc90a..0424760 100644 --- a/src/routes/parts/index.js +++ b/src/routes/management/parts.js @@ -10,7 +10,7 @@ import { newPartRouteHandler, uploadPartFileContentRouteHandler, getPartFileContentRouteHandler, -} from "../../services/parts/index.js"; +} from "../../services/management/parts.js"; // list of parts router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/products/index.js b/src/routes/management/products.js similarity index 96% rename from src/routes/products/index.js rename to src/routes/management/products.js index 82ebd5b..d3df011 100644 --- a/src/routes/products/index.js +++ b/src/routes/management/products.js @@ -8,7 +8,7 @@ import { getProductRouteHandler, editProductRouteHandler, newProductRouteHandler, -} from "../../services/products/index.js"; +} from "../../services/management/products.js"; // list of products router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/users/index.js b/src/routes/management/users.js similarity index 92% rename from src/routes/users/index.js rename to src/routes/management/users.js index 859a4dd..c82bfb6 100644 --- a/src/routes/users/index.js +++ b/src/routes/management/users.js @@ -7,7 +7,7 @@ import { listUsersRouteHandler, getUserRouteHandler, editUserRouteHandler, -} from "../../services/users/index.js"; +} from "../../services/management/users.js"; // list of users router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/vendors/index.js b/src/routes/management/vendors.js similarity index 95% rename from src/routes/vendors/index.js rename to src/routes/management/vendors.js index 6a428a6..079c456 100644 --- a/src/routes/vendors/index.js +++ b/src/routes/management/vendors.js @@ -8,7 +8,7 @@ import { getVendorRouteHandler, editVendorRouteHandler, newVendorRouteHandler, -} from "../../services/vendors/index.js"; +} from "../../services/management/vendors.js"; // list of vendors router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/auth/index.js b/src/routes/misc/auth.js similarity index 95% rename from src/routes/auth/index.js rename to src/routes/misc/auth.js index f133282..a7301ce 100644 --- a/src/routes/auth/index.js +++ b/src/routes/misc/auth.js @@ -7,7 +7,7 @@ import { userRouteHandler, logoutRouteHandler, refreshTokenRouteHandler, -} from "../../services/auth/index.js"; +} from "../../services/misc/auth.js"; const router = express.Router(); diff --git a/src/routes/notes/index.js b/src/routes/misc/notes.js similarity index 95% rename from src/routes/notes/index.js rename to src/routes/misc/notes.js index 353ff15..6046e64 100644 --- a/src/routes/notes/index.js +++ b/src/routes/misc/notes.js @@ -6,7 +6,7 @@ import { editNoteRouteHandler, newNoteRouteHandler, deleteNoteRouteHandler -} from "../../services/notes/index.js"; +} from "../../services/misc/notes.js"; import { parseFilter } from "../../util/index.js"; const router = express.Router(); diff --git a/src/routes/spotlight/index.js b/src/routes/misc/spotlight.js similarity index 75% rename from src/routes/spotlight/index.js rename to src/routes/misc/spotlight.js index ba0653f..6314e89 100644 --- a/src/routes/spotlight/index.js +++ b/src/routes/misc/spotlight.js @@ -2,7 +2,7 @@ import express from "express"; import { isAuthenticated } from "../../keycloak.js"; const router = express.Router(); -import { getSpotlightRouteHandler } from "../../services/spotlight/index.js"; +import { getSpotlightRouteHandler } from "../../services/misc/spotlight.js"; router.get("/:query", isAuthenticated, (req, res) => { getSpotlightRouteHandler(req, res); diff --git a/src/routes/filaments/index.js b/src/routes/production/filaments.js similarity index 95% rename from src/routes/filaments/index.js rename to src/routes/production/filaments.js index 3520af1..41b5c9a 100644 --- a/src/routes/filaments/index.js +++ b/src/routes/production/filaments.js @@ -8,7 +8,7 @@ import { getFilamentRouteHandler, editFilamentRouteHandler, newFilamentRouteHandler, -} from "../../services/filaments/index.js"; +} from "../../services/management/filaments.js"; // list of filaments router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/gcodefiles/index.js b/src/routes/production/gcodefiles.js similarity index 97% rename from src/routes/gcodefiles/index.js rename to src/routes/production/gcodefiles.js index 0718768..28f1c30 100644 --- a/src/routes/gcodefiles/index.js +++ b/src/routes/production/gcodefiles.js @@ -11,7 +11,7 @@ import { parseGCodeFileHandler, uploadGCodeFileContentRouteHandler, getGCodeFileContentRouteHandler, -} from "../../services/gcodefiles/index.js"; +} from "../../services/production/gcodefiles.js"; // list of printers router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/jobs/index.js b/src/routes/production/jobs.js similarity index 95% rename from src/routes/jobs/index.js rename to src/routes/production/jobs.js index 05b6b74..6c45022 100644 --- a/src/routes/jobs/index.js +++ b/src/routes/production/jobs.js @@ -8,7 +8,7 @@ import { editJobRouteHandler, createJobRouteHandler, getJobStatsRouteHandler -} from "../../services/jobs/index.js"; +} from "../../services/production/jobs.js"; // list of print jobs router.get("/", isAuthenticated, (req, res) => { diff --git a/src/routes/printers/index.js b/src/routes/production/printers.js similarity index 95% rename from src/routes/printers/index.js rename to src/routes/production/printers.js index 7c3bc8b..6cdf32b 100644 --- a/src/routes/printers/index.js +++ b/src/routes/production/printers.js @@ -9,7 +9,7 @@ import { getPrinterRouteHandler, createPrinterRouteHandler, getPrinterStatsRouteHandler, -} from "../../services/printers/index.js"; +} from "../../services/production/printers.js"; // list of printers router.get("/", isAuthenticated, (req, res) => { diff --git a/src/schemas/filamentstock.schema.js b/src/schemas/inventory/filamentstock.schema.js similarity index 100% rename from src/schemas/filamentstock.schema.js rename to src/schemas/inventory/filamentstock.schema.js diff --git a/src/schemas/partstock.schema.js b/src/schemas/inventory/partstock.schema.js similarity index 100% rename from src/schemas/partstock.schema.js rename to src/schemas/inventory/partstock.schema.js diff --git a/src/schemas/stockaudit.schema.js b/src/schemas/inventory/stockaudit.schema.js similarity index 100% rename from src/schemas/stockaudit.schema.js rename to src/schemas/inventory/stockaudit.schema.js diff --git a/src/schemas/stockevent.schema.js b/src/schemas/inventory/stockevent.schema.js similarity index 100% rename from src/schemas/stockevent.schema.js rename to src/schemas/inventory/stockevent.schema.js diff --git a/src/schemas/auditlog.schema.js b/src/schemas/management/auditlog.schema.js similarity index 100% rename from src/schemas/auditlog.schema.js rename to src/schemas/management/auditlog.schema.js diff --git a/src/schemas/filament.schema.js b/src/schemas/management/filament.schema.js similarity index 100% rename from src/schemas/filament.schema.js rename to src/schemas/management/filament.schema.js diff --git a/src/schemas/host.schema.js b/src/schemas/management/host.schema.js similarity index 100% rename from src/schemas/host.schema.js rename to src/schemas/management/host.schema.js diff --git a/src/schemas/material.schema.js b/src/schemas/management/material.schema.js similarity index 100% rename from src/schemas/material.schema.js rename to src/schemas/management/material.schema.js diff --git a/src/schemas/notetype.schema.js b/src/schemas/management/notetype.schema.js similarity index 100% rename from src/schemas/notetype.schema.js rename to src/schemas/management/notetype.schema.js diff --git a/src/schemas/part.schema.js b/src/schemas/management/part.schema.js similarity index 80% rename from src/schemas/part.schema.js rename to src/schemas/management/part.schema.js index d9cc3df..33fec19 100644 --- a/src/schemas/part.schema.js +++ b/src/schemas/management/part.schema.js @@ -7,9 +7,8 @@ const partSchema = new Schema( name: { type: String, required: true }, fileName: { type: String, required: false }, product: { type: mongoose.Schema.Types.ObjectId, ref: "Product" }, - useGlobalPricing: { type: Boolean, default: true }, - marginOrPrice: { type: Boolean, default: false }, - margin: { type: Number, required: false }, + globalPricing: { type: Boolean, default: true }, + priceMode: { type: String, default: 'margin' }, price: { type: Number, required: false }, }, { timestamps: true }, diff --git a/src/schemas/product.schema.js b/src/schemas/management/product.schema.js similarity index 88% rename from src/schemas/product.schema.js rename to src/schemas/management/product.schema.js index 7e1cbe6..7c81732 100644 --- a/src/schemas/product.schema.js +++ b/src/schemas/management/product.schema.js @@ -7,8 +7,7 @@ const productSchema = new Schema( name: { type: String, required: true }, tags: [{ type: String }], version: { type: String }, - marginOrPrice: { type: Boolean, default: false }, - margin: { type: Number, required: false }, + priceMode: { type: String, default: 'margin' }, price: { type: Number, required: false }, vendor: { type: Schema.Types.ObjectId, ref: "Vendor", required: true }, parts: [{ type: mongoose.Schema.Types.ObjectId, ref: "Part" }], diff --git a/src/schemas/user.schema.js b/src/schemas/management/user.schema.js similarity index 100% rename from src/schemas/user.schema.js rename to src/schemas/management/user.schema.js diff --git a/src/schemas/vendor.schema.js b/src/schemas/management/vendor.schema.js similarity index 100% rename from src/schemas/vendor.schema.js rename to src/schemas/management/vendor.schema.js diff --git a/src/schemas/note.schema.js b/src/schemas/misc/note.schema.js similarity index 100% rename from src/schemas/note.schema.js rename to src/schemas/misc/note.schema.js diff --git a/src/schemas/passwordResets.schema.js b/src/schemas/passwordResets.schema.js deleted file mode 100644 index e5e7edf..0000000 --- a/src/schemas/passwordResets.schema.js +++ /dev/null @@ -1,15 +0,0 @@ -import mongoose from "mongoose"; - -const passwordResetSchema = new mongoose.Schema({ - email: { required: true, type: String }, - token: { required: true, type: String }, - createdAt: { type: Date }, -}); - -passwordResetSchema.virtual("id").get(function () { - return this._id.toHexString(); -}); - -passwordResetSchema.set("toJSON", { virtuals: true }); - -export const passwordResetModel = mongoose.model("PasswordReset", passwordResetSchema); diff --git a/src/schemas/gcodefile.schema.js b/src/schemas/production/gcodefile.schema.js similarity index 100% rename from src/schemas/gcodefile.schema.js rename to src/schemas/production/gcodefile.schema.js diff --git a/src/schemas/job.schema.js b/src/schemas/production/job.schema.js similarity index 100% rename from src/schemas/job.schema.js rename to src/schemas/production/job.schema.js diff --git a/src/schemas/printer.schema.js b/src/schemas/production/printer.schema.js similarity index 100% rename from src/schemas/printer.schema.js rename to src/schemas/production/printer.schema.js diff --git a/src/schemas/subjob.schema.js b/src/schemas/production/subjob.schema.js similarity index 100% rename from src/schemas/subjob.schema.js rename to src/schemas/production/subjob.schema.js diff --git a/src/services/filamentstocks/index.js b/src/services/inventory/filamentstocks.js similarity index 95% rename from src/services/filamentstocks/index.js rename to src/services/inventory/filamentstocks.js index 15b97bf..6b764f8 100644 --- a/src/services/filamentstocks/index.js +++ b/src/services/inventory/filamentstocks.js @@ -1,11 +1,11 @@ import dotenv from "dotenv"; -import { filamentStockModel } from "../../schemas/filamentstock.schema.js"; -import { filamentModel } from "../../schemas/filament.schema.js"; -import { stockEventModel } from "../../schemas/stockevent.schema.js"; +import { filamentStockModel } from "../../schemas/inventory/filamentstock.schema.js"; +import { filamentModel } from "../../schemas/management/filament.schema.js"; +import { stockEventModel } from "../../schemas/inventory/stockevent.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import mongoose from "mongoose"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/partstocks/index.js b/src/services/inventory/partstocks.js similarity index 97% rename from src/services/partstocks/index.js rename to src/services/inventory/partstocks.js index 0a4a422..d3c6ba6 100644 --- a/src/services/partstocks/index.js +++ b/src/services/inventory/partstocks.js @@ -1,6 +1,5 @@ import dotenv from "dotenv"; -import { partStockModel } from "../../schemas/partstock.schema.js"; -import jwt from "jsonwebtoken"; +import { partStockModel } from "../../schemas/inventory/partstock.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; diff --git a/src/services/stockaudits/index.js b/src/services/inventory/stockaudits.js similarity index 96% rename from src/services/stockaudits/index.js rename to src/services/inventory/stockaudits.js index 6b41d44..ed4fd06 100644 --- a/src/services/stockaudits/index.js +++ b/src/services/inventory/stockaudits.js @@ -1,8 +1,8 @@ import dotenv from "dotenv"; -import { stockAuditModel } from "../../schemas/stockaudit.schema.js"; +import { stockAuditModel } from "../../schemas/inventory/stockaudit.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/stockevents/index.js b/src/services/inventory/stockevents.js similarity index 97% rename from src/services/stockevents/index.js rename to src/services/inventory/stockevents.js index 3f645cd..da8ebe1 100644 --- a/src/services/stockevents/index.js +++ b/src/services/inventory/stockevents.js @@ -1,5 +1,5 @@ import dotenv from "dotenv"; -import { stockEventModel } from "../../schemas/stockevent.schema.js"; +import { stockEventModel } from "../../schemas/inventory/stockevent.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; diff --git a/src/services/auditlogs/index.js b/src/services/management/auditlogs.js similarity index 95% rename from src/services/auditlogs/index.js rename to src/services/management/auditlogs.js index 1839d4f..d701fca 100644 --- a/src/services/auditlogs/index.js +++ b/src/services/management/auditlogs.js @@ -1,5 +1,5 @@ import dotenv from "dotenv"; -import { auditLogModel } from '../../schemas/auditlog.schema.js'; +import { auditLogModel } from '../../schemas/management/auditlog.schema.js'; import log4js from "log4js"; import mongoose from "mongoose"; diff --git a/src/services/filaments/index.js b/src/services/management/filaments.js similarity index 97% rename from src/services/filaments/index.js rename to src/services/management/filaments.js index 00be51c..450c817 100644 --- a/src/services/filaments/index.js +++ b/src/services/management/filaments.js @@ -1,10 +1,10 @@ import dotenv from "dotenv"; -import { filamentModel } from "../../schemas/filament.schema.js"; +import { filamentModel } from "../../schemas/management/filament.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/materials/index.js b/src/services/management/materials.js similarity index 98% rename from src/services/materials/index.js rename to src/services/management/materials.js index 69e7bc7..dd6891e 100644 --- a/src/services/materials/index.js +++ b/src/services/management/materials.js @@ -1,5 +1,5 @@ import dotenv from "dotenv"; -import { materialModel } from "../../schemas/material.schema.js"; +import { materialModel } from "../../schemas/management/material.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import mongoose from "mongoose"; diff --git a/src/services/notetypes/index.js b/src/services/management/notetypes.js similarity index 96% rename from src/services/notetypes/index.js rename to src/services/management/notetypes.js index 86b5821..1a264e6 100644 --- a/src/services/notetypes/index.js +++ b/src/services/management/notetypes.js @@ -1,9 +1,9 @@ import dotenv from "dotenv"; -import { noteTypeModel } from "../../schemas/notetype.schema.js"; +import { noteTypeModel } from "../../schemas/management/notetype.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/parts/index.js b/src/services/management/parts.js similarity index 98% rename from src/services/parts/index.js rename to src/services/management/parts.js index 15d95b4..e5d4f99 100644 --- a/src/services/parts/index.js +++ b/src/services/management/parts.js @@ -1,12 +1,12 @@ import dotenv from "dotenv"; -import { partModel } from "../../schemas/part.schema.js"; +import { partModel } from "../../schemas/management/part.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; import multer from "multer"; import fs from "fs"; import path from "path"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/products/index.js b/src/services/management/products.js similarity index 96% rename from src/services/products/index.js rename to src/services/management/products.js index 62d0e5d..cafc2c2 100644 --- a/src/services/products/index.js +++ b/src/services/management/products.js @@ -1,10 +1,10 @@ import dotenv from "dotenv"; -import { productModel } from "../../schemas/product.schema.js"; -import { partModel } from "../../schemas/part.schema.js"; +import { productModel } from "../../schemas/management/product.schema.js"; +import { partModel } from "../../schemas/management/part.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/spotlight/index.js b/src/services/management/spotlight.js similarity index 81% rename from src/services/spotlight/index.js rename to src/services/management/spotlight.js index 457f585..bd98c91 100644 --- a/src/services/spotlight/index.js +++ b/src/services/management/spotlight.js @@ -1,21 +1,21 @@ import dotenv from "dotenv"; -import { jobModel } from "../../schemas/job.schema.js"; -import { subJobModel } from "../../schemas/subjob.schema.js"; +import { jobModel } from "../../schemas/production/job.schema.js"; +import { subJobModel } from "../../schemas/production/subjob.schema.js"; import log4js from "log4js"; -import { printerModel } from "../../schemas/printer.schema.js"; -import { filamentModel } from "../../schemas/filament.schema.js"; -import { gcodeFileModel } from "../../schemas/gcodefile.schema.js"; -import { partModel } from "../../schemas/part.schema.js"; -import { productModel } from "../../schemas/product.schema.js"; -import { vendorModel } from "../../schemas/vendor.schema.js"; -import { filamentStockModel } from "../../schemas/filamentstock.schema.js"; -import { stockEventModel } from "../../schemas/stockevent.schema.js"; -import { stockAuditModel } from "../../schemas/stockaudit.schema.js"; -import { partStockModel } from "../../schemas/partstock.schema.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; -import { userModel } from "../../schemas/user.schema.js"; -import { noteTypeModel } from "../../schemas/notetype.schema.js"; -import { noteModel } from "../../schemas/note.schema.js"; +import { printerModel } from "../../schemas/production/printer.schema.js"; +import { filamentModel } from "../../schemas/management/filament.schema.js"; +import { gcodeFileModel } from "../../schemas/production/gcodefile.schema.js"; +import { partModel } from "../../schemas/management/part.schema.js"; +import { productModel } from "../../schemas/management/product.schema.js"; +import { vendorModel } from "../../schemas/management/vendor.schema.js"; +import { filamentStockModel } from "../../schemas/inventory/filamentstock.schema.js"; +import { stockEventModel } from "../../schemas/inventory/stockevent.schema.js"; +import { stockAuditModel } from "../../schemas/inventory/stockaudit.schema.js"; +import { partStockModel } from "../../schemas/inventory/partstock.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; +import { userModel } from "../../schemas/management/user.schema.js"; +import { noteTypeModel } from "../../schemas/management/notetype.schema.js"; +import { noteModel } from "../../schemas/misc/note.schema.js"; import mongoose from "mongoose"; dotenv.config(); diff --git a/src/services/users/index.js b/src/services/management/users.js similarity index 96% rename from src/services/users/index.js rename to src/services/management/users.js index be24750..c08dc19 100644 --- a/src/services/users/index.js +++ b/src/services/management/users.js @@ -1,10 +1,10 @@ import dotenv from "dotenv"; -import { userModel } from "../../schemas/user.schema.js"; +import { userModel } from "../../schemas/management/user.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/vendors/index.js b/src/services/management/vendors.js similarity index 96% rename from src/services/vendors/index.js rename to src/services/management/vendors.js index 4ac219f..d262b8b 100644 --- a/src/services/vendors/index.js +++ b/src/services/management/vendors.js @@ -1,10 +1,10 @@ import dotenv from "dotenv"; -import { vendorModel } from "../../schemas/vendor.schema.js"; +import { vendorModel } from "../../schemas/management/vendor.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/auth/index.js b/src/services/misc/auth.js similarity index 99% rename from src/services/auth/index.js rename to src/services/misc/auth.js index db2d6a7..8175577 100644 --- a/src/services/auth/index.js +++ b/src/services/misc/auth.js @@ -2,7 +2,7 @@ import dotenv from "dotenv"; import { keycloak } from "../../keycloak.js"; import log4js from "log4js"; import axios from "axios"; -import { userModel } from "../../schemas/user.schema.js"; +import { userModel } from "../../schemas/management/user.schema.js"; dotenv.config(); diff --git a/src/services/notes/index.js b/src/services/misc/notes.js similarity index 97% rename from src/services/notes/index.js rename to src/services/misc/notes.js index ef4d46e..0a54f60 100644 --- a/src/services/notes/index.js +++ b/src/services/misc/notes.js @@ -1,9 +1,9 @@ import dotenv from "dotenv"; -import { noteModel } from "../../schemas/note.schema.js"; +import { noteModel } from "../../schemas/misc/note.schema.js"; import log4js from "log4js"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/misc/spotlight.js b/src/services/misc/spotlight.js new file mode 100644 index 0000000..d20df4f --- /dev/null +++ b/src/services/misc/spotlight.js @@ -0,0 +1,169 @@ +import dotenv from "dotenv"; +import log4js from "log4js"; +import mongoose from "mongoose"; +import { jobModel } from "../../schemas/production/job.schema.js"; +import { subJobModel } from "../../schemas/production/subjob.schema.js"; +import { printerModel } from "../../schemas/production/printer.schema.js"; +import { filamentModel } from "../../schemas/management/filament.schema.js"; +import { gcodeFileModel } from "../../schemas/production/gcodefile.schema.js"; +import { partModel } from "../../schemas/management/part.schema.js"; +import { productModel } from "../../schemas/management/product.schema.js"; +import { vendorModel } from "../../schemas/management/vendor.schema.js"; +import { filamentStockModel } from "../../schemas/inventory/filamentstock.schema.js"; +import { stockEventModel } from "../../schemas/inventory/stockevent.schema.js"; +import { stockAuditModel } from "../../schemas/inventory/stockaudit.schema.js"; +import { partStockModel } from "../../schemas/inventory/partstock.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; +import { userModel } from "../../schemas/management/user.schema.js"; +import { noteTypeModel } from "../../schemas/management/notetype.schema.js"; +import { noteModel } from "../../schemas/misc/note.schema.js"; + +dotenv.config(); + +const logger = log4js.getLogger("Jobs"); +logger.level = process.env.LOG_LEVEL; + +// Map prefixes to models and id fields +const PREFIX_MODEL_MAP = { + PRN: { model: printerModel, idField: '_id', type: 'printer' }, + FIL: { model: filamentModel, idField: '_id', type: 'filament' }, + SPL: { model: null, idField: '_id', type: 'spool' }, // No spool model found + GCF: { model: gcodeFileModel, idField: '_id', type: 'gcodefile' }, + JOB: { model: jobModel, idField: '_id', type: 'job' }, + PRT: { model: partModel, idField: '_id', type: 'part' }, + PRD: { model: productModel, idField: '_id', type: 'product' }, + VEN: { model: vendorModel, idField: '_id', type: 'vendor' }, + SJB: { model: subJobModel, idField: '_id', type: 'subjob' }, + FLS: { model: filamentStockModel, idField: '_id', type: 'filamentstock' }, + SEV: { model: stockEventModel, idField: '_id', type: 'stockevent' }, + SAU: { model: stockAuditModel, idField: '_id', type: 'stockaudit' }, + PTS: { model: partStockModel, idField: '_id', type: 'partstock' }, + PDS: { model: null, idField: '_id', type: 'productstock' }, // No productStockModel found + ADL: { model: auditLogModel, idField: '_id', type: 'auditlog' }, + USR: { model: userModel, idField: '_id', type: 'user' }, + NTY: { model: noteTypeModel, idField: '_id', type: 'notetype' }, + NTE: { model: noteModel, idField: '_id', type: 'note' }, +}; + +// Helper function to build search filter from query parameters +const buildSearchFilter = (params) => { + const filter = {}; + + for (const [key, value] of Object.entries(params)) { + // Skip pagination and limit parameters as they're not search filters + if (key === 'limit' || key === 'page') continue; + + // Handle different field types + if (key === 'name') { + filter.name = { $regex: value, $options: 'i' }; // Case-insensitive search + } else if (key === 'id' || key === '_id') { + if (mongoose.Types.ObjectId.isValid(value)) { + filter._id = value; + } + } else if (key === 'tags') { + filter.tags = { $in: [new RegExp(value, 'i')] }; + } else if (key === 'state') { + filter['state.type'] = value; + } else if (key.includes('.')) { + // Handle nested fields like 'state.type', 'address.city', etc. + filter[key] = { $regex: value, $options: 'i' }; + } else { + // For all other fields, do a case-insensitive search + filter[key] = { $regex: value, $options: 'i' }; + } + } + + return filter; +}; + +const trimSpotlightObject = (object) => { +return { + _id: object._id, + name: object.name || undefined, + state: object.state && object?.state.type? { type: object.state.type } : undefined, + tags: object.tags || undefined, + email: object.email || undefined, + color: object.color || undefined, + updatedAt: object.updatedAt || undefined, + }; +} + +export const getSpotlightRouteHandler = async (req, res) => { + try { + const query = req.params.query; + const queryParams = req.query; + if (query.length < 3) { + res.status(200).send([]); + return; + } + const prefix = query.substring(0, 3); + const delimiter = query.substring(3, 4); + const suffix = query.substring(4); + + if (delimiter == ":") { + const prefixEntry = PREFIX_MODEL_MAP[prefix]; + if (!prefixEntry || !prefixEntry.model) { + res.status(400).send({ error: "Invalid or unsupported prefix" }); + return; + } + const { model, idField } = prefixEntry; + + // Validate ObjectId if the idField is '_id' + if (idField === '_id' && !mongoose.Types.ObjectId.isValid(suffix)) { + res.status(404).send({ error: `${prefix} not found` }); + return; + } + + // Find the object by the correct field + const queryObj = {}; + queryObj[idField] = suffix.toLowerCase(); + let doc = await model.findOne(queryObj).lean(); + if (!doc) { + res.status(404).send({ error: `${prefix} not found` }); + return; + } + // Build the response with only the required fields + const response = trimSpotlightObject(doc) + res.status(200).send(response); + return; + } + + console.log(queryParams) + + if (Object.keys(queryParams).length > 0) { + const prefixEntry = PREFIX_MODEL_MAP[prefix]; + console.log(prefixEntry) + if (!prefixEntry || !prefixEntry.model) { + res.status(400).send({ error: "Invalid or unsupported prefix" }); + return; + } + const { model } = prefixEntry; + + // Use req.query for search parameters + + if (Object.keys(queryParams).length === 0) { + res.status(400).send({ error: "No search parameters provided" }); + return; + } + + // Build search filter + const searchFilter = buildSearchFilter(queryParams); + + // Perform search with limit + const limit = parseInt(req.query.limit) || 10; + const docs = await model.find(searchFilter) + .limit(limit) + .sort({ updatedAt: -1 }) + .lean(); + + // Format response + const response = docs.map(doc => (trimSpotlightObject(doc))); + + res.status(200).send(response); + return; + } + } catch (error) { + logger.error("Error in spotlight lookup:", error); + res.status(500).send({ error: error }); + } +}; diff --git a/src/services/gcodefiles/index.js b/src/services/production/gcodefiles.js similarity index 98% rename from src/services/gcodefiles/index.js rename to src/services/production/gcodefiles.js index 51de05c..f4455e0 100644 --- a/src/services/gcodefiles/index.js +++ b/src/services/production/gcodefiles.js @@ -1,6 +1,6 @@ import dotenv from "dotenv"; -import { gcodeFileModel } from "../../schemas/gcodefile.schema.js"; -import { filamentModel } from "../../schemas/filament.schema.js"; +import { gcodeFileModel } from "../../schemas/production/gcodefile.schema.js"; +import { filamentModel } from "../../schemas/management/filament.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; import multer from "multer"; @@ -9,7 +9,7 @@ import path from "path"; import fs from "fs"; import mongoose from "mongoose"; import { newAuditLog } from "../../util/index.js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; import { extractConfigBlock } from "../../util/index.js"; diff --git a/src/services/jobs/index.js b/src/services/production/jobs.js similarity index 95% rename from src/services/jobs/index.js rename to src/services/production/jobs.js index fdea8b8..8c2f160 100644 --- a/src/services/jobs/index.js +++ b/src/services/production/jobs.js @@ -1,11 +1,11 @@ import dotenv from "dotenv"; import mongoose from "mongoose"; -import { jobModel } from "../../schemas/job.schema.js"; -import { subJobModel } from "../../schemas/subjob.schema.js"; -import { noteModel } from "../../schemas/note.schema.js"; +import { jobModel } from "../../schemas/production/job.schema.js"; +import { subJobModel } from "../../schemas/production/subjob.schema.js"; +import { noteModel } from "../../schemas/misc/note.schema.js"; import jwt from "jsonwebtoken"; import log4js from "log4js"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/services/printers/index.js b/src/services/production/printers.js similarity index 97% rename from src/services/printers/index.js rename to src/services/production/printers.js index d7c97df..03f0e74 100644 --- a/src/services/printers/index.js +++ b/src/services/production/printers.js @@ -1,9 +1,9 @@ import dotenv from "dotenv"; -import { printerModel } from "../../schemas/printer.schema.js"; +import { printerModel } from "../../schemas/production/printer.schema.js"; import log4js from "log4js"; import { newAuditLog } from "../../util/index.js"; import mongoose from "mongoose"; -import { auditLogModel } from "../../schemas/auditlog.schema.js"; +import { auditLogModel } from "../../schemas/management/auditlog.schema.js"; dotenv.config(); diff --git a/src/util/index.js b/src/util/index.js index 18d737a..ecb98ef 100644 --- a/src/util/index.js +++ b/src/util/index.js @@ -292,7 +292,7 @@ function getChangedValues(oldObj, newObj) { } async function newAuditLog(oldValue, newValue, targetId, targetModel, ownerId, ownerModel) { - const { auditLogModel } = await import('../schemas/auditlog.schema.js'); + const { auditLogModel } = await import('../schemas/management/auditlog.schema.js'); // Get only the changed values const changedValues = getChangedValues(oldValue, newValue);