From 2a30b7f3f67a841aab412968b097d3e4b03ec3a2 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 9 Aug 2026 22:27:45 +0100 Subject: [PATCH] Enhance filtering and parsing logic in utils.js and update route handlers for async support This update introduces several utility functions in `utils.js` to improve the handling of ObjectId paths, schema types, and filtering logic. Key additions include `isObjectIdPath`, `getBaseProperty`, and `getFilterFieldKind`, which enhance the flexibility of property handling. Additionally, all route handlers in the finance and inventory modules have been refactored to support asynchronous operations, ensuring better performance and responsiveness when processing requests. --- src/routes/finance/invoices.js | 24 +- src/routes/finance/payments.js | 24 +- src/routes/finance/taxrecords.js | 24 +- src/routes/inventory/filamentstocks.js | 24 +- src/routes/inventory/orderitems.js | 24 +- src/routes/inventory/partstocks.js | 24 +- src/routes/inventory/productstocks.js | 24 +- src/routes/inventory/purchaseorders.js | 26 +- src/routes/inventory/shipments.js | 26 +- src/routes/inventory/stockaudits.js | 22 +- src/routes/inventory/stockevents.js | 24 +- src/routes/inventory/stocklocations.js | 24 +- src/routes/inventory/stocktransfers.js | 24 +- src/routes/management/apppasswords.js | 24 +- src/routes/management/auditlogs.js | 8 +- src/routes/management/courier.js | 24 +- src/routes/management/courierservice.js | 24 +- src/routes/management/documentjobs.js | 24 +- src/routes/management/documentprinters.js | 24 +- src/routes/management/documentsizes.js | 24 +- src/routes/management/documenttemplates.js | 24 +- src/routes/management/filaments.js | 24 +- src/routes/management/filamentskus.js | 24 +- src/routes/management/files.js | 30 +- src/routes/management/hosts.js | 24 +- src/routes/management/materials.js | 24 +- src/routes/management/notetypes.js | 24 +- src/routes/management/parts.js | 24 +- src/routes/management/partskus.js | 24 +- src/routes/management/productcategories.js | 24 +- src/routes/management/products.js | 24 +- src/routes/management/productskus.js | 24 +- src/routes/management/taxrates.js | 24 +- src/routes/management/users.js | 22 +- src/routes/management/vendors.js | 24 +- src/routes/misc/notes.js | 22 +- src/routes/misc/notifications.js | 12 +- src/routes/misc/usernotifiers.js | 12 +- src/routes/production/filamentprofiles.js | 24 +- src/routes/production/gcodefiles.js | 24 +- src/routes/production/jobs.js | 24 +- src/routes/production/printerprofiles.js | 24 +- src/routes/production/printers.js | 24 +- src/routes/production/subjobs.js | 22 +- src/routes/sales/clients.js | 24 +- src/routes/sales/listings.js | 28 +- src/routes/sales/listingvarients.js | 28 +- src/routes/sales/marketplaces.js | 36 +- src/routes/sales/salesorders.js | 26 +- src/services/misc/csv.js | 2 +- src/services/misc/excel.js | 4 +- src/services/misc/odata.js | 4 +- src/services/misc/rss.js | 2 +- src/utils.js | 420 ++++++++++++++++++--- 54 files changed, 954 insertions(+), 638 deletions(-) diff --git a/src/routes/finance/invoices.js b/src/routes/finance/invoices.js index e98aed2..511a25f 100644 --- a/src/routes/finance/invoices.js +++ b/src/routes/finance/invoices.js @@ -47,15 +47,15 @@ import { } from '../../services/finance/invoices.js'; // list of invoices -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listInvoicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -63,37 +63,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listInvoicesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getInvoicePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchInvoicesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newInvoiceRouteHandler(req, res); }); // get invoice stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getInvoiceStatsRouteHandler(req, res); }); // get invoice history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getInvoiceHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getInvoiceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getInvoiceRouteHandler(req, res); }); diff --git a/src/routes/finance/payments.js b/src/routes/finance/payments.js index a7707f7..4158d5d 100644 --- a/src/routes/finance/payments.js +++ b/src/routes/finance/payments.js @@ -47,15 +47,15 @@ import { } from '../../services/finance/payments.js'; // list of payments -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPaymentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -63,37 +63,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listPaymentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPaymentPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPaymentsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPaymentRouteHandler(req, res); }); // get payment stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPaymentStatsRouteHandler(req, res); }); // get payment history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPaymentHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPaymentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPaymentRouteHandler(req, res); }); diff --git a/src/routes/finance/taxrecords.js b/src/routes/finance/taxrecords.js index e9a1264..2728bf8 100644 --- a/src/routes/finance/taxrecords.js +++ b/src/routes/finance/taxrecords.js @@ -30,15 +30,15 @@ import { } from '../../services/finance/taxrecords.js'; // list of tax records -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listTaxRecordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,37 +46,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listTaxRecordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getTaxRecordPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchTaxRecordsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newTaxRecordRouteHandler(req, res); }); // get tax record stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getTaxRecordStatsRouteHandler(req, res); }); // get tax record history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getTaxRecordHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getTaxRecordNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getTaxRecordRouteHandler(req, res); }); diff --git a/src/routes/inventory/filamentstocks.js b/src/routes/inventory/filamentstocks.js index 85638ca..8cfefe5 100644 --- a/src/routes/inventory/filamentstocks.js +++ b/src/routes/inventory/filamentstocks.js @@ -42,15 +42,15 @@ import { } from '../../services/inventory/filamentstocks.js'; // list of filament stocks -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listFilamentStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -58,37 +58,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listFilamentStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getFilamentStockPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchFilamentStocksRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newFilamentStockRouteHandler(req, res); }); // get filament stock stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getFilamentStockStatsRouteHandler(req, res); }); // get filament stock history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getFilamentStockHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getFilamentStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getFilamentStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/orderitems.js b/src/routes/inventory/orderitems.js index 11a7a50..c32d228 100644 --- a/src/routes/inventory/orderitems.js +++ b/src/routes/inventory/orderitems.js @@ -47,15 +47,15 @@ import { } from '../../services/inventory/orderitems.js'; // list of order items -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listOrderItemsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -63,37 +63,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listOrderItemsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getOrderItemPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchOrderItemsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newOrderItemRouteHandler(req, res); }); // get order item stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getOrderItemStatsRouteHandler(req, res); }); // get order item history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getOrderItemHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getOrderItemNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getOrderItemRouteHandler(req, res); }); diff --git a/src/routes/inventory/partstocks.js b/src/routes/inventory/partstocks.js index 52fdd5c..47b0703 100644 --- a/src/routes/inventory/partstocks.js +++ b/src/routes/inventory/partstocks.js @@ -34,15 +34,15 @@ import { } from '../../services/inventory/partstocks.js'; // list of part stocks -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPartStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -50,37 +50,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listPartStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPartStockPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPartStocksRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPartStockRouteHandler(req, res); }); // get part stock stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPartStockStatsRouteHandler(req, res); }); // get part stock history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPartStockHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPartStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPartStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/productstocks.js b/src/routes/inventory/productstocks.js index f8c2034..4be28d0 100644 --- a/src/routes/inventory/productstocks.js +++ b/src/routes/inventory/productstocks.js @@ -33,15 +33,15 @@ import { getProductStockNeighborsRouteHandler } from '../../services/inventory/productstocks.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listProductStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -49,35 +49,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listProductStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getProductStockPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchProductStocksRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newProductStockRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getProductStockStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getProductStockHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getProductStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getProductStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/purchaseorders.js b/src/routes/inventory/purchaseorders.js index 52c74e4..e0216e9 100644 --- a/src/routes/inventory/purchaseorders.js +++ b/src/routes/inventory/purchaseorders.js @@ -50,52 +50,52 @@ import { } from '../../services/inventory/purchaseorders.js'; // list of purchase orders -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPurchaseOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { - masterFilter = getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); + masterFilter = await getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); } listPurchaseOrdersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPurchaseOrderPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPurchaseOrdersRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPurchaseOrderRouteHandler(req, res); }); // get purchase order stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPurchaseOrderStatsRouteHandler(req, res); }); // get purchase order history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPurchaseOrderHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPurchaseOrderNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPurchaseOrderRouteHandler(req, res); }); diff --git a/src/routes/inventory/shipments.js b/src/routes/inventory/shipments.js index 3d3a276..6d5deae 100644 --- a/src/routes/inventory/shipments.js +++ b/src/routes/inventory/shipments.js @@ -42,52 +42,52 @@ import { } from '../../services/inventory/shipments.js'; // list of shipments -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listShipmentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { - masterFilter = getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); + masterFilter = await getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); } listShipmentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getShipmentPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchShipmentsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newShipmentRouteHandler(req, res); }); // get shipment stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getShipmentStatsRouteHandler(req, res); }); // get shipment history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getShipmentHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getShipmentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getShipmentRouteHandler(req, res); }); diff --git a/src/routes/inventory/stockaudits.js b/src/routes/inventory/stockaudits.js index a4c6e3d..b1c1a25 100644 --- a/src/routes/inventory/stockaudits.js +++ b/src/routes/inventory/stockaudits.js @@ -26,7 +26,7 @@ const listAllowedFilters = [ ]; // List stock audits -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property } = req.query; var filter = {}; @@ -34,7 +34,7 @@ router.get('/', isAuthenticated, (req, res) => { for (const [key, value] of Object.entries(req.query)) { for (var i = 0; i < listAllowedFilters.length; i++) { if (key == listAllowedFilters[i]) { - const parsedFilter = parseFilter(key, value); + const parsedFilter = await parseFilter(key, value); filter = { ...filter, ...parsedFilter }; } } @@ -44,43 +44,43 @@ router.get('/', isAuthenticated, (req, res) => { }); // Create new stock audit -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newStockAuditRouteHandler(req, res); }); // get stock audit stats -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchStockAuditsRouteHandler(req, res, search); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getStockAuditStatsRouteHandler(req, res); }); // get stock audit history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getStockAuditHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getStockAuditNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); // Get specific stock audit -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getStockAuditRouteHandler(req, res); }); // Update stock audit -router.put('/:id', isAuthenticated, (req, res) => { +router.put('/:id', isAuthenticated, async (req, res) => { updateStockAuditRouteHandler(req, res); }); // Delete stock audit -router.delete('/:id', isAuthenticated, (req, res) => { +router.delete('/:id', isAuthenticated, async (req, res) => { deleteStockAuditRouteHandler(req, res); }); diff --git a/src/routes/inventory/stockevents.js b/src/routes/inventory/stockevents.js index dbc2137..e7c4bc0 100644 --- a/src/routes/inventory/stockevents.js +++ b/src/routes/inventory/stockevents.js @@ -29,15 +29,15 @@ import { } from '../../services/inventory/stockevents.js'; // list of stock events -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listStockEventsRouteHandler(req, res, page, limit, filter, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listStockEventsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getStockEventPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchStockEventsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newStockEventRouteHandler(req, res); }); // get stock event stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getStockEventStatsRouteHandler(req, res); }); // get stock event history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getStockEventHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getStockEventNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getStockEventRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocklocations.js b/src/routes/inventory/stocklocations.js index 1402b72..f7640ae 100644 --- a/src/routes/inventory/stocklocations.js +++ b/src/routes/inventory/stocklocations.js @@ -22,15 +22,15 @@ import { getStockLocationNeighborsRouteHandler } from '../../services/inventory/stocklocations.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listStockLocationsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -38,35 +38,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listStockLocationsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getStockLocationPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchStockLocationsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newStockLocationRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getStockLocationStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getStockLocationHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getStockLocationNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getStockLocationRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocktransfers.js b/src/routes/inventory/stocktransfers.js index 583d45f..b400f90 100644 --- a/src/routes/inventory/stocktransfers.js +++ b/src/routes/inventory/stocktransfers.js @@ -31,15 +31,15 @@ import { getStockTransferNeighborsRouteHandler } from '../../services/inventory/stocktransfers.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listStockTransfersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -47,35 +47,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listStockTransfersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getStockTransferPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchStockTransfersRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newStockTransferRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getStockTransferStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getStockTransferHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getStockTransferNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getStockTransferRouteHandler(req, res); }); diff --git a/src/routes/management/apppasswords.js b/src/routes/management/apppasswords.js index 34aac07..1434e88 100644 --- a/src/routes/management/apppasswords.js +++ b/src/routes/management/apppasswords.js @@ -31,38 +31,38 @@ import { getAppPasswordNeighborsRouteHandler } from '../../services/management/apppasswords.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listAppPasswordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { const properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); const masterFilter = req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}; listAppPasswordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getAppPasswordPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchAppPasswordsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newAppPasswordRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getAppPasswordStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getAppPasswordHistoryRouteHandler(req, res); }); @@ -70,13 +70,13 @@ router.post('/:id/regenerateSecret', isAuthenticated, async (req, res) => { regenerateSecretRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getAppPasswordNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getAppPasswordRouteHandler(req, res); }); diff --git a/src/routes/management/auditlogs.js b/src/routes/management/auditlogs.js index a9b6c9d..584e2ae 100644 --- a/src/routes/management/auditlogs.js +++ b/src/routes/management/auditlogs.js @@ -29,7 +29,7 @@ router.get('/', isAuthenticated, async (req, res) => { for (const [key, value] of Object.entries(req.query)) { for (var i = 0; i < allowedFilters.length; i++) { if (key == allowedFilters[i]) { - const parsedFilter = parseFilter(key, value); + const parsedFilter = await parseFilter(key, value); filter = { ...filter, ...parsedFilter }; } } @@ -38,17 +38,17 @@ router.get('/', isAuthenticated, async (req, res) => { }); // get audit log stats -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchAuditLogsRouteHandler(req, res, search); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getAuditLogStatsRouteHandler(req, res); }); // get audit log history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getAuditLogHistoryRouteHandler(req, res); }); diff --git a/src/routes/management/courier.js b/src/routes/management/courier.js index b031aa7..33cf884 100644 --- a/src/routes/management/courier.js +++ b/src/routes/management/courier.js @@ -32,15 +32,15 @@ import { } from '../../services/management/courier.js'; // list of couriers -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listCouriersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -48,37 +48,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listCouriersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getCourierPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchCouriersRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newCourierRouteHandler(req, res); }); // get courier stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getCourierStatsRouteHandler(req, res); }); // get courier history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getCourierHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getCourierNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getCourierRouteHandler(req, res); }); diff --git a/src/routes/management/courierservice.js b/src/routes/management/courierservice.js index be5c8ac..434ca79 100644 --- a/src/routes/management/courierservice.js +++ b/src/routes/management/courierservice.js @@ -45,15 +45,15 @@ import { } from '../../services/management/courierservice.js'; // list of courier services -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listCourierServicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -61,37 +61,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listCourierServicesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getCourierServicePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchCourierServicesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newCourierServiceRouteHandler(req, res); }); // get courier service stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getCourierServiceStatsRouteHandler(req, res); }); // get courierservice history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getCourierServiceHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getCourierServiceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getCourierServiceRouteHandler(req, res); }); diff --git a/src/routes/management/documentjobs.js b/src/routes/management/documentjobs.js index ade47c4..2ac6d13 100644 --- a/src/routes/management/documentjobs.js +++ b/src/routes/management/documentjobs.js @@ -30,15 +30,15 @@ import { } from '../../services/management/documentjobs.js'; // list of document jobs -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listDocumentJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,37 +46,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listDocumentJobsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getDocumentJobPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchDocumentJobsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newDocumentJobRouteHandler(req, res); }); // get document job stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getDocumentJobStatsRouteHandler(req, res); }); // get documentjobs history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getDocumentJobHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getDocumentJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getDocumentJobRouteHandler(req, res); }); diff --git a/src/routes/management/documentprinters.js b/src/routes/management/documentprinters.js index 4619d57..3d84266 100644 --- a/src/routes/management/documentprinters.js +++ b/src/routes/management/documentprinters.js @@ -31,15 +31,15 @@ import { } from '../../services/management/documentprinters.js'; // list of document printers -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listDocumentPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -47,37 +47,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listDocumentPrintersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getDocumentPrinterPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchDocumentPrintersRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newDocumentPrinterRouteHandler(req, res); }); // get document printer stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getDocumentPrinterStatsRouteHandler(req, res); }); // get documentprinters history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getDocumentPrinterHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getDocumentPrinterNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getDocumentPrinterRouteHandler(req, res); }); diff --git a/src/routes/management/documentsizes.js b/src/routes/management/documentsizes.js index 641c5a1..6a77ea9 100644 --- a/src/routes/management/documentsizes.js +++ b/src/routes/management/documentsizes.js @@ -29,15 +29,15 @@ import { } from '../../services/management/documentsizes.js'; // list of document sizes -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listDocumentSizesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listDocumentSizesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getDocumentSizePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchDocumentSizesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newDocumentSizeRouteHandler(req, res); }); // get document size stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getDocumentSizeStatsRouteHandler(req, res); }); // get documentsizes history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getDocumentSizeHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getDocumentSizeNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getDocumentSizeRouteHandler(req, res); }); diff --git a/src/routes/management/documenttemplates.js b/src/routes/management/documenttemplates.js index 2357edc..6448f1c 100644 --- a/src/routes/management/documenttemplates.js +++ b/src/routes/management/documenttemplates.js @@ -30,15 +30,15 @@ import { } from '../../services/management/documenttemplates.js'; // list of document templates -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listDocumentTemplatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,37 +46,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listDocumentTemplatesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getDocumentTemplatePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchDocumentTemplatesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newDocumentTemplateRouteHandler(req, res); }); // get document template stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getDocumentTemplateStatsRouteHandler(req, res); }); // get document template history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getDocumentTemplateHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getDocumentTemplateNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getDocumentTemplateRouteHandler(req, res); }); diff --git a/src/routes/management/filaments.js b/src/routes/management/filaments.js index 0a784c9..b32a75e 100644 --- a/src/routes/management/filaments.js +++ b/src/routes/management/filaments.js @@ -33,7 +33,7 @@ import { } from '../../services/management/filaments.js'; // list of filaments -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; @@ -42,7 +42,7 @@ router.get('/', isAuthenticated, (req, res) => { for (const [key, value] of Object.entries(req.query)) { for (var i = 0; i < listAllowedFilters.length; i++) { if (key == listAllowedFilters[i]) { - filter = { ...filter, ...parseFilter(key, value) }; + filter = { ...filter, ...(await parseFilter(key, value)) }; } } } @@ -50,9 +50,9 @@ router.get('/', isAuthenticated, (req, res) => { listFilamentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -60,37 +60,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listFilamentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getFilamentPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchFilamentsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newFilamentRouteHandler(req, res); }); // get filament stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getFilamentStatsRouteHandler(req, res); }); // get filaments history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getFilamentHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getFilamentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getFilamentRouteHandler(req, res); }); diff --git a/src/routes/management/filamentskus.js b/src/routes/management/filamentskus.js index 32422a1..b5fe72a 100644 --- a/src/routes/management/filamentskus.js +++ b/src/routes/management/filamentskus.js @@ -32,15 +32,15 @@ import { getFilamentSkuNeighborsRouteHandler, } from '../../services/management/filamentskus.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listFilamentSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -48,34 +48,34 @@ router.get('/properties', isAuthenticated, (req, res) => { listFilamentSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getFilamentSkuPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchFilamentSkusRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newFilamentSkuRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getFilamentSkuStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getFilamentSkuHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getFilamentSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getFilamentSkuRouteHandler(req, res); }); diff --git a/src/routes/management/files.js b/src/routes/management/files.js index ce86b80..b9c9a9f 100644 --- a/src/routes/management/files.js +++ b/src/routes/management/files.js @@ -34,15 +34,15 @@ import { } from '../../services/management/files.js'; // list of files -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -50,49 +50,49 @@ router.get('/properties', isAuthenticated, (req, res) => { listFilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getFilePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchFilesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newFileRouteHandler(req, res); }); // get file stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getFileStatsRouteHandler(req, res); }); // get file history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getFileHistoryRouteHandler(req, res); }); -router.delete('/:id/flush', isAuthenticated, (req, res) => { +router.delete('/:id/flush', isAuthenticated, async (req, res) => { flushFileRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getFileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getFileRouteHandler(req, res); }); -router.get('/:id/content', isAuthenticated, (req, res) => { +router.get('/:id/content', isAuthenticated, async (req, res) => { getFileContentRouteHandler(req, res); }); -router.get('/:id/thumbnail', isAuthenticated, (req, res) => { +router.get('/:id/thumbnail', isAuthenticated, async (req, res) => { getFileThumbnailRouteHandler(req, res); }); diff --git a/src/routes/management/hosts.js b/src/routes/management/hosts.js index 116e3f6..9358e21 100644 --- a/src/routes/management/hosts.js +++ b/src/routes/management/hosts.js @@ -29,15 +29,15 @@ import { } from '../../services/management/hosts.js'; // list of hosts -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listHostsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listHostsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getHostPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchHostsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newHostRouteHandler(req, res); }); // get host stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getHostStatsRouteHandler(req, res); }); // get hosts history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getHostHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getHostNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getHostRouteHandler(req, res); }); diff --git a/src/routes/management/materials.js b/src/routes/management/materials.js index 672aad4..4616f7c 100644 --- a/src/routes/management/materials.js +++ b/src/routes/management/materials.js @@ -28,7 +28,7 @@ import { } from '../../services/management/materials.js'; // list of materials -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; @@ -36,16 +36,16 @@ router.get('/', isAuthenticated, (req, res) => { for (const [key, value] of Object.entries(req.query)) { if (listAllowedFilters.includes(key)) { - filter = { ...filter, ...parseFilter(key, value) }; + filter = { ...filter, ...(await parseFilter(key, value)) }; } } listMaterialsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -53,37 +53,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listMaterialsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getMaterialPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchMaterialsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newMaterialRouteHandler(req, res); }); // get material stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getMaterialStatsRouteHandler(req, res); }); // get materials history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getMaterialHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getMaterialNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getMaterialRouteHandler(req, res); }); diff --git a/src/routes/management/notetypes.js b/src/routes/management/notetypes.js index d191e26..7cf2e27 100644 --- a/src/routes/management/notetypes.js +++ b/src/routes/management/notetypes.js @@ -30,15 +30,15 @@ import { } from '../../services/management/notetypes.js'; // list of note types -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listNoteTypesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,37 +46,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listNoteTypesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getNoteTypePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchNoteTypesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newNoteTypeRouteHandler(req, res); }); // get note type stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getNoteTypeStatsRouteHandler(req, res); }); // get notetypes history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getNoteTypeHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getNoteTypeNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getNoteTypeRouteHandler(req, res); }); diff --git a/src/routes/management/parts.js b/src/routes/management/parts.js index 4507e42..c55e9aa 100644 --- a/src/routes/management/parts.js +++ b/src/routes/management/parts.js @@ -29,15 +29,15 @@ import { } from '../../services/management/parts.js'; // list of parts -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPartsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listPartsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPartPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPartsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPartRouteHandler(req, res); }); // get part stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPartStatsRouteHandler(req, res); }); // get parts history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPartHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPartNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPartRouteHandler(req, res); }); diff --git a/src/routes/management/partskus.js b/src/routes/management/partskus.js index 5d61699..2dfc7f8 100644 --- a/src/routes/management/partskus.js +++ b/src/routes/management/partskus.js @@ -32,15 +32,15 @@ import { getPartSkuNeighborsRouteHandler } from '../../services/management/partskus.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPartSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -48,35 +48,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listPartSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPartSkuPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPartSkusRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPartSkuRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPartSkuStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPartSkuHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPartSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPartSkuRouteHandler(req, res); }); diff --git a/src/routes/management/productcategories.js b/src/routes/management/productcategories.js index b539190..0fcc505 100644 --- a/src/routes/management/productcategories.js +++ b/src/routes/management/productcategories.js @@ -21,15 +21,15 @@ const router = express.Router(); const listAllowedFilters = ['_id','name','createdAt','updatedAt','_reference']; const propertiesAllowedFilters = ['name']; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listProductCategoriesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { const properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -37,35 +37,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listProductCategoriesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getProductCategoryPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchProductCategoriesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newProductCategoryRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getProductCategoryStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getProductCategoryHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getProductCategoryNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getProductCategoryRouteHandler(req, res); }); diff --git a/src/routes/management/products.js b/src/routes/management/products.js index eb6bebb..8c830cf 100644 --- a/src/routes/management/products.js +++ b/src/routes/management/products.js @@ -31,15 +31,15 @@ import { } from '../../services/management/products.js'; // list of products -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listProductsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -47,37 +47,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listProductsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getProductPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchProductsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newProductRouteHandler(req, res); }); // get product stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getProductStatsRouteHandler(req, res); }); // get products history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getProductHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getProductNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getProductRouteHandler(req, res); }); diff --git a/src/routes/management/productskus.js b/src/routes/management/productskus.js index 4b51e6f..e5cb3b0 100644 --- a/src/routes/management/productskus.js +++ b/src/routes/management/productskus.js @@ -32,15 +32,15 @@ import { getProductSkuNeighborsRouteHandler } from '../../services/management/productskus.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listProductSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -48,35 +48,35 @@ router.get('/properties', isAuthenticated, (req, res) => { listProductSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getProductSkuPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchProductSkusRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newProductSkuRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getProductSkuStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getProductSkuHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getProductSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getProductSkuRouteHandler(req, res); }); diff --git a/src/routes/management/taxrates.js b/src/routes/management/taxrates.js index 603c7d3..f247f20 100644 --- a/src/routes/management/taxrates.js +++ b/src/routes/management/taxrates.js @@ -31,15 +31,15 @@ import { } from '../../services/management/taxrates.js'; // list of tax rates -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listTaxRatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -47,37 +47,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listTaxRatesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getTaxRatePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchTaxRatesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newTaxRateRouteHandler(req, res); }); // get tax rate stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getTaxRateStatsRouteHandler(req, res); }); // get tax rate history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getTaxRateHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getTaxRateNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getTaxRateRouteHandler(req, res); }); diff --git a/src/routes/management/users.js b/src/routes/management/users.js index 1be139d..baeb3f2 100644 --- a/src/routes/management/users.js +++ b/src/routes/management/users.js @@ -30,15 +30,15 @@ import { } from '../../services/management/users.js'; // list of document templates -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listUsersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,33 +46,33 @@ router.get('/properties', isAuthenticated, (req, res) => { listUsersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getUserPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchUsersRouteHandler(req, res, search); }); // get user stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getUserStatsRouteHandler(req, res); }); // get user history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getUserHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getUserNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getUserRouteHandler(req, res); }); diff --git a/src/routes/management/vendors.js b/src/routes/management/vendors.js index 7bfd9b0..9162d79 100644 --- a/src/routes/management/vendors.js +++ b/src/routes/management/vendors.js @@ -29,15 +29,15 @@ import { } from '../../services/management/vendors.js'; // list of vendors -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listVendorsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listVendorsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getVendorPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchVendorsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newVendorRouteHandler(req, res); }); // get vendor stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getVendorStatsRouteHandler(req, res); }); // get vendors history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getVendorHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getVendorNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getVendorRouteHandler(req, res); }); diff --git a/src/routes/misc/notes.js b/src/routes/misc/notes.js index 0c89135..fa388ac 100644 --- a/src/routes/misc/notes.js +++ b/src/routes/misc/notes.js @@ -26,15 +26,15 @@ const listAllowedFilters = [ const propertiesAllowedFilters = ['parent']; // list of notes -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listNotesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -42,33 +42,33 @@ router.get('/properties', isAuthenticated, (req, res) => { listNotesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getNotePropertyValuesRouteHandler(req, res, property); }); // create new note -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newNoteRouteHandler(req, res); }); // get note stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getNoteStatsRouteHandler(req, res); }); // get note history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getNoteHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getNoteNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getNoteRouteHandler(req, res); }); diff --git a/src/routes/misc/notifications.js b/src/routes/misc/notifications.js index 3eb9ffb..c0f571a 100644 --- a/src/routes/misc/notifications.js +++ b/src/routes/misc/notifications.js @@ -11,26 +11,26 @@ import { getFilter } from '../../utils.js'; const router = express.Router(); -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page = 1, limit = 50, sort = 'createdAt', order = 'descend' } = req.query; const allowedFilters = ['user']; - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); listNotificationsRouteHandler(req, res, page, limit, filter, sort, order); }); -router.put('/read-all', isAuthenticated, (req, res) => { +router.put('/read-all', isAuthenticated, async (req, res) => { markAllNotificationsAsReadRouteHandler(req, res); }); -router.put('/:id/read', isAuthenticated, (req, res) => { +router.put('/:id/read', isAuthenticated, async (req, res) => { markNotificationAsReadRouteHandler(req, res); }); -router.delete('/', isAuthenticated, (req, res) => { +router.delete('/', isAuthenticated, async (req, res) => { deleteAllNotificationsRouteHandler(req, res); }); -router.delete('/:id', isAuthenticated, (req, res) => { +router.delete('/:id', isAuthenticated, async (req, res) => { deleteNotificationRouteHandler(req, res); }); diff --git a/src/routes/misc/usernotifiers.js b/src/routes/misc/usernotifiers.js index 961849d..954f285 100644 --- a/src/routes/misc/usernotifiers.js +++ b/src/routes/misc/usernotifiers.js @@ -11,26 +11,26 @@ import { getFilter } from '../../utils.js'; const router = express.Router(); -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; const allowedFilters = ['user', 'object', 'objectType']; - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); listUserNotifiersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newUserNotifierRouteHandler(req, res); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getUserNotifierRouteHandler(req, res); }); -router.put('/:id', isAuthenticated, (req, res) => { +router.put('/:id', isAuthenticated, async (req, res) => { editUserNotifierRouteHandler(req, res); }); -router.delete('/:id', isAuthenticated, (req, res) => { +router.delete('/:id', isAuthenticated, async (req, res) => { deleteUserNotifierRouteHandler(req, res); }); diff --git a/src/routes/production/filamentprofiles.js b/src/routes/production/filamentprofiles.js index 1194d65..c1bf29e 100644 --- a/src/routes/production/filamentprofiles.js +++ b/src/routes/production/filamentprofiles.js @@ -19,15 +19,15 @@ const router = express.Router(); const listAllowedFilters = ['_id','name','createdAt','updatedAt','_reference']; const propertiesAllowedFilters = ['name']; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listFilamentProfilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { const properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -35,34 +35,34 @@ router.get('/properties', isAuthenticated, (req, res) => { listFilamentProfilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getFilamentProfilePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { searchFilamentProfilesRouteHandler(req, res, req.query.search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newFilamentProfileRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getFilamentProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getFilamentProfileRouteHandler(req, res); }); -router.put('/:id', isAuthenticated, (req, res) => { +router.put('/:id', isAuthenticated, async (req, res) => { editFilamentProfileRouteHandler(req, res); }); -router.delete('/:id', isAuthenticated, (req, res) => { +router.delete('/:id', isAuthenticated, async (req, res) => { deleteFilamentProfileRouteHandler(req, res); }); diff --git a/src/routes/production/gcodefiles.js b/src/routes/production/gcodefiles.js index 7747011..69912a7 100644 --- a/src/routes/production/gcodefiles.js +++ b/src/routes/production/gcodefiles.js @@ -31,15 +31,15 @@ import { import { convertPropertiesString, getFilter } from '../../utils.js'; // list of gcodeFiles -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listGCodeFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -47,37 +47,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listGCodeFilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getGCodeFilePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchGCodeFilesRouteHandler(req, res, search); }); // create new gcodeFile -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newGCodeFileRouteHandler(req, res); }); // get gcodeFile stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getGCodeFileStatsRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getGCodeFileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getGCodeFileRouteHandler(req, res); }); -router.get('/:id/content', isAuthenticated, (req, res) => { +router.get('/:id/content', isAuthenticated, async (req, res) => { getGCodeFileContentRouteHandler(req, res); }); diff --git a/src/routes/production/jobs.js b/src/routes/production/jobs.js index 16681cc..f6d447a 100644 --- a/src/routes/production/jobs.js +++ b/src/routes/production/jobs.js @@ -29,15 +29,15 @@ import { import { convertPropertiesString, getFilter } from '../../utils.js'; // list of jobs -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,36 +45,36 @@ router.get('/properties', isAuthenticated, (req, res) => { listJobsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getJobPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchJobsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newJobRouteHandler(req, res); }); // get job stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getJobStatsRouteHandler(req, res); }); // get job history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getJobHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getJobRouteHandler(req, res); }); diff --git a/src/routes/production/printerprofiles.js b/src/routes/production/printerprofiles.js index 62b3e6d..a4baa45 100644 --- a/src/routes/production/printerprofiles.js +++ b/src/routes/production/printerprofiles.js @@ -19,15 +19,15 @@ const router = express.Router(); const listAllowedFilters = ['_id','name','createdAt','updatedAt','_reference']; const propertiesAllowedFilters = ['name']; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPrinterProfilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { const properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -35,34 +35,34 @@ router.get('/properties', isAuthenticated, (req, res) => { listPrinterProfilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPrinterProfilePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { searchPrinterProfilesRouteHandler(req, res, req.query.search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPrinterProfileRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPrinterProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPrinterProfileRouteHandler(req, res); }); -router.put('/:id', isAuthenticated, (req, res) => { +router.put('/:id', isAuthenticated, async (req, res) => { editPrinterProfileRouteHandler(req, res); }); -router.delete('/:id', isAuthenticated, (req, res) => { +router.delete('/:id', isAuthenticated, async (req, res) => { deletePrinterProfileRouteHandler(req, res); }); diff --git a/src/routes/production/printers.js b/src/routes/production/printers.js index 9f10f66..0e185d2 100644 --- a/src/routes/production/printers.js +++ b/src/routes/production/printers.js @@ -30,15 +30,15 @@ const listAllowedFilters = [ ]; const propertiesAllowedFilters = ['tags']; // list of printers -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -46,37 +46,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listPrintersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getPrinterPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchPrintersRouteHandler(req, res, search); }); // create new printer -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newPrinterRouteHandler(req, res); }); // get printer history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getPrinterHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getPrinterNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); // get printer stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getPrinterStatsRouteHandler(req, res); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getPrinterRouteHandler(req, res); }); diff --git a/src/routes/production/subjobs.js b/src/routes/production/subjobs.js index 84ccec7..b2e1934 100644 --- a/src/routes/production/subjobs.js +++ b/src/routes/production/subjobs.js @@ -26,15 +26,15 @@ import { import { getFilter, convertPropertiesString } from '../../utils.js'; // list of sub jobs -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listSubJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -42,32 +42,32 @@ router.get('/properties', isAuthenticated, (req, res) => { listSubJobsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getSubJobPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchSubJobsRouteHandler(req, res, search); }); // get sub job stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getSubJobStatsRouteHandler(req, res); }); // get sub job history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getSubJobHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getSubJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getSubJobRouteHandler(req, res); }); diff --git a/src/routes/sales/clients.js b/src/routes/sales/clients.js index adcd84b..27aef36 100644 --- a/src/routes/sales/clients.js +++ b/src/routes/sales/clients.js @@ -29,15 +29,15 @@ import { } from '../../services/sales/clients.js'; // list of clients -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listClientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -45,37 +45,37 @@ router.get('/properties', isAuthenticated, (req, res) => { listClientsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getClientPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchClientsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newClientRouteHandler(req, res); }); // get client stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getClientStatsRouteHandler(req, res); }); // get clients history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getClientHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getClientNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getClientRouteHandler(req, res); }); diff --git a/src/routes/sales/listings.js b/src/routes/sales/listings.js index 24bede1..8955c0e 100644 --- a/src/routes/sales/listings.js +++ b/src/routes/sales/listings.js @@ -44,15 +44,15 @@ import { getListingNeighborsRouteHandler } from '../../services/sales/listings.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listListingsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -60,42 +60,42 @@ router.get('/properties', isAuthenticated, (req, res) => { listListingsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getListingPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchListingsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newListingRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getListingStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getListingHistoryRouteHandler(req, res); }); -router.post('/:id/publish', isAuthenticated, (req, res) => { +router.post('/:id/publish', isAuthenticated, async (req, res) => { publishListingRouteHandler(req, res); }); -router.post('/:id/unpublish', isAuthenticated, (req, res) => { +router.post('/:id/unpublish', isAuthenticated, async (req, res) => { unpublishListingRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getListingNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getListingRouteHandler(req, res); }); diff --git a/src/routes/sales/listingvarients.js b/src/routes/sales/listingvarients.js index 996377a..fa6e2e5 100644 --- a/src/routes/sales/listingvarients.js +++ b/src/routes/sales/listingvarients.js @@ -42,15 +42,15 @@ import { getListingVarientNeighborsRouteHandler } from '../../services/sales/listingvarients.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listListingVarientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -58,43 +58,43 @@ router.get('/properties', isAuthenticated, (req, res) => { listListingVarientsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getListingVarientPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchListingVarientsRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newListingVarientRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getListingVarientStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getListingVarientHistoryRouteHandler(req, res); }); -router.post('/:id/publish', isAuthenticated, (req, res) => { +router.post('/:id/publish', isAuthenticated, async (req, res) => { publishListingVarientRouteHandler(req, res); }); -router.post('/:id/unpublish', isAuthenticated, (req, res) => { +router.post('/:id/unpublish', isAuthenticated, async (req, res) => { unpublishListingVarientRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getListingVarientNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getListingVarientRouteHandler(req, res); }); diff --git a/src/routes/sales/marketplaces.js b/src/routes/sales/marketplaces.js index 0a7604c..b0d1189 100644 --- a/src/routes/sales/marketplaces.js +++ b/src/routes/sales/marketplaces.js @@ -37,15 +37,15 @@ import { getMarketplaceNeighborsRouteHandler } from '../../services/sales/marketplaces.js'; -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listMarketplacesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -53,60 +53,60 @@ router.get('/properties', isAuthenticated, (req, res) => { listMarketplacesByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getMarketplacePropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchMarketplacesRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newMarketplaceRouteHandler(req, res); }); -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getMarketplaceStatsRouteHandler(req, res); }); -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getMarketplaceHistoryRouteHandler(req, res); }); -router.get('/:id/auth/url', isAuthenticated, (req, res) => { +router.get('/:id/auth/url', isAuthenticated, async (req, res) => { getMarketplaceAuthUrlRouteHandler(req, res); }); -router.post('/:id/auth/exchange', isAuthenticated, (req, res) => { +router.post('/:id/auth/exchange', isAuthenticated, async (req, res) => { exchangeMarketplaceAuthCodeRouteHandler(req, res); }); -router.post('/:id/auth/refresh', isAuthenticated, (req, res) => { +router.post('/:id/auth/refresh', isAuthenticated, async (req, res) => { refreshMarketplaceAuthRouteHandler(req, res); }); -router.post('/:id/sync/items', isAuthenticated, (req, res) => { +router.post('/:id/sync/items', isAuthenticated, async (req, res) => { syncMarketplaceItemsRouteHandler(req, res); }); -router.post('/:id/sync/orders', isAuthenticated, (req, res) => { +router.post('/:id/sync/orders', isAuthenticated, async (req, res) => { syncMarketplaceOrdersRouteHandler(req, res); }); // Webhook endpoint — no auth, provider verifies via signature -router.post('/:id/hook', (req, res) => { +router.post('/:id/hook', async (req, res) => { marketplaceWebhookRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getMarketplaceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getMarketplaceRouteHandler(req, res); }); diff --git a/src/routes/sales/salesorders.js b/src/routes/sales/salesorders.js index 23772bf..2d22208 100644 --- a/src/routes/sales/salesorders.js +++ b/src/routes/sales/salesorders.js @@ -33,52 +33,52 @@ import { } from '../../services/sales/salesorders.js'; // list of sales orders -router.get('/', isAuthenticated, (req, res) => { +router.get('/', isAuthenticated, async (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); listSalesOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); -router.get('/properties', isAuthenticated, (req, res) => { +router.get('/properties', isAuthenticated, async (req, res) => { let properties = convertPropertiesString(req.query.properties); - const filter = getFilter(req.query, propertiesAllowedFilters, false); + const filter = await getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { - masterFilter = getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); + masterFilter = await getFilter(JSON.parse(req.query.masterFilter), propertiesAllowedFilters, true); } listSalesOrdersByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); -router.get('/values', isAuthenticated, (req, res) => { +router.get('/values', isAuthenticated, async (req, res) => { const { property } = req.query; getSalesOrderPropertyValuesRouteHandler(req, res, property); }); -router.get('/search', isAuthenticated, (req, res) => { +router.get('/search', isAuthenticated, async (req, res) => { const { search } = req.query; searchSalesOrdersRouteHandler(req, res, search); }); -router.post('/', isAuthenticated, (req, res) => { +router.post('/', isAuthenticated, async (req, res) => { newSalesOrderRouteHandler(req, res); }); // get sales order stats -router.get('/stats', isAuthenticated, (req, res) => { +router.get('/stats', isAuthenticated, async (req, res) => { getSalesOrderStatsRouteHandler(req, res); }); // get sales orders history -router.get('/history', isAuthenticated, (req, res) => { +router.get('/history', isAuthenticated, async (req, res) => { getSalesOrderHistoryRouteHandler(req, res); }); -router.get('/neighbors', isAuthenticated, (req, res) => { +router.get('/neighbors', isAuthenticated, async (req, res) => { const { property, search, sort, order, id } = req.query; - const filter = getFilter(req.query, listAllowedFilters); + const filter = await getFilter(req.query, listAllowedFilters); getSalesOrderNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); }); -router.get('/:id', isAuthenticated, (req, res) => { +router.get('/:id', isAuthenticated, async (req, res) => { getSalesOrderRouteHandler(req, res); }); diff --git a/src/services/misc/csv.js b/src/services/misc/csv.js index 2255e46..682c604 100644 --- a/src/services/misc/csv.js +++ b/src/services/misc/csv.js @@ -74,7 +74,7 @@ export async function exportToCsv({ objectType, filter = {}, sort, order, limit export const csvExportRouteHandler = async (req, res) => { const objectType = req.params.objectType; const allowedFilters = getModelFilterFields(objectType); - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); const { sort, order } = parseOrderBy(req.query.$orderby); const result = await exportToCsv({ diff --git a/src/services/misc/excel.js b/src/services/misc/excel.js index 070d082..d638084 100644 --- a/src/services/misc/excel.js +++ b/src/services/misc/excel.js @@ -83,7 +83,7 @@ export async function exportToExcel({ objectType, filter = {}, sort, order, limi export const excelExportRouteHandler = async (req, res) => { const objectType = req.params.objectType; const allowedFilters = getModelFilterFields(objectType); - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); const { sort, order } = parseOrderBy(req.query.$orderby); const result = await exportToExcel({ @@ -113,7 +113,7 @@ export const excelOpenRouteHandler = async (req, res) => { const objectType = req.params.objectType; logger.info('[Excel Open] POST received', { objectType, query: req.query }); const allowedFilters = getModelFilterFields(objectType); - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); const { sort, order } = parseOrderBy(req.query.$orderby); const entry = getModelByName(objectType); diff --git a/src/services/misc/odata.js b/src/services/misc/odata.js index 2d49d22..75d4bc1 100644 --- a/src/services/misc/odata.js +++ b/src/services/misc/odata.js @@ -247,7 +247,7 @@ ${entitySets} * Route handler for GET /odata/$metadata * Returns OData 4.0 CSDL metadata document for Power BI / OData clients. */ -export const metadataODataRouteHandler = (req, res) => { +export const metadataODataRouteHandler = async (req, res) => { const xml = buildMetadataXml(); res.set('OData-Version', '4.0'); res.set('Content-Type', 'application/xml'); @@ -289,7 +289,7 @@ export const listODataRouteHandler = async (req, res) => { // Build filter from query params - allow common filter keys per model const allowedFilters = getModelFilterFields(objectType); - const filter = getFilter(req.query, allowedFilters); + const filter = await getFilter(req.query, allowedFilters); const result = await listObjectsOData({ model: entry.model, diff --git a/src/services/misc/rss.js b/src/services/misc/rss.js index fd0a99c..f7ab165 100644 --- a/src/services/misc/rss.js +++ b/src/services/misc/rss.js @@ -91,7 +91,7 @@ export const listRssRouteHandler = async (req, res) => { const page = Math.floor(skip / limit) + 1; const { sort, order } = parseOrderBy($orderby); const allowedFilters = getModelFilterFields(objectType); - const filter = getFilter(queryWithoutAuth, allowedFilters); + const filter = await getFilter(queryWithoutAuth, allowedFilters); const result = await listObjectsOData({ model: entry.model, diff --git a/src/utils.js b/src/utils.js index 037b69d..904c966 100644 --- a/src/utils.js +++ b/src/utils.js @@ -83,6 +83,108 @@ function isBooleanField(property, model = null) { return found; } +function isObjectIdPath(property) { + return property === '_id' || property.endsWith('._id'); +} + +function getBaseProperty(property) { + if (property === '_id') return '_id'; + if (property.endsWith('._id')) return property.slice(0, -4); + return property; +} + +function isObjectIdSchemaType(path) { + return path?.instance === 'ObjectId' || path?.instance === 'ObjectID'; +} + +function getSchemaPathFromModels(property, model = null) { + if (model?.schema?.path(property)) return model.schema.path(property); + for (const entry of Object.values(models)) { + const path = entry.model?.schema?.path(property); + if (path) return path; + } + return null; +} + +function getFilterFieldKind(property, model = null) { + const baseProperty = getBaseProperty(property); + + const inspectPath = (path) => { + if (!path) return null; + + if (isObjectIdPath(property) || isObjectIdSchemaType(path)) { + if (property.endsWith('._id') && property !== '_id' && path.options?.ref) { + return { kind: 'objectId', property: baseProperty }; + } + if (path.options?.ref) { + return { kind: 'objectRef', property: baseProperty, ref: path.options.ref }; + } + return { kind: 'objectId', property: baseProperty }; + } + + return { kind: 'default', property: baseProperty }; + }; + + if (model) { + return ( + inspectPath(model.schema?.path(baseProperty)) || { + kind: 'default', + property: baseProperty, + } + ); + } + + const path = getSchemaPathFromModels(baseProperty); + const kind = inspectPath(path); + if (kind) return kind; + + return { kind: 'default', property: baseProperty }; +} + +function parsePrefixedValue(value) { + const trimmed = String(value).trim(); + if (trimmed.length > 4 && trimmed.charAt(3) === ':') { + return { + prefix: trimmed.slice(0, 3).toUpperCase(), + suffix: trimmed.slice(4).trim(), + hadPrefix: true, + }; + } + return { prefix: null, suffix: trimmed, hadPrefix: false }; +} + +function buildRegexOp(pattern, useOptions = true) { + const op = { $regex: pattern }; + if (useOptions) op.$options = 'i'; + return op; +} + +function getSchemaRefName(property, model = null) { + const baseProperty = getBaseProperty(property); + const path = model?.schema?.path(baseProperty) ?? getSchemaPathFromModels(baseProperty); + return path?.options?.ref ?? path?.caster?.options?.ref ?? path?.path ?? null; +} + +function getRefModelEntryFromSchemaRef(refName) { + if (!refName) return null; + + let refModel; + try { + refModel = mongoose.model(refName); + } catch { + refModel = getModelByName(refName)?.model ?? null; + } + + if (!refModel) return null; + + const registryEntry = getModelByName(refName); + return { + model: refModel, + idField: registryEntry?.idField ?? '_id', + referenceField: registryEntry?.referenceField ?? '_reference', + }; +} + function parseBooleanOperand(value) { const lower = String(value).trim().toLowerCase(); if (lower === 'yes') return true; @@ -251,8 +353,14 @@ function stripIgnoreCase(str) { } // Builds an equality condition (value, date range, or wildcard regex). -function buildEquality(value, isDateField, isBooleanField = false) { +function buildEquality(value, isDateField, isBooleanField = false, isObjectIdField = false) { if (isBooleanField) return buildBooleanEquality(value); + if (isObjectIdField) { + const { suffix } = parsePrefixedValue(value); + if (/[*?]/.test(suffix)) return NO_MATCH_CONDITION; + if (isObjectIdString(suffix)) return { value: new mongoose.Types.ObjectId(suffix) }; + return NO_MATCH_CONDITION; + } if (isDateField) { const start = parseDateOperand(value, 'start'); const end = parseDateOperand(value, 'end'); @@ -263,12 +371,27 @@ function buildEquality(value, isDateField, isBooleanField = false) { if (lower === 'false') return { value: false }; if (isObjectIdString(value)) return { value: new mongoose.Types.ObjectId(value) }; if (isNumeric(value)) return { value: Number(value) }; - return { op: { $regex: buildWildcardRegexPattern(value), $options: 'i' } }; + return { op: buildRegexOp(buildWildcardRegexPattern(value)) }; } // Builds a comparison condition for a single operator. -function buildComparison(name, value, isDateField, isBooleanField = false) { +function buildComparison( + name, + value, + isDateField, + isBooleanField = false, + isObjectIdField = false +) { if (isBooleanField) return buildBooleanComparison(name, value); + if (isObjectIdField) { + const { suffix } = parsePrefixedValue(value); + if (/[*?]/.test(suffix)) return NO_MATCH_CONDITION; + if (name === 'eq') return buildEquality(suffix, false, false, true); + if (name === 'ne' && isObjectIdString(suffix)) { + return { op: { $ne: new mongoose.Types.ObjectId(suffix) } }; + } + return NO_MATCH_CONDITION; + } if (name === 'eq') return buildEquality(value, isDateField); if (name === 'ne') { @@ -278,7 +401,7 @@ function buildComparison(name, value, isDateField, isBooleanField = false) { if (start && end) return { op: { $not: { $gte: start, $lte: end } } }; } if (/[*?]/.test(value)) { - return { op: { $not: { $regex: buildWildcardRegexPattern(value), $options: 'i' } } }; + return { op: { $not: buildRegexOp(buildWildcardRegexPattern(value)) } }; } return { op: { $ne: coerceScalar(value) } }; } @@ -288,33 +411,7 @@ function buildComparison(name, value, isDateField, isBooleanField = false) { return { op: { [`$${name}`]: coerceBoundary(value, isDateField, boundary) } }; } -// Parses a leaf token (range, comparison, or plain value) into a condition. -function parseLeafCondition(rawToken, isDateField, isBooleanField = false) { - const token = rawToken.trim(); - if (token === '') { - if (isBooleanField) return NO_MATCH_CONDITION; - return { op: { $regex: '^$', $options: 'i' } }; - } - - // Interval: a..b, ..b, a.. - const rangeIdx = token.indexOf('..'); - if (rangeIdx !== -1) { - if (isBooleanField) { - const lo = stripIgnoreCase(token.slice(0, rangeIdx).trim()); - const hi = stripIgnoreCase(token.slice(rangeIdx + 2).trim()); - if (lo !== '' || hi !== '') return NO_MATCH_CONDITION; - } - const lo = stripIgnoreCase(token.slice(0, rangeIdx).trim()); - const hi = stripIgnoreCase(token.slice(rangeIdx + 2).trim()); - const op = {}; - if (lo !== '') op.$gte = coerceBoundary(lo, isDateField, 'start'); - if (hi !== '') op.$lte = coerceBoundary(hi, isDateField, 'end'); - // A bare ".." places no constraint on the field. - if (Object.keys(op).length === 0) return { query: {} }; - return { op }; - } - - // Comparison operators, longest symbols first. +function parseLeafComparisonOperators(token, isDateField, isBooleanField, isObjectIdField) { const operators = [ ['<>', 'ne'], ['>=', 'gte'], @@ -329,12 +426,50 @@ function parseLeafCondition(rawToken, isDateField, isBooleanField = false) { name, stripIgnoreCase(token.slice(symbol.length).trim()), isDateField, - isBooleanField + isBooleanField, + isObjectIdField ); } } + return null; +} - return buildEquality(stripIgnoreCase(token), isDateField, isBooleanField); +// Parses a leaf token (range, comparison, or plain value) into a condition. +function parseLeafCondition( + rawToken, + isDateField, + isBooleanField = false, + isObjectIdField = false +) { + const token = rawToken.trim(); + if (token === '') { + if (isBooleanField || isObjectIdField) return NO_MATCH_CONDITION; + return { op: buildRegexOp('^$') }; + } + + // Interval: a..b, ..b, a.. + const rangeIdx = token.indexOf('..'); + if (rangeIdx !== -1) { + if (isBooleanField || isObjectIdField) return NO_MATCH_CONDITION; + const lo = stripIgnoreCase(token.slice(0, rangeIdx).trim()); + const hi = stripIgnoreCase(token.slice(rangeIdx + 2).trim()); + const op = {}; + if (lo !== '') op.$gte = coerceBoundary(lo, isDateField, 'start'); + if (hi !== '') op.$lte = coerceBoundary(hi, isDateField, 'end'); + // A bare ".." places no constraint on the field. + if (Object.keys(op).length === 0) return { query: {} }; + return { op }; + } + + const comparison = parseLeafComparisonOperators( + token, + isDateField, + isBooleanField, + isObjectIdField + ); + if (comparison) return comparison; + + return buildEquality(stripIgnoreCase(token), isDateField, isBooleanField, isObjectIdField); } // Converts a condition descriptor into a MongoDB query object for `property`. @@ -365,57 +500,238 @@ function combineAnd(children, property) { } // Combines OR-ed conditions, collapsing to $in or a single regex when possible. -function combineOr(children, property) { +function combineOr(children, property, isObjectIdField = false) { if (children.every((child) => child.value !== undefined)) { return { op: { $in: children.map((child) => child.value) } }; } - if (children.every((child) => child.op && isOnlyRegex(child.op))) { + if (!isObjectIdField && children.every((child) => child.op && isOnlyRegex(child.op))) { const pattern = children.map((child) => child.op.$regex).join('|'); - return { op: { $regex: pattern, $options: 'i' } }; + const op = { $regex: pattern }; + if (children[0].op.$options) op.$options = children[0].op.$options; + return { op }; } return { query: { $or: children.map((child) => conditionToQuery(child, property)) } }; } -function buildCondition(node, property, isDateField, isBooleanField = false) { +function buildCondition( + node, + property, + isDateField, + isBooleanField = false, + isObjectIdField = false +) { if (node.type === 'leaf') { - return parseLeafCondition(node.token, isDateField, isBooleanField); + return parseLeafCondition(node.token, isDateField, isBooleanField, isObjectIdField); } const children = node.items.map((item) => - buildCondition(item, property, isDateField, isBooleanField) + buildCondition(item, property, isDateField, isBooleanField, isObjectIdField) ); - return node.type === 'and' ? combineAnd(children, property) : combineOr(children, property); + return node.type === 'and' + ? combineAnd(children, property) + : combineOr(children, property, isObjectIdField); } -function parseFilter(property, value, model = null) { +function idsToCondition(ids) { + if (!ids || ids.length === 0) return NO_MATCH_CONDITION; + if (ids.length === 1) return { value: ids[0] }; + return { op: { $in: ids } }; +} + +function extractObjectIdFromOperand(operand) { + const { suffix } = parsePrefixedValue(stripIgnoreCase(String(operand).trim())); + if (isObjectIdString(suffix)) { + return new mongoose.Types.ObjectId(suffix); + } + return null; +} + +const REF_OPERATOR_SYMBOLS = { + eq: '', + ne: '<>', + gt: '>', + gte: '>=', + lt: '<', + lte: '<=', +}; + +function buildRefListExpression(operator, operand) { + const text = String(operand).trim(); + if (operator === 'eq') return text; + return `${REF_OPERATOR_SYMBOLS[operator]}${text}`; +} + +// Pre-list the referenced model, matching the expression against name and/or _reference via parseFilter. +async function listRefModelIds(refModelEntry, expression) { + const refModel = refModelEntry.model; + const orClauses = []; + + if (refModel.schema.path('name')) { + orClauses.push(await parseFilter('name', expression, refModel)); + } + if (refModel.schema.path('_reference')) { + orClauses.push(await parseFilter('_reference', expression, refModel)); + } + + if (orClauses.length === 0) return []; + + const query = orClauses.length === 1 ? orClauses[0] : { $or: orClauses }; + const docs = await refModel.find(query).select('_id').lean(); + return docs.map((doc) => doc._id); +} + +function conditionToIds(cond) { + if (cond.query) return null; + if (cond.value !== undefined) return [cond.value]; + if (cond.op?.$in) return cond.op.$in; + return null; +} + +function combineOrRefIds(children) { + const ids = new Set(); + for (const child of children) { + if (child.query) return child; + const childIds = conditionToIds(child); + if (!childIds) return child; + childIds.forEach((id) => ids.add(String(id))); + } + return idsToCondition([...ids].map((id) => new mongoose.Types.ObjectId(id))); +} + +function combineAndRefIds(children) { + let ids = null; + for (const child of children) { + if (child.query) return child; + const childIds = conditionToIds(child); + if (!childIds || childIds.length === 0) return NO_MATCH_CONDITION; + const set = new Set(childIds.map(String)); + if (ids === null) { + ids = set; + } else { + ids = new Set([...ids].filter((id) => set.has(id))); + } + if (ids.size === 0) return NO_MATCH_CONDITION; + } + return idsToCondition([...ids].map((id) => new mongoose.Types.ObjectId(id))); +} + +async function resolveRefOperand(operand, refModelEntry, operator = 'eq') { + const operandText = String(operand).trim(); + const objectId = extractObjectIdFromOperand(operandText); + + if (objectId) { + if (operator === 'ne') return { op: { $ne: objectId } }; + if (operator === 'eq') return { value: objectId }; + return NO_MATCH_CONDITION; + } + + const expression = buildRefListExpression(operator, operandText); + const ids = await listRefModelIds(refModelEntry, expression); + + if (operator === 'ne') { + if (ids.length === 0) return { query: {} }; + return { op: { $nin: ids } }; + } + + return idsToCondition(ids); +} + +async function resolveRefLeaf(rawToken, refModelEntry) { + const token = rawToken.trim(); + if (token === '') return NO_MATCH_CONDITION; + + const rangeIdx = token.indexOf('..'); + if (rangeIdx !== -1) { + const ids = await listRefModelIds(refModelEntry, token); + return idsToCondition(ids); + } + + const operators = [ + ['<>', 'ne'], + ['>=', 'gte'], + ['<=', 'lte'], + ['>', 'gt'], + ['<', 'lt'], + ['=', 'eq'], + ]; + for (const [symbol, name] of operators) { + if (token.startsWith(symbol)) { + return resolveRefOperand(token.slice(symbol.length), refModelEntry, name); + } + } + + const objectId = extractObjectIdFromOperand(token); + if (objectId) return { value: objectId }; + + const ids = await listRefModelIds(refModelEntry, token); + return idsToCondition(ids); +} + +async function resolveRefCondition(node, refModelEntry) { + if (node.type === 'leaf') { + return resolveRefLeaf(node.token, refModelEntry); + } + + const children = await Promise.all( + node.items.map((item) => resolveRefCondition(item, refModelEntry)) + ); + + return node.type === 'and' ? combineAndRefIds(children) : combineOrRefIds(children); +} + +async function resolveObjectRefFilter(filterProperty, expression, refName) { + const refModelEntry = getRefModelEntryFromSchemaRef(refName); + logger.info('refModelEntry', refModelEntry, refName); + + if (!refModelEntry?.model) return { [filterProperty]: { $in: [] } }; + + const tree = parseExpression(expression); + const condition = await resolveRefCondition(tree, refModelEntry); + return conditionToQuery(condition, filterProperty); +} + +async function parseFilter(property, value, model = null) { // Normalize state filter to state.type for schemas with state: { type } if (property === 'state') { property = 'state.type'; } + const fieldKind = getFilterFieldKind(property, model); + const filterProperty = fieldKind.property; const isBoolField = isBooleanField(property, model); if (value?._id !== undefined && value?._id !== null) { - return { [property]: { _id: new mongoose.Types.ObjectId(value._id) } }; + return { [filterProperty]: new mongoose.Types.ObjectId(value._id) }; } // Non-string values pass through; boolean fields only accept actual booleans. if (typeof value !== 'string') { if (isBoolField && typeof value !== 'boolean') { - return { [property]: { $in: [] } }; + return { [filterProperty]: { $in: [] } }; } - return { [property]: value }; + return { [filterProperty]: value }; } - let trimmed = value.trim(); - if (trimmed.charAt(3) === ':') { + const trimmed = value.trim(); + + if (fieldKind.kind === 'objectId' && property != '_id') { + const refName = fieldKind.ref ?? getSchemaRefName(property, model); + logger.info('refName', refName); + logger.info('trimmed', trimmed); + logger.info('filterProperty', filterProperty); + return resolveObjectRefFilter(filterProperty, trimmed, refName); + } + + let expression = trimmed; + if (fieldKind.kind === 'default' && expression.charAt(3) === ':') { const afterColon = value.split(':')[1]; - trimmed = afterColon != null ? afterColon.trim() : ''; + expression = afterColon != null ? afterColon.trim() : ''; } const isDateField = looksLikeDateField(property); - const tree = parseExpression(trimmed); - const condition = buildCondition(tree, property, isDateField, isBoolField); - return conditionToQuery(condition, property); + const isObjectIdField = fieldKind.kind === 'objectId'; + const tree = parseExpression(expression); + const condition = buildCondition(tree, filterProperty, isDateField, isBoolField, isObjectIdField); + return conditionToQuery(condition, filterProperty); } function convertToCamelCase(obj) { @@ -1210,11 +1526,11 @@ function mergeFilterClauses(clauses) { } // Returns a filter object based on allowed filters and req.query -function getFilter(query, allowedFilters, parse = true, model = null) { +async function getFilter(query, allowedFilters, parse = true, model = null) { const clauses = []; for (const [key, value] of Object.entries(query)) { if (allowedFilters.includes(key)) { - clauses.push(parse ? parseFilter(key, value, model) : { [key]: value }); + clauses.push(parse ? await parseFilter(key, value, model) : { [key]: value }); } } return mergeFilterClauses(clauses);