From 55a1633eab586362c097404108d7b258e294716c Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 13 Dec 2025 21:14:06 +0000 Subject: [PATCH] Updated import paths. --- src/keycloak.js | 4 +- src/routes/inventory/filamentstocks.js | 12 +++++ src/routes/inventory/orderitems.js | 12 +++++ src/routes/inventory/partstocks.js | 12 +++++ src/routes/inventory/purchaseorders.js | 12 +++++ src/routes/inventory/shipments.js | 12 +++++ src/routes/inventory/stockaudits.js | 12 +++++ src/routes/inventory/stockevents.js | 12 +++++ src/routes/management/auditlogs.js | 12 +++++ src/routes/management/courier.js | 12 +++++ src/routes/management/courierservice.js | 12 +++++ src/routes/management/documentjobs.js | 12 +++++ src/routes/management/documentprinters.js | 12 +++++ src/routes/management/documentsizes.js | 12 +++++ src/routes/management/documenttemplates.js | 12 +++++ src/routes/management/filaments.js | 12 +++++ src/routes/management/files.js | 12 +++++ src/routes/management/hosts.js | 12 +++++ src/routes/management/materials.js | 12 +++++ src/routes/management/notetypes.js | 12 +++++ src/routes/management/parts.js | 12 +++++ src/routes/management/products.js | 12 +++++ src/routes/management/taxrates.js | 12 +++++ src/routes/management/taxrecords.js | 12 +++++ src/routes/management/users.js | 12 +++++ src/routes/management/vendors.js | 12 +++++ src/routes/misc/notes.js | 15 ++++++- src/routes/production/gcodefiles.js | 6 +++ src/routes/production/jobs.js | 16 ++++--- src/routes/production/printers.js | 6 +++ src/routes/production/subjobs.js | 12 +++++ src/services/inventory/filamentstocks.js | 26 ++++++++++- src/services/inventory/orderitems.js | 40 ++++++++++++++--- src/services/inventory/partstocks.js | 26 ++++++++++- src/services/inventory/purchaseorders.js | 32 +++++++++++--- src/services/inventory/shipments.js | 26 ++++++++++- src/services/inventory/stockaudits.js | 25 ++++++++++- src/services/inventory/stockevents.js | 26 ++++++++++- src/services/management/auditlogs.js | 25 ++++++++++- src/services/management/courier.js | 26 ++++++++++- src/services/management/courierservice.js | 26 ++++++++++- src/services/management/documentjobs.js | 26 ++++++++++- src/services/management/documentprinters.js | 26 ++++++++++- src/services/management/documentsizes.js | 26 ++++++++++- src/services/management/documenttemplates.js | 26 ++++++++++- src/services/management/filaments.js | 34 +++++++++++++-- src/services/management/files.js | 26 ++++++++++- src/services/management/hosts.js | 26 ++++++++++- src/services/management/materials.js | 25 ++++++++++- src/services/management/notetypes.js | 26 ++++++++++- src/services/management/parts.js | 41 ++++++++++++++++- src/services/management/products.js | 26 ++++++++++- src/services/management/spotlight.js | 32 +++++++------- src/services/management/taxrates.js | 26 ++++++++++- src/services/management/taxrecords.js | 26 ++++++++++- src/services/management/users.js | 26 ++++++++++- src/services/management/vendors.js | 26 ++++++++++- src/services/misc/auth.js | 10 ++--- src/services/misc/model.js | 2 +- src/services/misc/notes.js | 28 +++++++++++- src/services/production/gcodefiles.js | 2 +- src/services/production/jobs.js | 46 ++++++++++---------- src/services/production/printers.js | 44 +++++++++---------- src/services/production/subjobs.js | 35 +++++++++++++-- 64 files changed, 1129 insertions(+), 119 deletions(-) diff --git a/src/keycloak.js b/src/keycloak.js index 4ff1feb..e31ac62 100644 --- a/src/keycloak.js +++ b/src/keycloak.js @@ -5,9 +5,9 @@ import axios from 'axios'; import jwt from 'jsonwebtoken'; import log4js from 'log4js'; import NodeCache from 'node-cache'; -import { userModel } from './schemas/management/user.schema.js'; +import { userModel } from './database/schemas/management/user.schema.js'; import { getObject } from './database/database.js'; -import { hostModel } from './schemas/management/host.schema.js'; +import { hostModel } from './database/schemas/management/host.schema.js'; dotenv.config(); const logger = log4js.getLogger('Keycloak'); diff --git a/src/routes/inventory/filamentstocks.js b/src/routes/inventory/filamentstocks.js index cc098f9..16f842c 100644 --- a/src/routes/inventory/filamentstocks.js +++ b/src/routes/inventory/filamentstocks.js @@ -10,6 +10,8 @@ import { newFilamentStockRouteHandler, deleteFilamentStockRouteHandler, listFilamentStocksByPropertiesRouteHandler, + getFilamentStockStatsRouteHandler, + getFilamentStockHistoryRouteHandler, } from '../../services/inventory/filamentstocks.js'; // list of filament stocks @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newFilamentStockRouteHandler(req, res); }); +// get filament stock stats +router.get('/stats', isAuthenticated, (req, res) => { + getFilamentStockStatsRouteHandler(req, res); +}); + +// get filament stock history +router.get('/history', isAuthenticated, (req, res) => { + getFilamentStockHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/orderitems.js b/src/routes/inventory/orderitems.js index b4a8679..21b9bc5 100644 --- a/src/routes/inventory/orderitems.js +++ b/src/routes/inventory/orderitems.js @@ -10,6 +10,8 @@ import { newOrderItemRouteHandler, deleteOrderItemRouteHandler, listOrderItemsByPropertiesRouteHandler, + getOrderItemStatsRouteHandler, + getOrderItemHistoryRouteHandler, } from '../../services/inventory/orderitems.js'; // list of order items @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newOrderItemRouteHandler(req, res); }); +// get order item stats +router.get('/stats', isAuthenticated, (req, res) => { + getOrderItemStatsRouteHandler(req, res); +}); + +// get order item history +router.get('/history', isAuthenticated, (req, res) => { + getOrderItemHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getOrderItemRouteHandler(req, res); }); diff --git a/src/routes/inventory/partstocks.js b/src/routes/inventory/partstocks.js index 8854456..43e1128 100644 --- a/src/routes/inventory/partstocks.js +++ b/src/routes/inventory/partstocks.js @@ -10,6 +10,8 @@ import { newPartStockRouteHandler, deletePartStockRouteHandler, listPartStocksByPropertiesRouteHandler, + getPartStockStatsRouteHandler, + getPartStockHistoryRouteHandler, } from '../../services/inventory/partstocks.js'; // list of part stocks @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newPartStockRouteHandler(req, res); }); +// get part stock stats +router.get('/stats', isAuthenticated, (req, res) => { + getPartStockStatsRouteHandler(req, res); +}); + +// get part stock history +router.get('/history', isAuthenticated, (req, res) => { + getPartStockHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPartStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/purchaseorders.js b/src/routes/inventory/purchaseorders.js index 309fbbe..4459969 100644 --- a/src/routes/inventory/purchaseorders.js +++ b/src/routes/inventory/purchaseorders.js @@ -10,6 +10,8 @@ import { newPurchaseOrderRouteHandler, deletePurchaseOrderRouteHandler, listPurchaseOrdersByPropertiesRouteHandler, + getPurchaseOrderStatsRouteHandler, + getPurchaseOrderHistoryRouteHandler, } from '../../services/inventory/purchaseorders.js'; // list of purchase orders @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newPurchaseOrderRouteHandler(req, res); }); +// get purchase order stats +router.get('/stats', isAuthenticated, (req, res) => { + getPurchaseOrderStatsRouteHandler(req, res); +}); + +// get purchase order history +router.get('/history', isAuthenticated, (req, res) => { + getPurchaseOrderHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPurchaseOrderRouteHandler(req, res); }); diff --git a/src/routes/inventory/shipments.js b/src/routes/inventory/shipments.js index 2023298..fbed4a4 100644 --- a/src/routes/inventory/shipments.js +++ b/src/routes/inventory/shipments.js @@ -10,6 +10,8 @@ import { newShipmentRouteHandler, deleteShipmentRouteHandler, listShipmentsByPropertiesRouteHandler, + getShipmentStatsRouteHandler, + getShipmentHistoryRouteHandler, } from '../../services/inventory/shipments.js'; // list of shipments @@ -49,6 +51,16 @@ router.post('/', isAuthenticated, (req, res) => { newShipmentRouteHandler(req, res); }); +// get shipment stats +router.get('/stats', isAuthenticated, (req, res) => { + getShipmentStatsRouteHandler(req, res); +}); + +// get shipment history +router.get('/history', isAuthenticated, (req, res) => { + getShipmentHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getShipmentRouteHandler(req, res); }); diff --git a/src/routes/inventory/stockaudits.js b/src/routes/inventory/stockaudits.js index 1c0dd9e..72fbf04 100644 --- a/src/routes/inventory/stockaudits.js +++ b/src/routes/inventory/stockaudits.js @@ -9,6 +9,8 @@ import { newStockAuditRouteHandler, updateStockAuditRouteHandler, deleteStockAuditRouteHandler, + getStockAuditStatsRouteHandler, + getStockAuditHistoryRouteHandler, } from '../../services/inventory/stockaudits.js'; // List stock audits @@ -36,6 +38,16 @@ router.post('/', isAuthenticated, (req, res) => { newStockAuditRouteHandler(req, res); }); +// get stock audit stats +router.get('/stats', isAuthenticated, (req, res) => { + getStockAuditStatsRouteHandler(req, res); +}); + +// get stock audit history +router.get('/history', isAuthenticated, (req, res) => { + getStockAuditHistoryRouteHandler(req, res); +}); + // Get specific stock audit router.get('/:id', isAuthenticated, (req, res) => { getStockAuditRouteHandler(req, res); diff --git a/src/routes/inventory/stockevents.js b/src/routes/inventory/stockevents.js index 55ee555..232fceb 100644 --- a/src/routes/inventory/stockevents.js +++ b/src/routes/inventory/stockevents.js @@ -10,6 +10,8 @@ import { editStockEventRouteHandler, deleteStockEventRouteHandler, listStockEventsByPropertiesRouteHandler, + getStockEventStatsRouteHandler, + getStockEventHistoryRouteHandler, } from '../../services/inventory/stockevents.js'; // list of stock events @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newStockEventRouteHandler(req, res); }); +// get stock event stats +router.get('/stats', isAuthenticated, (req, res) => { + getStockEventStatsRouteHandler(req, res); +}); + +// get stock event history +router.get('/history', isAuthenticated, (req, res) => { + getStockEventHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getStockEventRouteHandler(req, res); }); diff --git a/src/routes/management/auditlogs.js b/src/routes/management/auditlogs.js index e4d91f2..26a3acc 100644 --- a/src/routes/management/auditlogs.js +++ b/src/routes/management/auditlogs.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { listAuditLogsRouteHandler, getAuditLogRouteHandler, + getAuditLogStatsRouteHandler, + getAuditLogHistoryRouteHandler, } from '../../services/management/auditlogs.js'; import { parseFilter } from '../../utils.js'; @@ -27,6 +29,16 @@ router.get('/', isAuthenticated, async (req, res) => { listAuditLogsRouteHandler(req, res, page, limit, filter, sort, order); }); +// get audit log stats +router.get('/stats', isAuthenticated, (req, res) => { + getAuditLogStatsRouteHandler(req, res); +}); + +// get audit log history +router.get('/history', isAuthenticated, (req, res) => { + getAuditLogHistoryRouteHandler(req, res); +}); + /** * @route GET /api/auditlogs/:id * @desc Get a single audit log by ID diff --git a/src/routes/management/courier.js b/src/routes/management/courier.js index cbbd419..e6c2f90 100644 --- a/src/routes/management/courier.js +++ b/src/routes/management/courier.js @@ -10,6 +10,8 @@ import { newCourierRouteHandler, deleteCourierRouteHandler, listCouriersByPropertiesRouteHandler, + getCourierStatsRouteHandler, + getCourierHistoryRouteHandler, } from '../../services/management/courier.js'; // list of couriers @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newCourierRouteHandler(req, res); }); +// get courier stats +router.get('/stats', isAuthenticated, (req, res) => { + getCourierStatsRouteHandler(req, res); +}); + +// get courier history +router.get('/history', isAuthenticated, (req, res) => { + getCourierHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getCourierRouteHandler(req, res); }); diff --git a/src/routes/management/courierservice.js b/src/routes/management/courierservice.js index 9a713a1..46e3f54 100644 --- a/src/routes/management/courierservice.js +++ b/src/routes/management/courierservice.js @@ -10,6 +10,8 @@ import { newCourierServiceRouteHandler, deleteCourierServiceRouteHandler, listCourierServicesByPropertiesRouteHandler, + getCourierServiceStatsRouteHandler, + getCourierServiceHistoryRouteHandler, } from '../../services/management/courierservice.js'; // list of courier services @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newCourierServiceRouteHandler(req, res); }); +// get courier service stats +router.get('/stats', isAuthenticated, (req, res) => { + getCourierServiceStatsRouteHandler(req, res); +}); + +// get courierservice history +router.get('/history', isAuthenticated, (req, res) => { + getCourierServiceHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getCourierServiceRouteHandler(req, res); }); diff --git a/src/routes/management/documentjobs.js b/src/routes/management/documentjobs.js index 46986f5..11caae8 100644 --- a/src/routes/management/documentjobs.js +++ b/src/routes/management/documentjobs.js @@ -10,6 +10,8 @@ import { newDocumentJobRouteHandler, deleteDocumentJobRouteHandler, listDocumentJobsByPropertiesRouteHandler, + getDocumentJobStatsRouteHandler, + getDocumentJobHistoryRouteHandler, } from '../../services/management/documentjobs.js'; // list of document jobs @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newDocumentJobRouteHandler(req, res); }); +// get document job stats +router.get('/stats', isAuthenticated, (req, res) => { + getDocumentJobStatsRouteHandler(req, res); +}); + +// get documentjobs history +router.get('/history', isAuthenticated, (req, res) => { + getDocumentJobHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentJobRouteHandler(req, res); }); diff --git a/src/routes/management/documentprinters.js b/src/routes/management/documentprinters.js index a70ad71..8bb2ea2 100644 --- a/src/routes/management/documentprinters.js +++ b/src/routes/management/documentprinters.js @@ -10,6 +10,8 @@ import { newDocumentPrinterRouteHandler, deleteDocumentPrinterRouteHandler, listDocumentPrintersByPropertiesRouteHandler, + getDocumentPrinterStatsRouteHandler, + getDocumentPrinterHistoryRouteHandler, } from '../../services/management/documentprinters.js'; // list of document printers @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newDocumentPrinterRouteHandler(req, res); }); +// get document printer stats +router.get('/stats', isAuthenticated, (req, res) => { + getDocumentPrinterStatsRouteHandler(req, res); +}); + +// get documentprinters history +router.get('/history', isAuthenticated, (req, res) => { + getDocumentPrinterHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentPrinterRouteHandler(req, res); }); diff --git a/src/routes/management/documentsizes.js b/src/routes/management/documentsizes.js index a398a10..b06afb6 100644 --- a/src/routes/management/documentsizes.js +++ b/src/routes/management/documentsizes.js @@ -10,6 +10,8 @@ import { newDocumentSizeRouteHandler, deleteDocumentSizeRouteHandler, listDocumentSizesByPropertiesRouteHandler, + getDocumentSizeStatsRouteHandler, + getDocumentSizeHistoryRouteHandler, } from '../../services/management/documentsizes.js'; // list of document sizes @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newDocumentSizeRouteHandler(req, res); }); +// get document size stats +router.get('/stats', isAuthenticated, (req, res) => { + getDocumentSizeStatsRouteHandler(req, res); +}); + +// get documentsizes history +router.get('/history', isAuthenticated, (req, res) => { + getDocumentSizeHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentSizeRouteHandler(req, res); }); diff --git a/src/routes/management/documenttemplates.js b/src/routes/management/documenttemplates.js index 82fdc91..1acfa13 100644 --- a/src/routes/management/documenttemplates.js +++ b/src/routes/management/documenttemplates.js @@ -10,6 +10,8 @@ import { newDocumentTemplateRouteHandler, deleteDocumentTemplateRouteHandler, listDocumentTemplatesByPropertiesRouteHandler, + getDocumentTemplateStatsRouteHandler, + getDocumentTemplateHistoryRouteHandler, } from '../../services/management/documenttemplates.js'; // list of document templates @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newDocumentTemplateRouteHandler(req, res); }); +// get document template stats +router.get('/stats', isAuthenticated, (req, res) => { + getDocumentTemplateStatsRouteHandler(req, res); +}); + +// get document template history +router.get('/history', isAuthenticated, (req, res) => { + getDocumentTemplateHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentTemplateRouteHandler(req, res); }); diff --git a/src/routes/management/filaments.js b/src/routes/management/filaments.js index 5b2d1bd..9638922 100644 --- a/src/routes/management/filaments.js +++ b/src/routes/management/filaments.js @@ -9,6 +9,8 @@ import { getFilamentRouteHandler, editFilamentRouteHandler, newFilamentRouteHandler, + getFilamentStatsRouteHandler, + getFilamentHistoryRouteHandler, } from '../../services/management/filaments.js'; // list of filaments @@ -50,6 +52,16 @@ router.post('/', isAuthenticated, (req, res) => { newFilamentRouteHandler(req, res); }); +// get filament stats +router.get('/stats', isAuthenticated, (req, res) => { + getFilamentStatsRouteHandler(req, res); +}); + +// get filaments history +router.get('/history', isAuthenticated, (req, res) => { + getFilamentHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentRouteHandler(req, res); }); diff --git a/src/routes/management/files.js b/src/routes/management/files.js index d500da5..f44208a 100644 --- a/src/routes/management/files.js +++ b/src/routes/management/files.js @@ -12,6 +12,8 @@ import { flushFileRouteHandler, deleteFileRouteHandler, listFilesByPropertiesRouteHandler, + getFileStatsRouteHandler, + getFileHistoryRouteHandler, } from '../../services/management/files.js'; // list of files @@ -33,6 +35,16 @@ router.post('/', isAuthenticated, (req, res) => { newFileRouteHandler(req, res); }); +// get file stats +router.get('/stats', isAuthenticated, (req, res) => { + getFileStatsRouteHandler(req, res); +}); + +// get file history +router.get('/history', isAuthenticated, (req, res) => { + getFileHistoryRouteHandler(req, res); +}); + router.delete('/:id/flush', isAuthenticated, (req, res) => { flushFileRouteHandler(req, res); }); diff --git a/src/routes/management/hosts.js b/src/routes/management/hosts.js index 8d0a72e..a7eeb64 100644 --- a/src/routes/management/hosts.js +++ b/src/routes/management/hosts.js @@ -10,6 +10,8 @@ import { newHostRouteHandler, deleteHostRouteHandler, listHostsByPropertiesRouteHandler, + getHostStatsRouteHandler, + getHostHistoryRouteHandler, } from '../../services/management/hosts.js'; // list of hosts @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newHostRouteHandler(req, res); }); +// get host stats +router.get('/stats', isAuthenticated, (req, res) => { + getHostStatsRouteHandler(req, res); +}); + +// get hosts history +router.get('/history', isAuthenticated, (req, res) => { + getHostHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getHostRouteHandler(req, res); }); diff --git a/src/routes/management/materials.js b/src/routes/management/materials.js index dfbbe5f..c0c45d1 100644 --- a/src/routes/management/materials.js +++ b/src/routes/management/materials.js @@ -8,6 +8,8 @@ import { getMaterialRouteHandler, editMaterialRouteHandler, newMaterialRouteHandler, + getMaterialStatsRouteHandler, + getMaterialHistoryRouteHandler, } from '../../services/management/materials.js'; // list of materials @@ -34,6 +36,16 @@ router.post('/', isAuthenticated, (req, res) => { newMaterialRouteHandler(req, res); }); +// get material stats +router.get('/stats', isAuthenticated, (req, res) => { + getMaterialStatsRouteHandler(req, res); +}); + +// get materials history +router.get('/history', isAuthenticated, (req, res) => { + getMaterialHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getMaterialRouteHandler(req, res); }); diff --git a/src/routes/management/notetypes.js b/src/routes/management/notetypes.js index 2bef138..3385fc6 100644 --- a/src/routes/management/notetypes.js +++ b/src/routes/management/notetypes.js @@ -10,6 +10,8 @@ import { newNoteTypeRouteHandler, deleteNoteTypeRouteHandler, listNoteTypesByPropertiesRouteHandler, + getNoteTypeStatsRouteHandler, + getNoteTypeHistoryRouteHandler, } from '../../services/management/notetypes.js'; // list of note types @@ -35,6 +37,16 @@ router.post('/', isAuthenticated, (req, res) => { newNoteTypeRouteHandler(req, res); }); +// get note type stats +router.get('/stats', isAuthenticated, (req, res) => { + getNoteTypeStatsRouteHandler(req, res); +}); + +// get notetypes history +router.get('/history', isAuthenticated, (req, res) => { + getNoteTypeHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getNoteTypeRouteHandler(req, res); }); diff --git a/src/routes/management/parts.js b/src/routes/management/parts.js index 2e47831..d8d4c03 100644 --- a/src/routes/management/parts.js +++ b/src/routes/management/parts.js @@ -10,6 +10,8 @@ import { newPartRouteHandler, deletePartRouteHandler, listPartsByPropertiesRouteHandler, + getPartStatsRouteHandler, + getPartHistoryRouteHandler, } from '../../services/management/parts.js'; // list of parts @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newPartRouteHandler(req, res); }); +// get part stats +router.get('/stats', isAuthenticated, (req, res) => { + getPartStatsRouteHandler(req, res); +}); + +// get parts history +router.get('/history', isAuthenticated, (req, res) => { + getPartHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPartRouteHandler(req, res); }); diff --git a/src/routes/management/products.js b/src/routes/management/products.js index 64b51fd..4276d82 100644 --- a/src/routes/management/products.js +++ b/src/routes/management/products.js @@ -10,6 +10,8 @@ import { newProductRouteHandler, deleteProductRouteHandler, listProductsByPropertiesRouteHandler, + getProductStatsRouteHandler, + getProductHistoryRouteHandler, } from '../../services/management/products.js'; // list of products @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newProductRouteHandler(req, res); }); +// get product stats +router.get('/stats', isAuthenticated, (req, res) => { + getProductStatsRouteHandler(req, res); +}); + +// get products history +router.get('/history', isAuthenticated, (req, res) => { + getProductHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getProductRouteHandler(req, res); }); diff --git a/src/routes/management/taxrates.js b/src/routes/management/taxrates.js index 38b6553..250bdd1 100644 --- a/src/routes/management/taxrates.js +++ b/src/routes/management/taxrates.js @@ -10,6 +10,8 @@ import { newTaxRateRouteHandler, deleteTaxRateRouteHandler, listTaxRatesByPropertiesRouteHandler, + getTaxRateStatsRouteHandler, + getTaxRateHistoryRouteHandler, } from '../../services/management/taxrates.js'; // list of tax rates @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newTaxRateRouteHandler(req, res); }); +// get tax rate stats +router.get('/stats', isAuthenticated, (req, res) => { + getTaxRateStatsRouteHandler(req, res); +}); + +// get tax rate history +router.get('/history', isAuthenticated, (req, res) => { + getTaxRateHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getTaxRateRouteHandler(req, res); }); diff --git a/src/routes/management/taxrecords.js b/src/routes/management/taxrecords.js index a078ac1..0838679 100644 --- a/src/routes/management/taxrecords.js +++ b/src/routes/management/taxrecords.js @@ -10,6 +10,8 @@ import { newTaxRecordRouteHandler, deleteTaxRecordRouteHandler, listTaxRecordsByPropertiesRouteHandler, + getTaxRecordStatsRouteHandler, + getTaxRecordHistoryRouteHandler, } from '../../services/management/taxrecords.js'; // list of tax records @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newTaxRecordRouteHandler(req, res); }); +// get tax record stats +router.get('/stats', isAuthenticated, (req, res) => { + getTaxRecordStatsRouteHandler(req, res); +}); + +// get tax record history +router.get('/history', isAuthenticated, (req, res) => { + getTaxRecordHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getTaxRecordRouteHandler(req, res); }); diff --git a/src/routes/management/users.js b/src/routes/management/users.js index ac15246..9a1dae6 100644 --- a/src/routes/management/users.js +++ b/src/routes/management/users.js @@ -8,6 +8,8 @@ import { listUsersByPropertiesRouteHandler, getUserRouteHandler, editUserRouteHandler, + getUserStatsRouteHandler, + getUserHistoryRouteHandler, } from '../../services/management/users.js'; // list of document templates @@ -29,6 +31,16 @@ router.get('/properties', isAuthenticated, (req, res) => { listUsersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); +// get user stats +router.get('/stats', isAuthenticated, (req, res) => { + getUserStatsRouteHandler(req, res); +}); + +// get user history +router.get('/history', isAuthenticated, (req, res) => { + getUserHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getUserRouteHandler(req, res); }); diff --git a/src/routes/management/vendors.js b/src/routes/management/vendors.js index 53d057b..259ccbd 100644 --- a/src/routes/management/vendors.js +++ b/src/routes/management/vendors.js @@ -10,6 +10,8 @@ import { newVendorRouteHandler, deleteVendorRouteHandler, listVendorsByPropertiesRouteHandler, + getVendorStatsRouteHandler, + getVendorHistoryRouteHandler, } from '../../services/management/vendors.js'; // list of vendors @@ -31,6 +33,16 @@ router.post('/', isAuthenticated, (req, res) => { newVendorRouteHandler(req, res); }); +// get vendor stats +router.get('/stats', isAuthenticated, (req, res) => { + getVendorStatsRouteHandler(req, res); +}); + +// get vendors history +router.get('/history', isAuthenticated, (req, res) => { + getVendorHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getVendorRouteHandler(req, res); }); diff --git a/src/routes/misc/notes.js b/src/routes/misc/notes.js index e9090af..b34d900 100644 --- a/src/routes/misc/notes.js +++ b/src/routes/misc/notes.js @@ -6,8 +6,11 @@ import { editNoteRouteHandler, newNoteRouteHandler, deleteNoteRouteHandler, + listNotesByPropertiesRouteHandler, + getNoteStatsRouteHandler, + getNoteHistoryRouteHandler, } from '../../services/misc/notes.js'; -import { getFilter } from '../../utils.js'; +import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); @@ -31,6 +34,16 @@ router.post('/', isAuthenticated, (req, res) => { newNoteRouteHandler(req, res); }); +// get note stats +router.get('/stats', isAuthenticated, (req, res) => { + getNoteStatsRouteHandler(req, res); +}); + +// get note history +router.get('/history', isAuthenticated, (req, res) => { + getNoteHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getNoteRouteHandler(req, res); }); diff --git a/src/routes/production/gcodefiles.js b/src/routes/production/gcodefiles.js index 463d7fe..5fdc821 100644 --- a/src/routes/production/gcodefiles.js +++ b/src/routes/production/gcodefiles.js @@ -9,6 +9,7 @@ import { newGCodeFileRouteHandler, listGCodeFilesByPropertiesRouteHandler, getGCodeFileContentRouteHandler, + getGCodeFileStatsRouteHandler, } from '../../services/production/gcodefiles.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; @@ -32,6 +33,11 @@ router.post('/', isAuthenticated, (req, res) => { newGCodeFileRouteHandler(req, res); }); +// get gcodeFile stats +router.get('/stats', isAuthenticated, (req, res) => { + getGCodeFileStatsRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getGCodeFileRouteHandler(req, res); }); diff --git a/src/routes/production/jobs.js b/src/routes/production/jobs.js index 197278b..412bdd8 100644 --- a/src/routes/production/jobs.js +++ b/src/routes/production/jobs.js @@ -9,6 +9,7 @@ import { newJobRouteHandler, deleteJobRouteHandler, getJobStatsRouteHandler, + getJobHistoryRouteHandler, } from '../../services/production/jobs.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; @@ -31,6 +32,16 @@ router.post('/', isAuthenticated, (req, res) => { newJobRouteHandler(req, res); }); +// get job stats +router.get('/stats', isAuthenticated, (req, res) => { + getJobStatsRouteHandler(req, res); +}); + +// get job history +router.get('/history', isAuthenticated, (req, res) => { + getJobHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getJobRouteHandler(req, res); }); @@ -39,9 +50,4 @@ router.delete('/:id', isAuthenticated, async (req, res) => { deleteJobRouteHandler(req, res); }); -// get printer stats -router.get('/stats', isAuthenticated, (req, res) => { - getJobStatsRouteHandler(req, res); -}); - export default router; diff --git a/src/routes/production/printers.js b/src/routes/production/printers.js index c2c7480..0810aec 100644 --- a/src/routes/production/printers.js +++ b/src/routes/production/printers.js @@ -9,6 +9,7 @@ import { newPrinterRouteHandler, getPrinterStatsRouteHandler, listPrintersByPropertiesRouteHandler, + getPrinterHistoryRouteHandler, } from '../../services/production/printers.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; @@ -32,6 +33,11 @@ router.post('/', isAuthenticated, (req, res) => { newPrinterRouteHandler(req, res); }); +// get printer history +router.get('/history', isAuthenticated, (req, res) => { + getPrinterHistoryRouteHandler(req, res); +}); + // get printer stats router.get('/stats', isAuthenticated, (req, res) => { getPrinterStatsRouteHandler(req, res); diff --git a/src/routes/production/subjobs.js b/src/routes/production/subjobs.js index 655c00f..be3075f 100644 --- a/src/routes/production/subjobs.js +++ b/src/routes/production/subjobs.js @@ -6,6 +6,8 @@ import { listSubJobsRouteHandler, listSubJobsByPropertiesRouteHandler, getSubJobRouteHandler, + getSubJobStatsRouteHandler, + getSubJobHistoryRouteHandler, } from '../../services/production/subjobs.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; @@ -24,6 +26,16 @@ router.get('/properties', isAuthenticated, (req, res) => { listSubJobsByPropertiesRouteHandler(req, res, properties, filter); }); +// get sub job stats +router.get('/stats', isAuthenticated, (req, res) => { + getSubJobStatsRouteHandler(req, res); +}); + +// get sub job history +router.get('/history', isAuthenticated, (req, res) => { + getSubJobHistoryRouteHandler(req, res); +}); + router.get('/:id', isAuthenticated, (req, res) => { getSubJobRouteHandler(req, res); }); diff --git a/src/services/inventory/filamentstocks.js b/src/services/inventory/filamentstocks.js index edbcce9..e5065a5 100644 --- a/src/services/inventory/filamentstocks.js +++ b/src/services/inventory/filamentstocks.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { filamentStockModel } from '../../schemas/inventory/filamentstock.schema.js'; +import { filamentStockModel } from '../../database/schemas/inventory/filamentstock.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -157,3 +159,25 @@ export const deleteFilamentStockRouteHandler = async (req, res) => { res.send(result); }; + +export const getFilamentStockStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: filamentStockModel }); + if (result?.error) { + logger.error('Error fetching filament stock stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Filament stock stats:', result); + res.send(result); +}; + +export const getFilamentStockHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: filamentStockModel, from, to }); + if (result?.error) { + logger.error('Error fetching filament stock history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Filament stock history:', result); + res.send(result); +}; diff --git a/src/services/inventory/orderitems.js b/src/services/inventory/orderitems.js index 3e7afeb..d269030 100644 --- a/src/services/inventory/orderitems.js +++ b/src/services/inventory/orderitems.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { orderItemModel } from '../../schemas/inventory/orderitem.schema.js'; +import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -45,11 +47,11 @@ export const listOrderItemsRouteHandler = async ( }, { path: 'item', - populate: { path: 'costTaxRate' }, + populate: { path: 'costTaxRate', strictPopulate: false }, }, { path: 'item', - populate: { path: 'priceTaxRate' }, + populate: { path: 'priceTaxRate', strictPopulate: false }, }, ], }); @@ -104,11 +106,13 @@ export const getOrderItemRouteHandler = async (req, res) => { }, { path: 'item', - populate: { path: 'costTaxRate' }, + populate: { path: 'costTaxRate', strictPopulate: false }, + strictPopulate: false, }, { path: 'item', - populate: { path: 'priceTaxRate' }, + populate: { path: 'priceTaxRate', strictPopulate: false }, + strictPopulate: false, }, ], }); @@ -128,9 +132,10 @@ export const editOrderItemRouteHandler = async (req, res) => { const updateData = { updatedAt: new Date(), - purchaseOrder: req.body.purchaseOrder, itemType: req.body.itemType, item: req.body.item, + orderType: req.body.orderType, + order: req.body.order, syncAmount: req.body.syncAmount, itemAmount: req.body.itemAmount, quantity: req.body.quantity, @@ -161,6 +166,7 @@ export const newOrderItemRouteHandler = async (req, res) => { const newData = { updatedAt: new Date(), purchaseOrder: req.body.purchaseOrder, + state: { type: 'draft' }, itemType: req.body.itemType, item: req.body.item, orderType: req.body.orderType, @@ -207,3 +213,25 @@ export const deleteOrderItemRouteHandler = async (req, res) => { res.send(result); }; + +export const getOrderItemStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: orderItemModel }); + if (result?.error) { + logger.error('Error fetching order item stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Order item stats:', result); + res.send(result); +}; + +export const getOrderItemHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: orderItemModel, from, to }); + if (result?.error) { + logger.error('Error fetching order item history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Order item history:', result); + res.send(result); +}; diff --git a/src/services/inventory/partstocks.js b/src/services/inventory/partstocks.js index ff94682..27fc6e6 100644 --- a/src/services/inventory/partstocks.js +++ b/src/services/inventory/partstocks.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { partStockModel } from '../../schemas/inventory/partstock.schema.js'; +import { partStockModel } from '../../database/schemas/inventory/partstock.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -157,3 +159,25 @@ export const deletePartStockRouteHandler = async (req, res) => { res.send(result); }; + +export const getPartStockStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: partStockModel }); + if (result?.error) { + logger.error('Error fetching part stock stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Part stock stats:', result); + res.send(result); +}; + +export const getPartStockHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: partStockModel, from, to }); + if (result?.error) { + logger.error('Error fetching part stock history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Part stock history:', result); + res.send(result); +}; diff --git a/src/services/inventory/purchaseorders.js b/src/services/inventory/purchaseorders.js index cc28868..6fdf20b 100644 --- a/src/services/inventory/purchaseorders.js +++ b/src/services/inventory/purchaseorders.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { purchaseOrderModel } from '../../schemas/inventory/purchaseorder.schema.js'; +import { purchaseOrderModel } from '../../database/schemas/inventory/purchaseorder.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -78,7 +80,7 @@ export const getPurchaseOrderRouteHandler = async (req, res) => { const result = await getObject({ model: purchaseOrderModel, id, - populate: ['vendor', 'items.item', 'items.taxRate'], + populate: ['vendor'], }); if (result?.error) { logger.warn(`Purchase Order not found with supplied id.`); @@ -97,8 +99,6 @@ export const editPurchaseOrderRouteHandler = async (req, res) => { const updateData = { updatedAt: new Date(), vendor: req.body.vendor, - items: req.body.items, - cost: req.body.cost, }; // Create audit log before updating const result = await editObject({ @@ -123,8 +123,6 @@ export const newPurchaseOrderRouteHandler = async (req, res) => { const newData = { updatedAt: new Date(), vendor: req.body.vendor, - items: req.body.items, - cost: req.body.cost, }; const result = await newObject({ model: purchaseOrderModel, @@ -161,3 +159,25 @@ export const deletePurchaseOrderRouteHandler = async (req, res) => { res.send(result); }; + +export const getPurchaseOrderStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: purchaseOrderModel }); + if (result?.error) { + logger.error('Error fetching purchase order stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Purchase order stats:', result); + res.send(result); +}; + +export const getPurchaseOrderHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: purchaseOrderModel, from, to }); + if (result?.error) { + logger.error('Error fetching purchase order history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Purchase order history:', result); + res.send(result); +}; diff --git a/src/services/inventory/shipments.js b/src/services/inventory/shipments.js index 6c8923a..a2979ea 100644 --- a/src/services/inventory/shipments.js +++ b/src/services/inventory/shipments.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { shipmentModel } from '../../schemas/inventory/shipment.schema.js'; +import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -175,3 +177,25 @@ export const deleteShipmentRouteHandler = async (req, res) => { res.send(result); }; + +export const getShipmentStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: shipmentModel }); + if (result?.error) { + logger.error('Error fetching shipment stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Shipment stats:', result); + res.send(result); +}; + +export const getShipmentHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: shipmentModel, from, to }); + if (result?.error) { + logger.error('Error fetching shipment history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Shipment history:', result); + res.send(result); +}; diff --git a/src/services/inventory/stockaudits.js b/src/services/inventory/stockaudits.js index e9506ea..6dec8d0 100644 --- a/src/services/inventory/stockaudits.js +++ b/src/services/inventory/stockaudits.js @@ -1,8 +1,9 @@ import dotenv from 'dotenv'; -import { stockAuditModel } from '../../schemas/inventory/stockaudit.schema.js'; +import { stockAuditModel } from '../../database/schemas/inventory/stockaudit.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { getAuditLogs } from '../../utils.js'; +import { getModelStats, getModelHistory } from '../../database/database.js'; dotenv.config(); @@ -168,3 +169,25 @@ export const deleteStockAuditRouteHandler = async (req, res) => { res.status(500).send({ error: error.message }); } }; + +export const getStockAuditStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: stockAuditModel }); + if (result?.error) { + logger.error('Error fetching stock audit stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Stock audit stats:', result); + res.send(result); +}; + +export const getStockAuditHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: stockAuditModel, from, to }); + if (result?.error) { + logger.error('Error fetching stock audit history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Stock audit history:', result); + res.send(result); +}; diff --git a/src/services/inventory/stockevents.js b/src/services/inventory/stockevents.js index 78b2f90..7b3d885 100644 --- a/src/services/inventory/stockevents.js +++ b/src/services/inventory/stockevents.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { stockEventModel } from '../../schemas/inventory/stockevent.schema.js'; +import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -165,3 +167,25 @@ export const deleteStockEventRouteHandler = async (req, res) => { res.send(result); }; + +export const getStockEventStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: stockEventModel }); + if (result?.error) { + logger.error('Error fetching stock event stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Stock event stats:', result); + res.send(result); +}; + +export const getStockEventHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: stockEventModel, from, to }); + if (result?.error) { + logger.error('Error fetching stock event history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Stock event history:', result); + res.send(result); +}; diff --git a/src/services/management/auditlogs.js b/src/services/management/auditlogs.js index de68b80..c8e7570 100644 --- a/src/services/management/auditlogs.js +++ b/src/services/management/auditlogs.js @@ -1,7 +1,8 @@ import dotenv from 'dotenv'; -import { auditLogModel } from '../../schemas/management/auditlog.schema.js'; +import { auditLogModel } from '../../database/schemas/management/auditlog.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; +import { getModelStats, getModelHistory } from '../../database/database.js'; dotenv.config(); const logger = log4js.getLogger('AuditLogs'); @@ -88,3 +89,25 @@ export const getAuditLogRouteHandler = async (req, res) => { res.status(500).send({ error: error.message }); } }; + +export const getAuditLogStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: auditLogModel }); + if (result?.error) { + logger.error('Error fetching audit log stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Audit log stats:', result); + res.send(result); +}; + +export const getAuditLogHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: auditLogModel, from, to }); + if (result?.error) { + logger.error('Error fetching audit log history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Audit log history:', result); + res.send(result); +}; diff --git a/src/services/management/courier.js b/src/services/management/courier.js index 148cd12..3e6874a 100644 --- a/src/services/management/courier.js +++ b/src/services/management/courier.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { courierModel } from '../../schemas/management/courier.schema.js'; +import { courierModel } from '../../database/schemas/management/courier.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -162,3 +164,25 @@ export const deleteCourierRouteHandler = async (req, res) => { res.send(result); }; + +export const getCourierStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: courierModel }); + if (result?.error) { + logger.error('Error fetching courier stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Courier stats:', result); + res.send(result); +}; + +export const getCourierHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: courierModel, from, to }); + if (result?.error) { + logger.error('Error fetching courier history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Courier history:', result); + res.send(result); +}; diff --git a/src/services/management/courierservice.js b/src/services/management/courierservice.js index 47eae07..d880961 100644 --- a/src/services/management/courierservice.js +++ b/src/services/management/courierservice.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { courierServiceModel } from '../../schemas/management/courierservice.schema.js'; +import { courierServiceModel } from '../../database/schemas/management/courierservice.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -165,3 +167,25 @@ export const deleteCourierServiceRouteHandler = async (req, res) => { res.send(result); }; + +export const getCourierServiceStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: courierServiceModel }); + if (result?.error) { + logger.error('Error fetching courier service stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Courier service stats:', result); + res.send(result); +}; + +export const getCourierServiceHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: courierServiceModel, from, to }); + if (result?.error) { + logger.error('Error fetching courier service history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Courier service history:', result); + res.send(result); +}; diff --git a/src/services/management/documentjobs.js b/src/services/management/documentjobs.js index 38cdd2a..9f1afbf 100644 --- a/src/services/management/documentjobs.js +++ b/src/services/management/documentjobs.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { documentJobModel } from '../../schemas/management/documentjob.schema.js'; +import { documentJobModel } from '../../database/schemas/management/documentjob.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -158,3 +160,25 @@ export const deleteDocumentJobRouteHandler = async (req, res) => { res.send(result); }; + +export const getDocumentJobStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: documentJobModel }); + if (result?.error) { + logger.error('Error fetching document job stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document job stats:', result); + res.send(result); +}; + +export const getDocumentJobHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: documentJobModel, from, to }); + if (result?.error) { + logger.error('Error fetching document job history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document job history:', result); + res.send(result); +}; diff --git a/src/services/management/documentprinters.js b/src/services/management/documentprinters.js index 0e60d16..5269fa3 100644 --- a/src/services/management/documentprinters.js +++ b/src/services/management/documentprinters.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { documentPrinterModel } from '../../schemas/management/documentprinter.schema.js'; +import { documentPrinterModel } from '../../database/schemas/management/documentprinter.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -167,3 +169,25 @@ export const deleteDocumentPrinterRouteHandler = async (req, res) => { res.send(result); }; + +export const getDocumentPrinterStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: documentPrinterModel }); + if (result?.error) { + logger.error('Error fetching document printer stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document printer stats:', result); + res.send(result); +}; + +export const getDocumentPrinterHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: documentPrinterModel, from, to }); + if (result?.error) { + logger.error('Error fetching document printer history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document printer history:', result); + res.send(result); +}; diff --git a/src/services/management/documentsizes.js b/src/services/management/documentsizes.js index b167bd0..1dbd126 100644 --- a/src/services/management/documentsizes.js +++ b/src/services/management/documentsizes.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { documentSizeModel } from '../../schemas/management/documentsize.schema.js'; +import { documentSizeModel } from '../../database/schemas/management/documentsize.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -158,3 +160,25 @@ export const deleteDocumentSizeRouteHandler = async (req, res) => { res.send(result); }; + +export const getDocumentSizeStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: documentSizeModel }); + if (result?.error) { + logger.error('Error fetching document size stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document size stats:', result); + res.send(result); +}; + +export const getDocumentSizeHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: documentSizeModel, from, to }); + if (result?.error) { + logger.error('Error fetching document size history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document size history:', result); + res.send(result); +}; diff --git a/src/services/management/documenttemplates.js b/src/services/management/documenttemplates.js index 388c537..441ffb6 100644 --- a/src/services/management/documenttemplates.js +++ b/src/services/management/documenttemplates.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { documentTemplateModel } from '../../schemas/management/documenttemplate.schema.js'; +import { documentTemplateModel } from '../../database/schemas/management/documenttemplate.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -184,3 +186,25 @@ export const deleteDocumentTemplateRouteHandler = async (req, res) => { res.send(result); }; + +export const getDocumentTemplateStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: documentTemplateModel }); + if (result?.error) { + logger.error('Error fetching document template stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document template stats:', result); + res.send(result); +}; + +export const getDocumentTemplateHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: documentTemplateModel, from, to }); + if (result?.error) { + logger.error('Error fetching document template history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Document template history:', result); + res.send(result); +}; diff --git a/src/services/management/filaments.js b/src/services/management/filaments.js index 32df82f..144d14c 100644 --- a/src/services/management/filaments.js +++ b/src/services/management/filaments.js @@ -1,5 +1,5 @@ import dotenv, { populate } from 'dotenv'; -import { filamentModel } from '../../schemas/management/filament.schema.js'; +import { filamentModel } from '../../database/schemas/management/filament.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -8,6 +8,8 @@ import { listObjectsByProperties, editObject, newObject, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -34,7 +36,7 @@ export const listFilamentsRouteHandler = async ( search, sort, order, - populate: ['vendor'], + populate: ['vendor', 'costTaxRate'], }); if (result?.error) { @@ -75,7 +77,7 @@ export const getFilamentRouteHandler = async (req, res) => { const result = await getObject({ model: filamentModel, id, - populate: 'vendor', + populate: ['vendor', 'costTaxRate'], }); if (result?.error) { logger.warn(`Filament not found with supplied id.`); @@ -101,6 +103,8 @@ export const editFilamentRouteHandler = async (req, res) => { vendor: req.body.vendor, type: req.body.type, cost: req.body.cost, + costTaxRate: req.body.costTaxRate, + costWithTax: req.body.costWithTax, diameter: req.body.diameter, density: req.body.density, emptySpoolWeight: req.body.emptySpoolWeight, @@ -135,6 +139,8 @@ export const newFilamentRouteHandler = async (req, res) => { vendor: req.body.vendor, type: req.body.type, cost: req.body.cost, + costTaxRate: req.body.costTaxRate, + costWithTax: req.body.costWithTax, diameter: req.body.diameter, density: req.body.density, emptySpoolWeight: req.body.emptySpoolWeight, @@ -154,3 +160,25 @@ export const newFilamentRouteHandler = async (req, res) => { res.send(result); }; + +export const getFilamentStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: filamentModel }); + if (result?.error) { + logger.error('Error fetching filament stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Filament stats:', result); + res.send(result); +}; + +export const getFilamentHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: filamentModel, from, to }); + if (result?.error) { + logger.error('Error fetching filament history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Filament history:', result); + res.send(result); +}; diff --git a/src/services/management/files.js b/src/services/management/files.js index ccbbabf..8232488 100644 --- a/src/services/management/files.js +++ b/src/services/management/files.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { fileModel } from '../../schemas/management/file.schema.js'; +import { fileModel } from '../../database/schemas/management/file.schema.js'; import log4js from 'log4js'; import multer from 'multer'; import path from 'path'; @@ -13,6 +13,8 @@ import { newObject, listObjectsByProperties, flushFile, + getModelStats, + getModelHistory, } from '../../database/database.js'; import { uploadFile, @@ -421,3 +423,25 @@ export const parseFileHandler = async (req, res) => { res.status(500).send({ error: error.message }); } }; + +export const getFileStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: fileModel }); + if (result?.error) { + logger.error('Error fetching file stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('File stats:', result); + res.send(result); +}; + +export const getFileHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: fileModel, from, to }); + if (result?.error) { + logger.error('Error fetching file history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('File history:', result); + res.send(result); +}; diff --git a/src/services/management/hosts.js b/src/services/management/hosts.js index 30ecbc7..c234576 100644 --- a/src/services/management/hosts.js +++ b/src/services/management/hosts.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { hostModel } from '../../schemas/management/host.schema.js'; +import { hostModel } from '../../database/schemas/management/host.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -159,3 +161,25 @@ export const deleteHostRouteHandler = async (req, res) => { res.send(result); }; + +export const getHostStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: hostModel }); + if (result?.error) { + logger.error('Error fetching host stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Host stats:', result); + res.send(result); +}; + +export const getHostHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: hostModel, from, to }); + if (result?.error) { + logger.error('Error fetching host history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Host history:', result); + res.send(result); +}; diff --git a/src/services/management/materials.js b/src/services/management/materials.js index 7fc847d..a1ac97d 100644 --- a/src/services/management/materials.js +++ b/src/services/management/materials.js @@ -1,7 +1,8 @@ import dotenv from 'dotenv'; -import { materialModel } from '../../schemas/management/material.schema.js'; +import { materialModel } from '../../database/schemas/management/material.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; +import { getModelStats, getModelHistory } from '../../database/database.js'; dotenv.config(); const logger = log4js.getLogger('Materials'); @@ -128,3 +129,25 @@ export const newMaterialRouteHandler = async (req, res) => { res.status(500).send({ error: updateError.message }); } }; + +export const getMaterialStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: materialModel }); + if (result?.error) { + logger.error('Error fetching material stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Material stats:', result); + res.send(result); +}; + +export const getMaterialHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: materialModel, from, to }); + if (result?.error) { + logger.error('Error fetching material history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Material history:', result); + res.send(result); +}; diff --git a/src/services/management/notetypes.js b/src/services/management/notetypes.js index bcfa900..9fe3ae0 100644 --- a/src/services/management/notetypes.js +++ b/src/services/management/notetypes.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { noteTypeModel } from '../../schemas/management/notetype.schema.js'; +import { noteTypeModel } from '../../database/schemas/management/notetype.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -158,3 +160,25 @@ export const deleteNoteTypeRouteHandler = async (req, res) => { res.send(result); }; + +export const getNoteTypeStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: noteTypeModel }); + if (result?.error) { + logger.error('Error fetching note type stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Note type stats:', result); + res.send(result); +}; + +export const getNoteTypeHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: noteTypeModel, from, to }); + if (result?.error) { + logger.error('Error fetching note type history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Note type history:', result); + res.send(result); +}; diff --git a/src/services/management/parts.js b/src/services/management/parts.js index 6bc8ad5..c8ced61 100644 --- a/src/services/management/parts.js +++ b/src/services/management/parts.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { partModel } from '../../schemas/management/part.schema.js'; +import { partModel } from '../../database/schemas/management/part.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -53,7 +55,20 @@ export const listPartsByPropertiesRouteHandler = async (req, res, properties = ' model: partModel, properties, filter, - populate: ['vendor', 'priceTaxRate', 'costTaxRate'], + populate: [ + { + path: 'vendor', + from: 'vendors', + }, + { + path: 'priceTaxRate', + from: 'taxrates', + }, + { + path: 'costTaxRate', + from: 'taxrates', + }, + ], }); if (result?.error) { @@ -171,3 +186,25 @@ export const deletePartRouteHandler = async (req, res) => { res.send(result); }; + +export const getPartStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: partModel }); + if (result?.error) { + logger.error('Error fetching part stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Part stats:', result); + res.send(result); +}; + +export const getPartHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: partModel, from, to }); + if (result?.error) { + logger.error('Error fetching part history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Part history:', result); + res.send(result); +}; diff --git a/src/services/management/products.js b/src/services/management/products.js index 12518bb..a85f292 100644 --- a/src/services/management/products.js +++ b/src/services/management/products.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { productModel } from '../../schemas/management/product.schema.js'; +import { productModel } from '../../database/schemas/management/product.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -170,3 +172,25 @@ export const deleteProductRouteHandler = async (req, res) => { res.send(result); }; + +export const getProductStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: productModel }); + if (result?.error) { + logger.error('Error fetching product stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Product stats:', result); + res.send(result); +}; + +export const getProductHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: productModel, from, to }); + if (result?.error) { + logger.error('Error fetching product history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Product history:', result); + res.send(result); +}; diff --git a/src/services/management/spotlight.js b/src/services/management/spotlight.js index dee714f..82116f3 100644 --- a/src/services/management/spotlight.js +++ b/src/services/management/spotlight.js @@ -1,21 +1,21 @@ import dotenv from 'dotenv'; -import { jobModel } from '../../schemas/production/job.schema.js'; -import { subJobModel } from '../../schemas/production/subjob.schema.js'; +import { jobModel } from '../../database/schemas/production/job.schema.js'; +import { subJobModel } from '../../database/schemas/production/subjob.schema.js'; import log4js from 'log4js'; -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 { printerModel } from '../../database/schemas/production/printer.schema.js'; +import { filamentModel } from '../../database/schemas/management/filament.schema.js'; +import { gcodeFileModel } from '../../database/schemas/production/gcodefile.schema.js'; +import { partModel } from '../../database/schemas/management/part.schema.js'; +import { productModel } from '../../database/schemas/management/product.schema.js'; +import { vendorModel } from '../../database/schemas/management/vendor.schema.js'; +import { filamentStockModel } from '../../database/schemas/inventory/filamentstock.schema.js'; +import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js'; +import { stockAuditModel } from '../../database/schemas/inventory/stockaudit.schema.js'; +import { partStockModel } from '../../database/schemas/inventory/partstock.schema.js'; +import { auditLogModel } from '../../database/schemas/management/auditlog.schema.js'; +import { userModel } from '../../database/schemas/management/user.schema.js'; +import { noteTypeModel } from '../../database/schemas/management/notetype.schema.js'; +import { noteModel } from '../../database/schemas/misc/note.schema.js'; import mongoose from 'mongoose'; dotenv.config(); diff --git a/src/services/management/taxrates.js b/src/services/management/taxrates.js index 418733b..e4271bd 100644 --- a/src/services/management/taxrates.js +++ b/src/services/management/taxrates.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { taxRateModel } from '../../schemas/management/taxrates.schema.js'; +import { taxRateModel } from '../../database/schemas/management/taxrates.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -166,3 +168,25 @@ export const deleteTaxRateRouteHandler = async (req, res) => { res.send(result); }; + +export const getTaxRateStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: taxRateModel }); + if (result?.error) { + logger.error('Error fetching tax rate stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Tax rate stats:', result); + res.send(result); +}; + +export const getTaxRateHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: taxRateModel, from, to }); + if (result?.error) { + logger.error('Error fetching tax rate history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Tax rate history:', result); + res.send(result); +}; diff --git a/src/services/management/taxrecords.js b/src/services/management/taxrecords.js index d122b75..bee69e1 100644 --- a/src/services/management/taxrecords.js +++ b/src/services/management/taxrecords.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { taxRecordModel } from '../../schemas/management/taxrecord.schema.js'; +import { taxRecordModel } from '../../database/schemas/management/taxrecord.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -162,3 +164,25 @@ export const deleteTaxRecordRouteHandler = async (req, res) => { res.send(result); }; + +export const getTaxRecordStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: taxRecordModel }); + if (result?.error) { + logger.error('Error fetching tax record stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Tax record stats:', result); + res.send(result); +}; + +export const getTaxRecordHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: taxRecordModel, from, to }); + if (result?.error) { + logger.error('Error fetching tax record history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Tax record history:', result); + res.send(result); +}; diff --git a/src/services/management/users.js b/src/services/management/users.js index 972846b..58d6a91 100644 --- a/src/services/management/users.js +++ b/src/services/management/users.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { userModel } from '../../schemas/management/user.schema.js'; +import { userModel } from '../../database/schemas/management/user.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -7,6 +7,8 @@ import { listObjectsByProperties, getObject, editObject, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -117,3 +119,25 @@ export const editUserRouteHandler = async (req, res) => { res.send(result); }; + +export const getUserStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: userModel }); + if (result?.error) { + logger.error('Error fetching user stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('User stats:', result); + res.send(result); +}; + +export const getUserHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: userModel, from, to }); + if (result?.error) { + logger.error('Error fetching user history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('User history:', result); + res.send(result); +}; diff --git a/src/services/management/vendors.js b/src/services/management/vendors.js index 1229942..6533f17 100644 --- a/src/services/management/vendors.js +++ b/src/services/management/vendors.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { vendorModel } from '../../schemas/management/vendor.schema.js'; +import { vendorModel } from '../../database/schemas/management/vendor.schema.js'; import log4js from 'log4js'; import mongoose from 'mongoose'; import { @@ -9,6 +9,8 @@ import { editObject, newObject, listObjectsByProperties, + getModelStats, + getModelHistory, } from '../../database/database.js'; dotenv.config(); @@ -166,3 +168,25 @@ export const deleteVendorRouteHandler = async (req, res) => { res.send(result); }; + +export const getVendorStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: vendorModel }); + if (result?.error) { + logger.error('Error fetching vendor stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Vendor stats:', result); + res.send(result); +}; + +export const getVendorHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: vendorModel, from, to }); + if (result?.error) { + logger.error('Error fetching vendor history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Vendor history:', result); + res.send(result); +}; diff --git a/src/services/misc/auth.js b/src/services/misc/auth.js index 3ee4d72..1230bca 100644 --- a/src/services/misc/auth.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/management/user.schema.js'; +import { userModel } from '../../database/schemas/management/user.schema.js'; import { readFileSync } from 'fs'; import { resolve } from 'path'; import NodeCache from 'node-cache'; @@ -32,16 +32,16 @@ const lookupUserByToken = async (token) => { // Check cache first const cachedUser = tokenUserCache.get(token); if (cachedUser) { - logger.debug(`User found in token cache for token: ${token.substring(0, 20)}...`); + logger.trace(`User found in token cache for token: ${token.substring(0, 20)}...`); return cachedUser; } // If not in cache, decode token and lookup user - logger.debug(`User not in token cache, decoding token: ${token.substring(0, 20)}...`); + logger.trace(`User not in token cache, decoding token: ${token.substring(0, 20)}...`); const decodedToken = jwt.decode(token); if (!decodedToken || !decodedToken.preferred_username) { - logger.warn('Invalid token or missing preferred_username'); + logger.trace('Invalid token or missing preferred_username'); return null; } @@ -51,7 +51,7 @@ const lookupUserByToken = async (token) => { if (user) { // Store in cache using token as key tokenUserCache.set(token, user); - logger.debug(`User stored in token cache for token: ${token.substring(0, 20)}...`); + logger.trace(`User stored in token cache for token: ${token.substring(0, 20)}...`); return user; } diff --git a/src/services/misc/model.js b/src/services/misc/model.js index b42bb5e..b59e121 100644 --- a/src/services/misc/model.js +++ b/src/services/misc/model.js @@ -1,4 +1,4 @@ -import { models } from '../../schemas/models.js'; +import { models } from '../../database/schemas/models.js'; /** * Get all models from the PREFIX_MODEL_MAP diff --git a/src/services/misc/notes.js b/src/services/misc/notes.js index f3c1bbd..e8d2337 100644 --- a/src/services/misc/notes.js +++ b/src/services/misc/notes.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { noteModel } from '../../schemas/misc/note.schema.js'; +import { noteModel } from '../../database/schemas/misc/note.schema.js'; import log4js from 'log4js'; import { deleteObject, @@ -9,6 +9,8 @@ import { listObjectsByProperties, newObject, recursivelyDeleteChildObjects, + getModelStats, + getModelHistory, } from '../../database/database.js'; import mongoose from 'mongoose'; @@ -73,7 +75,7 @@ export const getNoteRouteHandler = async (req, res) => { const result = await getObject({ model: noteModel, id, - populate: ['noteType', 'user'], + populate: ['noteType', 'user', 'parent'], }); if (result?.error) { logger.warn(`Note not found with supplied id.`); @@ -161,3 +163,25 @@ export const deleteNoteRouteHandler = async (req, res) => { status: 'ok', }); }; + +export const getNoteStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: noteModel }); + if (result?.error) { + logger.error('Error fetching note stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Note stats:', result); + res.send(result); +}; + +export const getNoteHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: noteModel, from, to }); + if (result?.error) { + logger.error('Error fetching note history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Note history:', result); + res.send(result); +}; diff --git a/src/services/production/gcodefiles.js b/src/services/production/gcodefiles.js index ccb4377..287d709 100644 --- a/src/services/production/gcodefiles.js +++ b/src/services/production/gcodefiles.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { gcodeFileModel } from '../../schemas/production/gcodefile.schema.js'; +import { gcodeFileModel } from '../../database/schemas/production/gcodefile.schema.js'; import log4js from 'log4js'; import { deleteObject, diff --git a/src/services/production/jobs.js b/src/services/production/jobs.js index 4ccaa76..0acad01 100644 --- a/src/services/production/jobs.js +++ b/src/services/production/jobs.js @@ -1,6 +1,6 @@ import dotenv from 'dotenv'; import mongoose from 'mongoose'; -import { jobModel } from '../../schemas/production/job.schema.js'; +import { jobModel } from '../../database/schemas/production/job.schema.js'; import log4js from 'log4js'; import { deleteObject, @@ -8,8 +8,10 @@ import { listObjects, listObjectsByProperties, newObject, + getModelStats, + getModelHistory, } from '../../database/database.js'; -import { subJobModel } from '../../schemas/production/subjob.schema.js'; +import { subJobModel } from '../../database/schemas/production/subjob.schema.js'; dotenv.config(); const logger = log4js.getLogger('Jobs'); @@ -161,26 +163,24 @@ export const deleteJobRouteHandler = async (req, res) => { }; export const getJobStatsRouteHandler = async (req, res) => { - try { - const stats = await jobModel.aggregate([ - { - $group: { - _id: '$state.type', - count: { $sum: 1 }, - }, - }, - ]); - - // Transform the results into a more readable format - const formattedStats = stats.reduce((acc, curr) => { - acc[curr._id] = curr.count; - return acc; - }, {}); - - logger.trace('Print job stats by state:', formattedStats); - res.send(formattedStats); - } catch (error) { - logger.error('Error fetching print job stats:', error); - res.status(500).send({ error: error.message }); + console.log('Getting job stats'); + const result = await getModelStats({ model: jobModel }); + if (result?.error) { + logger.error('Error fetching job stats:', result.error); + return res.status(result.code).send(result); } + logger.trace('Job stats:', result); + res.send(result); +}; + +export const getJobHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: jobModel, from, to }); + if (result?.error) { + logger.error('Error fetching job history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Job history:', result); + res.send(result); }; diff --git a/src/services/production/printers.js b/src/services/production/printers.js index 4e6ec81..3e477c2 100644 --- a/src/services/production/printers.js +++ b/src/services/production/printers.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -import { printerModel } from '../../schemas/production/printer.schema.js'; +import { printerModel } from '../../database/schemas/production/printer.schema.js'; import log4js from 'log4js'; import { deleteObject, @@ -8,6 +8,8 @@ import { listObjects, listObjectsByProperties, newObject, + getModelStats, + getModelHistory, } from '../../database/database.js'; import mongoose from 'mongoose'; @@ -169,26 +171,24 @@ export const deletePrinterRouteHandler = async (req, res) => { }; export const getPrinterStatsRouteHandler = async (req, res) => { - try { - const stats = await printerModel.aggregate([ - { - $group: { - _id: '$state.type', - count: { $sum: 1 }, - }, - }, - ]); - - // Transform the results into a more readable format - const formattedStats = stats.reduce((acc, curr) => { - acc[curr._id] = curr.count; - return acc; - }, {}); - - logger.trace('Printer stats by state:', formattedStats); - res.send(formattedStats); - } catch (error) { - logger.error('Error fetching printer stats:', error); - res.status(500).send({ error: error.message }); + const result = await getModelStats({ model: printerModel }); + console.log(result); + if (!result) { + logger.error('Error fetching printer stats:', result.error); + return res.status(result.code).send(result); } + logger.trace('Printer stats:', result); + res.send(result); +}; + +export const getPrinterHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: printerModel, from, to }); + if (result?.error) { + logger.error('Error fetching printer history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Printer history:', result); + res.send(result); }; diff --git a/src/services/production/subjobs.js b/src/services/production/subjobs.js index 27c2f54..1c7c8a9 100644 --- a/src/services/production/subjobs.js +++ b/src/services/production/subjobs.js @@ -1,7 +1,13 @@ import dotenv from 'dotenv'; -import { subJobModel } from '../../schemas/production/subjob.schema.js'; +import { subJobModel } from '../../database/schemas/production/subjob.schema.js'; import log4js from 'log4js'; -import { getObject, listObjects, listObjectsByProperties } from '../../database/database.js'; +import { + getObject, + listObjects, + listObjectsByProperties, + getModelStats, + getModelHistory, +} from '../../database/database.js'; dotenv.config(); const logger = log4js.getLogger('Sub Jobs'); @@ -27,7 +33,7 @@ export const listSubJobsRouteHandler = async ( search, sort, order, - populate: ['printer'], + populate: ['printer', 'job'], }); if (result?.error) { @@ -69,6 +75,7 @@ export const getSubJobRouteHandler = async (req, res) => { const result = await getObject({ model: subJobModel, id, + populate: ['printer'], }); if (result?.error) { logger.warn(`Sub job not found with supplied id.`); @@ -77,3 +84,25 @@ export const getSubJobRouteHandler = async (req, res) => { logger.debug(`Retreived sub job with ID: ${id}`); res.send(result); }; + +export const getSubJobStatsRouteHandler = async (req, res) => { + const result = await getModelStats({ model: subJobModel }); + if (result?.error) { + logger.error('Error fetching sub job stats:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Sub job stats:', result); + res.send(result); +}; + +export const getSubJobHistoryRouteHandler = async (req, res) => { + const from = req.query.from; + const to = req.query.to; + const result = await getModelHistory({ model: subJobModel, from, to }); + if (result?.error) { + logger.error('Error fetching sub job history:', result.error); + return res.status(result.code).send(result); + } + logger.trace('Sub job history:', result); + res.send(result); +};