From 367891eb33bd0e700a638ede7efcdd719e943eb6 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 4 Jul 2026 20:48:27 +0100 Subject: [PATCH] Refactored population logic in invoice, payment, order item, and other route handlers to use constants for improved readability and maintainability. This change enhances consistency across the codebase and simplifies future updates to population fields. --- src/services/finance/invoices.js | 22 ++--- src/services/finance/payments.js | 6 +- src/services/inventory/filamentstocks.js | 5 ++ src/services/inventory/orderitems.js | 95 ++++++++++---------- src/services/inventory/partstocks.js | 1 + src/services/inventory/productstocks.js | 6 ++ src/services/inventory/purchaseorders.js | 1 + src/services/inventory/shipments.js | 1 + src/services/inventory/stockevents.js | 4 + src/services/inventory/stocktransfers.js | 5 ++ src/services/management/apppasswords.js | 1 + src/services/management/courierservice.js | 1 + src/services/management/documentjobs.js | 1 + src/services/management/documentprinters.js | 1 + src/services/management/documenttemplates.js | 5 ++ src/services/management/filaments.js | 1 + src/services/management/filamentskus.js | 1 + src/services/management/hosts.js | 1 + src/services/management/parts.js | 1 + src/services/management/partskus.js | 13 +-- src/services/management/products.js | 1 + src/services/management/productskus.js | 19 ++-- src/services/misc/notes.js | 1 + src/services/misc/usernotifiers.js | 1 + src/services/production/gcodefiles.js | 1 + src/services/production/printers.js | 4 +- src/services/sales/salesorders.js | 1 + 27 files changed, 127 insertions(+), 73 deletions(-) diff --git a/src/services/finance/invoices.js b/src/services/finance/invoices.js index 2f999dc..c37bf47 100644 --- a/src/services/finance/invoices.js +++ b/src/services/finance/invoices.js @@ -21,6 +21,16 @@ import { shipmentModel } from '../../database/schemas/inventory/shipment.schema. const logger = log4js.getLogger('Invoices'); logger.level = config.server.logLevel; +const INVOICE_POPULATE = [ + { path: 'to', strictPopulate: false, ref: 'toType' }, + { path: 'from', strictPopulate: false, ref: 'fromType' }, + { path: 'order' }, + { path: 'invoiceOrderItems.taxRate' }, + { path: 'invoiceShipments.taxRate' }, + { path: 'invoiceOrderItems.orderItem' }, + { path: 'invoiceShipments.shipment' }, +]; + export const listInvoicesRouteHandler = async ( req, res, @@ -93,19 +103,10 @@ export const searchInvoicesRouteHandler = async (req, res, search) => { export const getInvoiceRouteHandler = async (req, res) => { const id = req.params.id; - const populateFields = [ - { path: 'to', strictPopulate: false, ref: 'toType' }, - { path: 'from', strictPopulate: false, ref: 'fromType' }, - { path: 'order' }, - { path: 'invoiceOrderItems.taxRate' }, - { path: 'invoiceShipments.taxRate' }, - { path: 'invoiceOrderItems.orderItem' }, - { path: 'invoiceShipments.shipment' }, - ]; const result = await getObject({ model: invoiceModel, id, - populate: populateFields, + populate: INVOICE_POPULATE, }); if (result?.error) { logger.warn(`Invoice not found with supplied id.`); @@ -158,6 +159,7 @@ export const editInvoiceRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: INVOICE_POPULATE, }); if (result.error) { diff --git a/src/services/finance/payments.js b/src/services/finance/payments.js index d777bcc..0d8e1a7 100644 --- a/src/services/finance/payments.js +++ b/src/services/finance/payments.js @@ -20,6 +20,8 @@ import { invoiceModel } from '../../database/schemas/finance/invoice.schema.js'; const logger = log4js.getLogger('Payments'); logger.level = config.server.logLevel; +const PAYMENT_POPULATE = [{ path: 'vendor' }, { path: 'client' }, { path: 'invoice' }]; + export const listPaymentsRouteHandler = async ( req, res, @@ -90,11 +92,10 @@ export const searchPaymentsRouteHandler = async (req, res, search) => { export const getPaymentRouteHandler = async (req, res) => { const id = req.params.id; - const populateFields = [{ path: 'vendor' }, { path: 'client' }, { path: 'invoice' }]; const result = await getObject({ model: paymentModel, id, - populate: populateFields, + populate: PAYMENT_POPULATE, }); if (result?.error) { logger.warn(`Payment not found with supplied id.`); @@ -140,6 +141,7 @@ export const editPaymentRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: PAYMENT_POPULATE, }); if (result.error) { diff --git a/src/services/inventory/filamentstocks.js b/src/services/inventory/filamentstocks.js index d7fe464..ab985f7 100644 --- a/src/services/inventory/filamentstocks.js +++ b/src/services/inventory/filamentstocks.js @@ -120,6 +120,11 @@ export const editFilamentStockRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [ + { path: 'filament' }, + { path: 'filamentSku', populate: 'filament' }, + { path: 'stockLocation' }, + ], }); if (result.error) { diff --git a/src/services/inventory/orderitems.js b/src/services/inventory/orderitems.js index d104722..11b4d0e 100644 --- a/src/services/inventory/orderitems.js +++ b/src/services/inventory/orderitems.js @@ -18,6 +18,53 @@ import { const logger = log4js.getLogger('Order Items'); logger.level = config.server.logLevel; +const ORDER_ITEM_POPULATE = [ + { + path: 'order', + }, + { + path: 'taxRate', + strictPopulate: false, + }, + { + path: 'item', + populate: [ + { path: 'costTaxRate', strictPopulate: false }, + { path: 'priceTaxRate', strictPopulate: false }, + ], + strictPopulate: false, + }, + { + path: 'sku', + strictPopulate: false, + populate: [ + { + path: 'filament', + populate: { path: 'costTaxRate', strictPopulate: false }, + strictPopulate: false, + }, + { + path: 'part', + populate: [ + { path: 'costTaxRate', strictPopulate: false }, + { path: 'priceTaxRate', strictPopulate: false }, + ], + strictPopulate: false, + }, + { + path: 'product', + populate: [ + { path: 'costTaxRate', strictPopulate: false }, + { path: 'priceTaxRate', strictPopulate: false }, + ], + strictPopulate: false, + }, + { path: 'costTaxRate', strictPopulate: false }, + { path: 'priceTaxRate', strictPopulate: false }, + ], + }, +]; + export const listOrderItemsRouteHandler = async ( req, res, @@ -137,52 +184,7 @@ export const getOrderItemRouteHandler = async (req, res) => { const result = await getObject({ model: orderItemModel, id, - populate: [ - { - path: 'order', - }, - { - path: 'taxRate', - strictPopulate: false, - }, - { - path: 'item', - populate: [ - { path: 'costTaxRate', strictPopulate: false }, - { path: 'priceTaxRate', strictPopulate: false }, - ], - strictPopulate: false, - }, - { - path: 'sku', - strictPopulate: false, - populate: [ - { - path: 'filament', - populate: { path: 'costTaxRate', strictPopulate: false }, - strictPopulate: false, - }, - { - path: 'part', - populate: [ - { path: 'costTaxRate', strictPopulate: false }, - { path: 'priceTaxRate', strictPopulate: false }, - ], - strictPopulate: false, - }, - { - path: 'product', - populate: [ - { path: 'costTaxRate', strictPopulate: false }, - { path: 'priceTaxRate', strictPopulate: false }, - ], - strictPopulate: false, - }, - { path: 'costTaxRate', strictPopulate: false }, - { path: 'priceTaxRate', strictPopulate: false }, - ], - }, - ], + populate: ORDER_ITEM_POPULATE, }); if (result?.error) { logger.warn(`Order Item not found with supplied id.`); @@ -247,6 +249,7 @@ export const editOrderItemRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ORDER_ITEM_POPULATE, }); if (result.error) { diff --git a/src/services/inventory/partstocks.js b/src/services/inventory/partstocks.js index c7bafef..3b326ec 100644 --- a/src/services/inventory/partstocks.js +++ b/src/services/inventory/partstocks.js @@ -110,6 +110,7 @@ export const editPartStockRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [{ path: 'partSku' }, { path: 'stockLocation' }, { path: 'source' }], }); if (result.error) { diff --git a/src/services/inventory/productstocks.js b/src/services/inventory/productstocks.js index 7fbbeca..274caef 100644 --- a/src/services/inventory/productstocks.js +++ b/src/services/inventory/productstocks.js @@ -142,6 +142,12 @@ export const editProductStockRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [ + { path: 'partStocks.partSku' }, + { path: 'partStocks.partStock' }, + { path: 'productSku' }, + { path: 'stockLocation' }, + ], }); if (result.error) { diff --git a/src/services/inventory/purchaseorders.js b/src/services/inventory/purchaseorders.js index 353ae30..8b7d12d 100644 --- a/src/services/inventory/purchaseorders.js +++ b/src/services/inventory/purchaseorders.js @@ -132,6 +132,7 @@ export const editPurchaseOrderRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['vendor'], }); if (result.error) { diff --git a/src/services/inventory/shipments.js b/src/services/inventory/shipments.js index c9a6692..b36879c 100644 --- a/src/services/inventory/shipments.js +++ b/src/services/inventory/shipments.js @@ -122,6 +122,7 @@ export const editShipmentRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['order', 'courierService', 'taxRate'], }); if (result.error) { diff --git a/src/services/inventory/stockevents.js b/src/services/inventory/stockevents.js index 9a46ce0..21c29c9 100644 --- a/src/services/inventory/stockevents.js +++ b/src/services/inventory/stockevents.js @@ -142,6 +142,10 @@ export const editStockEventRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [ + { path: 'owner', select: 'name _id' }, + { path: 'parent', select: 'name _id' }, + ], }); if (result.error) { diff --git a/src/services/inventory/stocktransfers.js b/src/services/inventory/stocktransfers.js index c0d9866..3ea8a73 100644 --- a/src/services/inventory/stocktransfers.js +++ b/src/services/inventory/stocktransfers.js @@ -362,6 +362,11 @@ export const editStockTransferRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [ + { path: 'lines.fromStock' }, + { path: 'lines.toStockLocation' }, + { path: 'lines.toStock' }, + ], }); if (result.error) { diff --git a/src/services/management/apppasswords.js b/src/services/management/apppasswords.js index 07899c5..d4efb60 100644 --- a/src/services/management/apppasswords.js +++ b/src/services/management/apppasswords.js @@ -123,6 +123,7 @@ export const editAppPasswordRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['user'], }); if (result?.error) { diff --git a/src/services/management/courierservice.js b/src/services/management/courierservice.js index d4b63e6..72cf1a3 100644 --- a/src/services/management/courierservice.js +++ b/src/services/management/courierservice.js @@ -116,6 +116,7 @@ export const editCourierServiceRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['courier'], }); if (result.error) { diff --git a/src/services/management/documentjobs.js b/src/services/management/documentjobs.js index 03a2851..701003c 100644 --- a/src/services/management/documentjobs.js +++ b/src/services/management/documentjobs.js @@ -106,6 +106,7 @@ export const editDocumentJobRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['documentTemplate', 'documentPrinter', 'object'], }); if (result.error) { diff --git a/src/services/management/documentprinters.js b/src/services/management/documentprinters.js index fe004eb..c31042e 100644 --- a/src/services/management/documentprinters.js +++ b/src/services/management/documentprinters.js @@ -118,6 +118,7 @@ export const editDocumentPrinterRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['currentDocumentSize', 'host'], }); if (result.error) { diff --git a/src/services/management/documenttemplates.js b/src/services/management/documenttemplates.js index 73e8b64..c8e3577 100644 --- a/src/services/management/documenttemplates.js +++ b/src/services/management/documenttemplates.js @@ -132,6 +132,11 @@ export const editDocumentTemplateRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [ + { path: 'documentSize' }, + { path: 'parent', strictPopulate: false }, + { path: 'documentPrinters', strictPopulate: false }, + ], }); if (result.error) { diff --git a/src/services/management/filaments.js b/src/services/management/filaments.js index 3e54848..ef89256 100644 --- a/src/services/management/filaments.js +++ b/src/services/management/filaments.js @@ -122,6 +122,7 @@ export const editFilamentRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['costTaxRate', 'material'], }); if (result.error) { diff --git a/src/services/management/filamentskus.js b/src/services/management/filamentskus.js index 6aff350..304da7d 100644 --- a/src/services/management/filamentskus.js +++ b/src/services/management/filamentskus.js @@ -122,6 +122,7 @@ export const editFilamentSkuRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: [{ path: 'filament', populate: 'costTaxRate' }, 'costTaxRate'], }); if (result.error) { diff --git a/src/services/management/hosts.js b/src/services/management/hosts.js index 7a9355c..95827a3 100644 --- a/src/services/management/hosts.js +++ b/src/services/management/hosts.js @@ -114,6 +114,7 @@ export const editHostRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['files'], }); if (result.error) { diff --git a/src/services/management/parts.js b/src/services/management/parts.js index 7ea3016..362af6b 100644 --- a/src/services/management/parts.js +++ b/src/services/management/parts.js @@ -115,6 +115,7 @@ export const editPartRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['costTaxRate', 'priceTaxRate'], }); if (result.error) { diff --git a/src/services/management/partskus.js b/src/services/management/partskus.js index a274496..5e63848 100644 --- a/src/services/management/partskus.js +++ b/src/services/management/partskus.js @@ -16,6 +16,12 @@ import { const logger = log4js.getLogger('Part SKUs'); logger.level = config.server.logLevel; +const PART_SKU_POPULATE = [ + { path: 'part', populate: ['costTaxRate', 'priceTaxRate'] }, + 'priceTaxRate', + 'costTaxRate', +]; + export const listPartSkusRouteHandler = async ( req, res, @@ -87,11 +93,7 @@ export const getPartSkuRouteHandler = async (req, res) => { const result = await getObject({ model: partSkuModel, id, - populate: [ - { path: 'part', populate: ['costTaxRate', 'priceTaxRate'] }, - 'priceTaxRate', - 'costTaxRate', - ], + populate: PART_SKU_POPULATE, }); if (result?.error) { logger.warn(`Part SKU not found with supplied id.`); @@ -132,6 +134,7 @@ export const editPartSkuRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: PART_SKU_POPULATE, }); if (result.error) { diff --git a/src/services/management/products.js b/src/services/management/products.js index 3b63eae..ba07d87 100644 --- a/src/services/management/products.js +++ b/src/services/management/products.js @@ -123,6 +123,7 @@ export const editProductRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['productCategory', 'vendor', 'costTaxRate', 'priceTaxRate'], }); if (result.error) { diff --git a/src/services/management/productskus.js b/src/services/management/productskus.js index 27b1937..f406d19 100644 --- a/src/services/management/productskus.js +++ b/src/services/management/productskus.js @@ -16,6 +16,15 @@ import { const logger = log4js.getLogger('Product SKUs'); logger.level = config.server.logLevel; +const PRODUCT_SKU_POPULATE = [ + { path: 'product', populate: ['costTaxRate', 'priceTaxRate'] }, + 'priceTaxRate', + 'costTaxRate', + 'parts.partSku', + 'parts.part', + 'product', +]; + export const listProductSkusRouteHandler = async ( req, res, @@ -87,14 +96,7 @@ export const getProductSkuRouteHandler = async (req, res) => { const result = await getObject({ model: productSkuModel, id, - populate: [ - { path: 'product', populate: ['costTaxRate', 'priceTaxRate'] }, - 'priceTaxRate', - 'costTaxRate', - 'parts.partSku', - 'parts.part', - 'product', - ], + populate: PRODUCT_SKU_POPULATE, }); if (result?.error) { logger.warn(`Product SKU not found with supplied id.`); @@ -136,6 +138,7 @@ export const editProductSkuRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: PRODUCT_SKU_POPULATE, }); if (result.error) { diff --git a/src/services/misc/notes.js b/src/services/misc/notes.js index b0a8e2e..b635825 100644 --- a/src/services/misc/notes.js +++ b/src/services/misc/notes.js @@ -101,6 +101,7 @@ export const editNoteRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['noteType', 'user', 'parent'], }); if (result.error) { diff --git a/src/services/misc/usernotifiers.js b/src/services/misc/usernotifiers.js index 9e25d7f..c31a7f3 100644 --- a/src/services/misc/usernotifiers.js +++ b/src/services/misc/usernotifiers.js @@ -103,6 +103,7 @@ export const editUserNotifierRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['user', 'object'], }); if (result.error) { diff --git a/src/services/production/gcodefiles.js b/src/services/production/gcodefiles.js index 248542d..7702e78 100644 --- a/src/services/production/gcodefiles.js +++ b/src/services/production/gcodefiles.js @@ -132,6 +132,7 @@ export const editGCodeFileRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['filament', { path: 'filamentSku', populate: 'filament' }, 'parts.partSku'], }); if (result.error) { diff --git a/src/services/production/printers.js b/src/services/production/printers.js index 5d694cc..c6c28fa 100644 --- a/src/services/production/printers.js +++ b/src/services/production/printers.js @@ -10,7 +10,7 @@ import { newObject, getModelStats, getModelHistory, - searchObjects + searchObjects, } from '../../database/database.js'; import mongoose from 'mongoose'; @@ -117,7 +117,7 @@ export const editPrinterRouteHandler = async (req, res) => { id, updateData, user: req.user, - populate: 'vendor', + populate: ['vendor', 'host'], }); if (result.error) { diff --git a/src/services/sales/salesorders.js b/src/services/sales/salesorders.js index 6dfc731..4be0760 100644 --- a/src/services/sales/salesorders.js +++ b/src/services/sales/salesorders.js @@ -133,6 +133,7 @@ export const editSalesOrderRouteHandler = async (req, res) => { id, updateData, user: req.user, + populate: ['client', 'marketplace'], }); if (result.error) {