From 1e807beacfb80d1f653524835fcfe128c65dc2ab Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 1 Aug 2026 13:20:01 +0100 Subject: [PATCH] Implement neighbors caching and retrieval for various entities in the inventory and finance modules. Introduced new route handlers for fetching neighbors in invoices, payments, tax records, filament stocks, order items, part stocks, product stocks, purchase orders, shipments, stock audits, stock events, stock locations, and stock transfers. Updated allowed filters for improved query capabilities across these routes. Enhanced database.js with caching logic for neighbors, including cache invalidation on object updates. --- src/database/database.js | 169 +++++++++++++++++++ src/routes/finance/invoices.js | 35 ++-- src/routes/finance/payments.js | 33 ++-- src/routes/finance/taxrecords.js | 17 +- src/routes/inventory/filamentstocks.js | 37 ++-- src/routes/inventory/orderitems.js | 37 ++-- src/routes/inventory/partstocks.js | 33 ++-- src/routes/inventory/productstocks.js | 31 ++-- src/routes/inventory/purchaseorders.js | 39 +++-- src/routes/inventory/shipments.js | 17 +- src/routes/inventory/stockaudits.js | 19 ++- src/routes/inventory/stockevents.js | 17 +- src/routes/inventory/stocklocations.js | 17 +- src/routes/inventory/stocktransfers.js | 17 +- src/routes/management/apppasswords.js | 15 +- src/routes/management/courier.js | 15 +- src/routes/management/courierservice.js | 35 ++-- src/routes/management/documentjobs.js | 15 +- src/routes/management/documentprinters.js | 15 +- src/routes/management/documentsizes.js | 15 +- src/routes/management/documenttemplates.js | 14 +- src/routes/management/filaments.js | 19 ++- src/routes/management/filamentskus.js | 17 +- src/routes/management/files.js | 15 +- src/routes/management/hosts.js | 15 +- src/routes/management/materials.js | 17 +- src/routes/management/notetypes.js | 17 +- src/routes/management/parts.js | 15 +- src/routes/management/partskus.js | 17 +- src/routes/management/productcategories.js | 15 +- src/routes/management/products.js | 15 +- src/routes/management/productskus.js | 17 +- src/routes/management/taxrates.js | 15 +- src/routes/management/users.js | 17 +- src/routes/management/vendors.js | 15 +- src/routes/misc/notes.js | 15 +- src/routes/production/filamentprofiles.js | 8 + src/routes/production/gcodefiles.js | 17 +- src/routes/production/jobs.js | 17 +- src/routes/production/printerprofiles.js | 8 + src/routes/production/printers.js | 15 +- src/routes/production/subjobs.js | 17 +- src/routes/sales/clients.js | 17 +- src/routes/sales/listings.js | 35 ++-- src/routes/sales/listingvarients.js | 35 ++-- src/routes/sales/marketplaces.js | 17 +- src/routes/sales/salesorders.js | 17 +- src/services/finance/invoices.js | 33 ++++ src/services/finance/payments.js | 33 ++++ src/services/finance/taxrecords.js | 33 ++++ src/services/inventory/filamentstocks.js | 33 ++++ src/services/inventory/orderitems.js | 33 ++++ src/services/inventory/partstocks.js | 33 ++++ src/services/inventory/productstocks.js | 33 ++++ src/services/inventory/purchaseorders.js | 33 ++++ src/services/inventory/shipments.js | 33 ++++ src/services/inventory/stockaudits.js | 35 +++- src/services/inventory/stockevents.js | 33 ++++ src/services/inventory/stocklocations.js | 33 ++++ src/services/inventory/stocktransfers.js | 33 ++++ src/services/management/apppasswords.js | 33 ++++ src/services/management/courier.js | 33 ++++ src/services/management/courierservice.js | 33 ++++ src/services/management/documentjobs.js | 33 ++++ src/services/management/documentprinters.js | 33 ++++ src/services/management/documentsizes.js | 33 ++++ src/services/management/documenttemplates.js | 33 ++++ src/services/management/filaments.js | 33 ++++ src/services/management/filamentskus.js | 33 ++++ src/services/management/files.js | 33 ++++ src/services/management/hosts.js | 33 ++++ src/services/management/materials.js | 33 ++++ src/services/management/notetypes.js | 33 ++++ src/services/management/parts.js | 33 ++++ src/services/management/partskus.js | 33 ++++ src/services/management/productcategories.js | 33 ++++ src/services/management/products.js | 33 ++++ src/services/management/productskus.js | 33 ++++ src/services/management/taxrates.js | 33 ++++ src/services/management/users.js | 33 ++++ src/services/management/vendors.js | 33 ++++ src/services/misc/notes.js | 33 ++++ src/services/production/filamentprofiles.js | 33 ++++ src/services/production/gcodefiles.js | 33 ++++ src/services/production/jobs.js | 35 +++- src/services/production/printerprofiles.js | 33 ++++ src/services/production/printers.js | 33 ++++ src/services/production/subjobs.js | 33 ++++ src/services/sales/clients.js | 32 ++++ src/services/sales/listings.js | 33 ++++ src/services/sales/listingvarients.js | 33 ++++ src/services/sales/marketplaces.js | 33 ++++ src/services/sales/salesorders.js | 32 ++++ 93 files changed, 2349 insertions(+), 257 deletions(-) diff --git a/src/database/database.js b/src/database/database.js index 1803fcc..3cecd2c 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -2,6 +2,7 @@ import config from '../config.js'; import { fileModel } from './schemas/management/file.schema.js'; import _ from 'lodash'; import log4js from 'log4js'; +import crypto from 'crypto'; import sharp from 'sharp'; import { encode as encodeBlurHash } from 'blurhash'; import { uploadFile, deleteFile, downloadFile, BUCKETS } from './ceph.js'; @@ -36,6 +37,9 @@ const cacheLogger = log4js.getLogger('DatabaseCache'); cacheLogger.level = config.server.logLevel; const CACHE_TTL_SECONDS = parseInt(config.database.redis.cacheTtl || '30', 10); +const NEIGHBORS_CACHE_TTL_SECONDS = 60; +const NEIGHBORS_CACHE_WINDOW = 25; +const NEIGHBORS_CACHE_PREFIX = 'neighbors'; const mergeObjectUpdates = (target, source) => _.mergeWith(target, source, (objValue, srcValue) => { @@ -133,6 +137,112 @@ export const deleteObjectCache = async ({ model, id }) => { } }; +const buildNeighborsQueryFilter = (filter = {}, search = '') => { + const queryFilter = { ...filter }; + + Object.keys(queryFilter).forEach((key) => { + if (key.endsWith('._id')) { + const baseKey = key.slice(0, -4); + queryFilter[baseKey] = queryFilter[key]; + delete queryFilter[key]; + } + }); + + if (search) { + const isRefOrIdSearch = search.match(/^.{3}:/); + if (isRefOrIdSearch) { + const lookupValue = search.split(':')[1]; + if (lookupValue.length <= 12) { + queryFilter._reference = lookupValue; + } else { + queryFilter._id = lookupValue; + } + } else { + queryFilter.$text = { $search: search }; + } + } + + return queryFilter; +}; + +const getNeighborsCacheKey = ({ model, id, filter = {}, search = '', sort = '', order = 'ascend' }) => { + const normalizedSort = sort || 'createdAt'; + const normalizedOrder = order || 'ascend'; + const queryHash = crypto + .createHash('sha256') + .update( + JSON.stringify({ + filter, + search, + sort: normalizedSort, + order: normalizedOrder, + }) + ) + .digest('hex'); + + return `${NEIGHBORS_CACHE_PREFIX}:${model.modelName}:${id?.toString()}:${queryHash}`; +}; + +const neighborsCacheToResponse = (cached) => + expandObjectIds({ + next: cached.next[0] ? { _id: cached.next[0] } : null, + previous: cached.previous[0] ? { _id: cached.previous[0] } : null, + }); + +const buildNeighborsCacheValue = (ids, index) => { + const previous = ids + .slice(Math.max(0, index - NEIGHBORS_CACHE_WINDOW), index) + .map((neighborId) => String(neighborId)) + .reverse(); + const next = ids + .slice(index + 1, index + 1 + NEIGHBORS_CACHE_WINDOW) + .map((neighborId) => String(neighborId)); + + return { previous, next }; +}; + +export const invalidateNeighborsCacheForObject = async ({ model, id }) => { + if (!model || !id) return; + + const objectId = id?.toString(); + const cacheKeyPrefix = `${NEIGHBORS_CACHE_PREFIX}:${model.modelName}:`; + const cacheKeyForObject = `${cacheKeyPrefix}${objectId}:`; + + cacheLogger.trace('Invalidating neighbors cache for object:', { + model: model.modelName, + id: objectId, + }); + + try { + const matchingKeys = await redisServer.getKeysByPattern(`${cacheKeyPrefix}*`); + + for (const cacheKey of matchingKeys) { + if (cacheKey.startsWith(cacheKeyForObject)) { + await redisServer.deleteKey(cacheKey); + continue; + } + + const cached = await redisServer.getKey(cacheKey); + if (!cached) continue; + + const containsId = + (Array.isArray(cached.previous) && cached.previous.includes(objectId)) || + (Array.isArray(cached.next) && cached.next.includes(objectId)); + + if (containsId) { + await redisServer.deleteKey(cacheKey); + } + } + + cacheLogger.trace('Invalidated neighbors cache for object:', { + model: model.modelName, + id: objectId, + }); + } catch (err) { + cacheLogger.error('Error invalidating neighbors cache:', err); + } +}; + // Utility to run one or many rollup aggregations in a single query via $facet. export const aggregateRollups = async ({ model, baseFilter = {}, rollupConfigs = [] }) => { if (!rollupConfigs.length) { @@ -427,6 +537,63 @@ export const listObjects = async ({ } }; +export const getObjectNeighbors = async ({ + model, + id, + filter = {}, + search = '', + sort = '', + order = 'ascend', +}) => { + try { + const sortOrder = order === 'descend' ? -1 : 1; + const sortField = sort || 'createdAt'; + const cacheKey = getNeighborsCacheKey({ model, id, filter, search, sort: sortField, order }); + + cacheLogger.trace('Retrieving neighbors from cache:', { + model: model.modelName, + id: id?.toString(), + }); + + const cached = await redisServer.getKey(cacheKey); + if (cached) { + cacheLogger.trace('Neighbors cache hit:', { + model: model.modelName, + id: id?.toString(), + }); + return neighborsCacheToResponse(cached); + } + + cacheLogger.trace('Neighbors cache miss:', { + model: model.modelName, + id: id?.toString(), + }); + + const queryFilter = buildNeighborsQueryFilter(filter, search); + + const results = await model + .find(queryFilter) + .sort({ [sortField]: sortOrder }) + .select('_id') + .lean(); + + const ids = results.map((doc) => doc._id); + const index = ids.findIndex((docId) => String(docId) === String(id)); + + if (index === -1) { + return { next: null, previous: null }; + } + + const cacheValue = buildNeighborsCacheValue(ids, index); + await redisServer.setKey(cacheKey, cacheValue, NEIGHBORS_CACHE_TTL_SECONDS); + + return neighborsCacheToResponse(cacheValue); + } catch (error) { + logger.error('Object neighbors error:', error); + return { error: error, code: 500 }; + } +}; + export const searchObjects = async ({ model, search, populate = [] }) => { try { const isRefOrIdSearch = search.match(/^.{3}:/); @@ -873,6 +1040,7 @@ export const editObject = async ({ model, id, updateData, user, populate, recalc object: updatedObject, populate, }); + await invalidateNeighborsCacheForObject({ model, id }); if (model.recalculate && recalculate == true) { logger.debug(`Recalculating ${model.modelName}`); @@ -1208,6 +1376,7 @@ export const deleteObject = async ( // Invalidate cache for this object await deleteObjectCache({ model, id }); + await invalidateNeighborsCacheForObject({ model, id }); if (model.recalculate) { logger.debug(`Recalculating ${model.modelName}`); diff --git a/src/routes/finance/invoices.js b/src/routes/finance/invoices.js index 277176b..4b039ce 100644 --- a/src/routes/finance/invoices.js +++ b/src/routes/finance/invoices.js @@ -3,6 +3,17 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'vendor', + 'client', + 'state', + 'vendor._id', + 'client._id', + 'order', + 'order._id', + 'orderType', + ]; import { listInvoicesRouteHandler, getInvoiceRouteHandler, @@ -17,23 +28,15 @@ import { cancelInvoiceRouteHandler, postInvoiceRouteHandler, searchInvoicesRouteHandler, - getInvoicePropertyValuesRouteHandler + getInvoicePropertyValuesRouteHandler, + + getInvoiceNeighborsRouteHandler } from '../../services/finance/invoices.js'; // list of invoices router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'vendor', - 'client', - 'state', - 'vendor._id', - 'client._id', - 'order', - 'order._id', - 'orderType', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listInvoicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -49,7 +52,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'vendor._id', 'client._id', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -81,6 +84,12 @@ router.get('/history', isAuthenticated, (req, res) => { getInvoiceHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getInvoiceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getInvoiceRouteHandler(req, res); }); diff --git a/src/routes/finance/payments.js b/src/routes/finance/payments.js index a5c8e27..f004fc4 100644 --- a/src/routes/finance/payments.js +++ b/src/routes/finance/payments.js @@ -3,6 +3,16 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'vendor', + 'client', + 'state', + 'vendor._id', + 'client._id', + 'invoice', + 'invoice._id', + ]; import { listPaymentsRouteHandler, getPaymentRouteHandler, @@ -18,22 +28,15 @@ import { declinePaymentRouteHandler, cancelPaymentRouteHandler, searchPaymentsRouteHandler, - getPaymentPropertyValuesRouteHandler + getPaymentPropertyValuesRouteHandler, + + getPaymentNeighborsRouteHandler } from '../../services/finance/payments.js'; // list of payments router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'vendor', - 'client', - 'state', - 'vendor._id', - 'client._id', - 'invoice', - 'invoice._id', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPaymentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -49,7 +52,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'client._id', 'invoice._id', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -81,6 +84,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPaymentHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPaymentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPaymentRouteHandler(req, res); }); diff --git a/src/routes/finance/taxrecords.js b/src/routes/finance/taxrecords.js index 992467b..b053834 100644 --- a/src/routes/finance/taxrecords.js +++ b/src/routes/finance/taxrecords.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['taxRate', 'transactionType', 'transaction', 'transactionDate']; import { listTaxRecordsRouteHandler, getTaxRecordRouteHandler, @@ -13,21 +15,22 @@ import { getTaxRecordStatsRouteHandler, getTaxRecordHistoryRouteHandler, searchTaxRecordsRouteHandler, - getTaxRecordPropertyValuesRouteHandler + getTaxRecordPropertyValuesRouteHandler, + + getTaxRecordNeighborsRouteHandler } from '../../services/finance/taxrecords.js'; // list of tax records router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['taxRate', 'transactionType', 'transaction', 'transactionDate']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listTaxRecordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['taxRate', 'transactionType', 'transaction']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getTaxRecordHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getTaxRecordNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getTaxRecordRouteHandler(req, res); }); diff --git a/src/routes/inventory/filamentstocks.js b/src/routes/inventory/filamentstocks.js index b0d1634..dc32832 100644 --- a/src/routes/inventory/filamentstocks.js +++ b/src/routes/inventory/filamentstocks.js @@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'filament', + 'filament._id', + 'filamentSku', + 'state', + 'startingWeight', + 'currentWeight', + 'filamentSku._id', + 'stockLocation', + 'stockLocation._id', + ]; import { listFilamentStocksRouteHandler, getFilamentStockRouteHandler, @@ -14,24 +26,15 @@ import { getFilamentStockStatsRouteHandler, getFilamentStockHistoryRouteHandler, searchFilamentStocksRouteHandler, - getFilamentStockPropertyValuesRouteHandler + getFilamentStockPropertyValuesRouteHandler, + + getFilamentStockNeighborsRouteHandler } from '../../services/inventory/filamentstocks.js'; // list of filament stocks router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'filament', - 'filament._id', - 'filamentSku', - 'state', - 'startingWeight', - 'currentWeight', - 'filamentSku._id', - 'stockLocation', - 'stockLocation._id', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listFilamentStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -44,7 +47,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'state.type', 'filamentSku._id', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -76,6 +79,12 @@ router.get('/history', isAuthenticated, (req, res) => { getFilamentStockHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getFilamentStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/orderitems.js b/src/routes/inventory/orderitems.js index 8197321..5a27c9f 100644 --- a/src/routes/inventory/orderitems.js +++ b/src/routes/inventory/orderitems.js @@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'name', + 'itemType', + 'item', + 'item._id', + 'order', + 'order._id', + 'orderType', + 'shipment', + 'shipment._id', + ]; import { listOrderItemsRouteHandler, getOrderItemRouteHandler, @@ -14,24 +26,15 @@ import { getOrderItemStatsRouteHandler, getOrderItemHistoryRouteHandler, searchOrderItemsRouteHandler, - getOrderItemPropertyValuesRouteHandler + getOrderItemPropertyValuesRouteHandler, + + getOrderItemNeighborsRouteHandler } from '../../services/inventory/orderitems.js'; // list of order items router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'name', - 'itemType', - 'item', - 'item._id', - 'order', - 'order._id', - 'orderType', - 'shipment', - 'shipment._id', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listOrderItemsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -48,7 +51,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'shipment', 'shipment._id', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -80,6 +83,12 @@ router.get('/history', isAuthenticated, (req, res) => { getOrderItemHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getOrderItemNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getOrderItemRouteHandler(req, res); }); diff --git a/src/routes/inventory/partstocks.js b/src/routes/inventory/partstocks.js index 0713798..b7f2429 100644 --- a/src/routes/inventory/partstocks.js +++ b/src/routes/inventory/partstocks.js @@ -3,6 +3,16 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'partSku', + 'state', + 'startingQuantity', + 'currentQuantity', + 'partSku._id', + 'stockLocation', + 'stockLocation._id', + ]; import { listPartStocksRouteHandler, getPartStockRouteHandler, @@ -14,29 +24,22 @@ import { getPartStockStatsRouteHandler, getPartStockHistoryRouteHandler, searchPartStocksRouteHandler, - getPartStockPropertyValuesRouteHandler + getPartStockPropertyValuesRouteHandler, + + getPartStockNeighborsRouteHandler } from '../../services/inventory/partstocks.js'; // list of part stocks router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'partSku', - 'state', - 'startingQuantity', - 'currentQuantity', - 'partSku._id', - 'stockLocation', - 'stockLocation._id', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPartStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['part', 'state.type']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -68,6 +71,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPartStockHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPartStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPartStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/productstocks.js b/src/routes/inventory/productstocks.js index e796fa3..12e3680 100644 --- a/src/routes/inventory/productstocks.js +++ b/src/routes/inventory/productstocks.js @@ -3,6 +3,15 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'productSku', + 'state', + 'currentQuantity', + 'productSku._id', + 'stockLocation', + 'stockLocation._id', + ]; import { listProductStocksRouteHandler, getProductStockRouteHandler, @@ -15,27 +24,21 @@ import { getProductStockStatsRouteHandler, getProductStockHistoryRouteHandler, searchProductStocksRouteHandler, - getProductStockPropertyValuesRouteHandler + getProductStockPropertyValuesRouteHandler, + + getProductStockNeighborsRouteHandler } from '../../services/inventory/productstocks.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'productSku', - 'state', - 'currentQuantity', - 'productSku._id', - 'stockLocation', - 'stockLocation._id', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listProductStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['productSku', 'state.type']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -65,6 +68,12 @@ router.get('/history', isAuthenticated, (req, res) => { getProductStockHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getProductStockNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getProductStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/purchaseorders.js b/src/routes/inventory/purchaseorders.js index 8c2ac0a..e00b836 100644 --- a/src/routes/inventory/purchaseorders.js +++ b/src/routes/inventory/purchaseorders.js @@ -3,6 +3,19 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'vendor', + 'state', + 'value', + 'vendor._id', + 'totalAmount', + 'totalAmountWithTax', + 'totalTaxAmount', + 'shippingAmount', + 'shippingAmountWithTax', + 'grandTotalAmount', + ]; import { listPurchaseOrdersRouteHandler, getPurchaseOrderRouteHandler, @@ -17,25 +30,15 @@ import { acknowledgePurchaseOrderRouteHandler, cancelPurchaseOrderRouteHandler, searchPurchaseOrdersRouteHandler, - getPurchaseOrderPropertyValuesRouteHandler + getPurchaseOrderPropertyValuesRouteHandler, + + getPurchaseOrderNeighborsRouteHandler } from '../../services/inventory/purchaseorders.js'; // list of purchase orders router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'vendor', - 'state', - 'value', - 'vendor._id', - 'totalAmount', - 'totalAmountWithTax', - 'totalTaxAmount', - 'shippingAmount', - 'shippingAmountWithTax', - 'grandTotalAmount', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPurchaseOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -53,7 +56,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'shippingAmountWithTax', 'grandTotalAmount', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); @@ -85,6 +88,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPurchaseOrderHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPurchaseOrderNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPurchaseOrderRouteHandler(req, res); }); diff --git a/src/routes/inventory/shipments.js b/src/routes/inventory/shipments.js index 79be234..bb4f58e 100644 --- a/src/routes/inventory/shipments.js +++ b/src/routes/inventory/shipments.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['orderType', 'order', 'state', 'courierService', 'order._id', 'taxRate']; import { listShipmentsRouteHandler, getShipmentRouteHandler, @@ -17,14 +19,15 @@ import { receiveShipmentRouteHandler, cancelShipmentRouteHandler, searchShipmentsRouteHandler, - getShipmentPropertyValuesRouteHandler + getShipmentPropertyValuesRouteHandler, + + getShipmentNeighborsRouteHandler } from '../../services/inventory/shipments.js'; // list of shipments router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['orderType', 'order', 'state', 'courierService', 'order._id', 'taxRate']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listShipmentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -38,7 +41,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'order._id', 'taxRate', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); @@ -70,6 +73,12 @@ router.get('/history', isAuthenticated, (req, res) => { getShipmentHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getShipmentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getShipmentRouteHandler(req, res); }); diff --git a/src/routes/inventory/stockaudits.js b/src/routes/inventory/stockaudits.js index a3efd9e..9d8ab42 100644 --- a/src/routes/inventory/stockaudits.js +++ b/src/routes/inventory/stockaudits.js @@ -1,6 +1,6 @@ import express from 'express'; import { isAuthenticated } from '../../keycloak.js'; -import { parseFilter } from '../../utils.js'; +import { parseFilter, getFilter } from '../../utils.js'; const router = express.Router(); import { @@ -11,20 +11,21 @@ import { deleteStockAuditRouteHandler, getStockAuditStatsRouteHandler, getStockAuditHistoryRouteHandler, - searchStockAuditsRouteHandler + searchStockAuditsRouteHandler, + getStockAuditNeighborsRouteHandler, } from '../../services/inventory/stockaudits.js'; +const listAllowedFilters = ['status', 'type', 'createdBy']; + // List stock audits router.get('/', isAuthenticated, (req, res) => { const { page, limit, property } = req.query; - const allowedFilters = ['status', 'type', 'createdBy']; - var filter = {}; for (const [key, value] of Object.entries(req.query)) { - for (var i = 0; i < allowedFilters.length; i++) { - if (key == allowedFilters[i]) { + for (var i = 0; i < listAllowedFilters.length; i++) { + if (key == listAllowedFilters[i]) { const parsedFilter = parseFilter(key, value); filter = { ...filter, ...parsedFilter }; } @@ -54,6 +55,12 @@ router.get('/history', isAuthenticated, (req, res) => { getStockAuditHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getStockAuditNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + // Get specific stock audit router.get('/:id', isAuthenticated, (req, res) => { getStockAuditRouteHandler(req, res); diff --git a/src/routes/inventory/stockevents.js b/src/routes/inventory/stockevents.js index 421a88f..e78d8aa 100644 --- a/src/routes/inventory/stockevents.js +++ b/src/routes/inventory/stockevents.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['owner._id', 'parent._id']; import { listStockEventsRouteHandler, getStockEventRouteHandler, @@ -14,21 +16,22 @@ import { getStockEventStatsRouteHandler, getStockEventHistoryRouteHandler, searchStockEventsRouteHandler, - getStockEventPropertyValuesRouteHandler + getStockEventPropertyValuesRouteHandler, + + getStockEventNeighborsRouteHandler } from '../../services/inventory/stockevents.js'; // list of stock events router.get('/', isAuthenticated, (req, res) => { const { page, limit, sort, order } = req.query; - const allowedFilters = ['owner._id', 'parent._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listStockEventsRouteHandler(req, res, page, limit, filter, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['owner._id', 'parent._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -60,6 +63,12 @@ router.get('/history', isAuthenticated, (req, res) => { getStockEventHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getStockEventNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getStockEventRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocklocations.js b/src/routes/inventory/stocklocations.js index aff895b..b04dabd 100644 --- a/src/routes/inventory/stocklocations.js +++ b/src/routes/inventory/stocklocations.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name']; import { listStockLocationsRouteHandler, getStockLocationRouteHandler, @@ -14,20 +16,21 @@ import { getStockLocationStatsRouteHandler, getStockLocationHistoryRouteHandler, searchStockLocationsRouteHandler, - getStockLocationPropertyValuesRouteHandler + getStockLocationPropertyValuesRouteHandler, + + getStockLocationNeighborsRouteHandler } from '../../services/inventory/stocklocations.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listStockLocationsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -57,6 +60,12 @@ router.get('/history', isAuthenticated, (req, res) => { getStockLocationHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getStockLocationNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getStockLocationRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocktransfers.js b/src/routes/inventory/stocktransfers.js index 331949e..80f1d21 100644 --- a/src/routes/inventory/stocktransfers.js +++ b/src/routes/inventory/stocktransfers.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['state', 'state.type', 'postedAt']; import { listStockTransfersRouteHandler, getStockTransferRouteHandler, @@ -15,20 +17,21 @@ import { getStockTransferStatsRouteHandler, getStockTransferHistoryRouteHandler, searchStockTransfersRouteHandler, - getStockTransferPropertyValuesRouteHandler + getStockTransferPropertyValuesRouteHandler, + + getStockTransferNeighborsRouteHandler } from '../../services/inventory/stocktransfers.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['state', 'state.type', 'postedAt']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listStockTransfersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['state.type']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -58,6 +61,12 @@ router.get('/history', isAuthenticated, (req, res) => { getStockTransferHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getStockTransferNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getStockTransferRouteHandler(req, res); }); diff --git a/src/routes/management/apppasswords.js b/src/routes/management/apppasswords.js index e76446d..f9ccb79 100644 --- a/src/routes/management/apppasswords.js +++ b/src/routes/management/apppasswords.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'user', 'active', 'user._id']; import { listAppPasswordsRouteHandler, getAppPasswordRouteHandler, @@ -15,19 +17,20 @@ import { regenerateSecretRouteHandler, searchAppPasswordsRouteHandler, getAppPasswordPropertyValuesRouteHandler, + + getAppPasswordNeighborsRouteHandler } from '../../services/management/apppasswords.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'user', 'active', 'user._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listAppPasswordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { const properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name', 'user', 'active']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); const masterFilter = req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}; listAppPasswordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); }); @@ -58,6 +61,12 @@ router.post('/:id/regenerateSecret', isAuthenticated, async (req, res) => { regenerateSecretRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getAppPasswordNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getAppPasswordRouteHandler(req, res); }); diff --git a/src/routes/management/courier.js b/src/routes/management/courier.js index e9f7f67..569da30 100644 --- a/src/routes/management/courier.js +++ b/src/routes/management/courier.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country']; import { listCouriersRouteHandler, getCourierRouteHandler, @@ -14,20 +16,21 @@ import { getCourierHistoryRouteHandler, searchCouriersRouteHandler, getCourierPropertyValuesRouteHandler, + + getCourierNeighborsRouteHandler } from '../../services/management/courier.js'; // list of couriers router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listCouriersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getCourierHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getCourierNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getCourierRouteHandler(req, res); }); diff --git a/src/routes/management/courierservice.js b/src/routes/management/courierservice.js index cfa0e12..5281a4b 100644 --- a/src/routes/management/courierservice.js +++ b/src/routes/management/courierservice.js @@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + '_id', + 'courier', + 'courier._id', + 'name', + 'active', + 'tracked', + 'deliveryTime', + 'cost', + 'costWithTax', + ]; import { listCourierServicesRouteHandler, getCourierServiceRouteHandler, @@ -14,23 +26,14 @@ import { getCourierServiceHistoryRouteHandler, searchCourierServicesRouteHandler, getCourierServicePropertyValuesRouteHandler, + + getCourierServiceNeighborsRouteHandler } from '../../services/management/courierservice.js'; // list of courier services router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - '_id', - 'courier', - 'courier._id', - 'name', - 'active', - 'tracked', - 'deliveryTime', - 'cost', - 'costWithTax', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listCourierServicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -47,7 +50,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'cost', 'costWithTax', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -79,6 +82,12 @@ router.get('/history', isAuthenticated, (req, res) => { getCourierServiceHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getCourierServiceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getCourierServiceRouteHandler(req, res); }); diff --git a/src/routes/management/documentjobs.js b/src/routes/management/documentjobs.js index 75e1ac5..d70cb5f 100644 --- a/src/routes/management/documentjobs.js +++ b/src/routes/management/documentjobs.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'width', 'height']; import { listDocumentJobsRouteHandler, getDocumentJobRouteHandler, @@ -14,20 +16,21 @@ import { getDocumentJobHistoryRouteHandler, searchDocumentJobsRouteHandler, getDocumentJobPropertyValuesRouteHandler, + + getDocumentJobNeighborsRouteHandler } from '../../services/management/documentjobs.js'; // list of document jobs router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'width', 'height']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listDocumentJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = []; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getDocumentJobHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getDocumentJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentJobRouteHandler(req, res); }); diff --git a/src/routes/management/documentprinters.js b/src/routes/management/documentprinters.js index 2cccf34..7511604 100644 --- a/src/routes/management/documentprinters.js +++ b/src/routes/management/documentprinters.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'tags', 'active', 'isGlobal']; import { listDocumentPrintersRouteHandler, getDocumentPrinterRouteHandler, @@ -14,20 +16,21 @@ import { getDocumentPrinterHistoryRouteHandler, searchDocumentPrintersRouteHandler, getDocumentPrinterPropertyValuesRouteHandler, + + getDocumentPrinterNeighborsRouteHandler } from '../../services/management/documentprinters.js'; // list of document printers router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'tags', 'active', 'isGlobal']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listDocumentPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['tags']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getDocumentPrinterHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getDocumentPrinterNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentPrinterRouteHandler(req, res); }); diff --git a/src/routes/management/documentsizes.js b/src/routes/management/documentsizes.js index f88a280..5e116d9 100644 --- a/src/routes/management/documentsizes.js +++ b/src/routes/management/documentsizes.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'width', 'height']; import { listDocumentSizesRouteHandler, getDocumentSizeRouteHandler, @@ -14,20 +16,21 @@ import { getDocumentSizeHistoryRouteHandler, searchDocumentSizesRouteHandler, getDocumentSizePropertyValuesRouteHandler, + + getDocumentSizeNeighborsRouteHandler } from '../../services/management/documentsizes.js'; // list of document sizes router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'width', 'height']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listDocumentSizesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = []; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getDocumentSizeHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getDocumentSizeNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentSizeRouteHandler(req, res); }); diff --git a/src/routes/management/documenttemplates.js b/src/routes/management/documenttemplates.js index e12c48d..a80d2db 100644 --- a/src/routes/management/documenttemplates.js +++ b/src/routes/management/documenttemplates.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'tags', 'active', 'global', 'objectType']; import { listDocumentTemplatesRouteHandler, getDocumentTemplateRouteHandler, @@ -14,20 +16,20 @@ import { getDocumentTemplateHistoryRouteHandler, getDocumentTemplatePropertyValuesRouteHandler, searchDocumentTemplatesRouteHandler, + getDocumentTemplateNeighborsRouteHandler, } from '../../services/management/documenttemplates.js'; // list of document templates router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'tags', 'active', 'global', 'objectType']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listDocumentTemplatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['documentSize', 'tags']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +61,12 @@ router.get('/history', isAuthenticated, (req, res) => { getDocumentTemplateHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getDocumentTemplateNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getDocumentTemplateRouteHandler(req, res); }); diff --git a/src/routes/management/filaments.js b/src/routes/management/filaments.js index 7956189..c7815cd 100644 --- a/src/routes/management/filaments.js +++ b/src/routes/management/filaments.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'material', 'material._id', 'diameter', 'name', 'cost']; import { listFilamentsRouteHandler, listFilamentsByPropertiesRouteHandler, @@ -15,19 +17,20 @@ import { getFilamentHistoryRouteHandler, searchFilamentsRouteHandler, getFilamentPropertyValuesRouteHandler, + + getFilamentNeighborsRouteHandler } from '../../services/management/filaments.js'; // list of filaments router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'material', 'material._id', 'diameter', 'name', 'cost']; - + var filter = {}; for (const [key, value] of Object.entries(req.query)) { - for (var i = 0; i < allowedFilters.length; i++) { - if (key == allowedFilters[i]) { + for (var i = 0; i < listAllowedFilters.length; i++) { + if (key == listAllowedFilters[i]) { filter = { ...filter, ...parseFilter(key, value) }; } } @@ -39,7 +42,7 @@ router.get('/', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['diameter', 'material']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -71,6 +74,12 @@ router.get('/history', isAuthenticated, (req, res) => { getFilamentHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters, false); + getFilamentNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentRouteHandler(req, res); }); diff --git a/src/routes/management/filamentskus.js b/src/routes/management/filamentskus.js index 5a5b23d..48a5c61 100644 --- a/src/routes/management/filamentskus.js +++ b/src/routes/management/filamentskus.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'barcode', 'filament', 'filament._id', 'name', 'color', 'cost', 'costWithTax']; import { listFilamentSkusRouteHandler, getFilamentSkuRouteHandler, @@ -13,20 +15,21 @@ import { getFilamentSkuStatsRouteHandler, getFilamentSkuHistoryRouteHandler, searchFilamentSkusRouteHandler, - getFilamentSkuPropertyValuesRouteHandler + getFilamentSkuPropertyValuesRouteHandler, + + getFilamentSkuNeighborsRouteHandler } from '../../services/management/filamentskus.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'barcode', 'filament', 'filament._id', 'name', 'color', 'cost', 'costWithTax']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listFilamentSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['filament', 'filament._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => { getFilamentSkuHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getFilamentSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentSkuRouteHandler(req, res); }); diff --git a/src/routes/management/files.js b/src/routes/management/files.js index 64f71fc..b8e8bc2 100644 --- a/src/routes/management/files.js +++ b/src/routes/management/files.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'type', 'size', 'extension']; import { listFilesRouteHandler, getFileRouteHandler, @@ -17,20 +19,21 @@ import { getFileHistoryRouteHandler, searchFilesRouteHandler, getFilePropertyValuesRouteHandler, + + getFileNeighborsRouteHandler } from '../../services/management/files.js'; // list of files router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'type', 'size', 'extension']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['type', 'extension']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -66,6 +69,12 @@ router.delete('/:id/flush', isAuthenticated, (req, res) => { flushFileRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getFileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFileRouteHandler(req, res); }); diff --git a/src/routes/management/hosts.js b/src/routes/management/hosts.js index e532fa7..2184f4a 100644 --- a/src/routes/management/hosts.js +++ b/src/routes/management/hosts.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'tags']; import { listHostsRouteHandler, getHostRouteHandler, @@ -14,20 +16,21 @@ import { getHostHistoryRouteHandler, searchHostsRouteHandler, getHostPropertyValuesRouteHandler, + + getHostNeighborsRouteHandler } from '../../services/management/hosts.js'; // list of hosts router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'tags']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listHostsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['tags']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getHostHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getHostNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getHostRouteHandler(req, res); }); diff --git a/src/routes/management/materials.js b/src/routes/management/materials.js index 7af36c1..763178e 100644 --- a/src/routes/management/materials.js +++ b/src/routes/management/materials.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'tags']; import { listMaterialsRouteHandler, listMaterialsByPropertiesRouteHandler, @@ -13,18 +15,19 @@ import { getMaterialHistoryRouteHandler, searchMaterialsRouteHandler, getMaterialPropertyValuesRouteHandler, + + getMaterialNeighborsRouteHandler } from '../../services/management/materials.js'; // list of materials router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'tags']; - + var filter = {}; for (const [key, value] of Object.entries(req.query)) { - if (allowedFilters.includes(key)) { + if (listAllowedFilters.includes(key)) { filter = { ...filter, ...parseFilter(key, value) }; } } @@ -35,7 +38,7 @@ router.get('/', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name', 'tags']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -67,6 +70,12 @@ router.get('/history', isAuthenticated, (req, res) => { getMaterialHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters, false); + getMaterialNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getMaterialRouteHandler(req, res); }); diff --git a/src/routes/management/notetypes.js b/src/routes/management/notetypes.js index 690f671..0edc3c7 100644 --- a/src/routes/management/notetypes.js +++ b/src/routes/management/notetypes.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'active', 'color']; import { listNoteTypesRouteHandler, getNoteTypeRouteHandler, @@ -13,21 +15,22 @@ import { getNoteTypeStatsRouteHandler, getNoteTypeHistoryRouteHandler, searchNoteTypesRouteHandler, - getNoteTypePropertyValuesRouteHandler + getNoteTypePropertyValuesRouteHandler, + + getNoteTypeNeighborsRouteHandler } from '../../services/management/notetypes.js'; // list of note types router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'active', 'color']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listNoteTypesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['active', 'color']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getNoteTypeHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getNoteTypeNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getNoteTypeRouteHandler(req, res); }); diff --git a/src/routes/management/parts.js b/src/routes/management/parts.js index b1ddff1..a8e6c85 100644 --- a/src/routes/management/parts.js +++ b/src/routes/management/parts.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['product._id', '_id', 'name']; import { listPartsRouteHandler, getPartRouteHandler, @@ -14,20 +16,21 @@ import { getPartHistoryRouteHandler, searchPartsRouteHandler, getPartPropertyValuesRouteHandler, + + getPartNeighborsRouteHandler } from '../../services/management/parts.js'; // list of parts router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['product._id', '_id', 'name']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPartsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['product._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPartHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPartNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPartRouteHandler(req, res); }); diff --git a/src/routes/management/partskus.js b/src/routes/management/partskus.js index 5ba8621..15128b7 100644 --- a/src/routes/management/partskus.js +++ b/src/routes/management/partskus.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'barcode', 'part', 'part._id', 'name', 'cost', 'price']; import { listPartSkusRouteHandler, getPartSkuRouteHandler, @@ -13,20 +15,21 @@ import { getPartSkuStatsRouteHandler, getPartSkuHistoryRouteHandler, searchPartSkusRouteHandler, - getPartSkuPropertyValuesRouteHandler + getPartSkuPropertyValuesRouteHandler, + + getPartSkuNeighborsRouteHandler } from '../../services/management/partskus.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'barcode', 'part', 'part._id', 'name', 'cost', 'price']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPartSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['part', 'part._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPartSkuHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPartSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPartSkuRouteHandler(req, res); }); diff --git a/src/routes/management/productcategories.js b/src/routes/management/productcategories.js index 19c5572..ed58ab1 100644 --- a/src/routes/management/productcategories.js +++ b/src/routes/management/productcategories.js @@ -12,21 +12,24 @@ import { newProductCategoryRouteHandler, searchProductCategoriesRouteHandler, getProductCategoryPropertyValuesRouteHandler, + + getProductCategoryNeighborsRouteHandler } from '../../services/management/productcategories.js'; const router = express.Router(); +const listAllowedFilters = ['_id', 'name']; + router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listProductCategoriesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { const properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => { getProductCategoryHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getProductCategoryNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getProductCategoryRouteHandler(req, res); }); diff --git a/src/routes/management/products.js b/src/routes/management/products.js index ab85cde..9e62c58 100644 --- a/src/routes/management/products.js +++ b/src/routes/management/products.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'globalPrice', 'productCategory', 'productCategory._id']; import { listProductsRouteHandler, getProductRouteHandler, @@ -14,20 +16,21 @@ import { getProductHistoryRouteHandler, searchProductsRouteHandler, getProductPropertyValuesRouteHandler, + + getProductNeighborsRouteHandler } from '../../services/management/products.js'; // list of products router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'globalPrice', 'productCategory', 'productCategory._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listProductsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = []; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getProductHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getProductNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getProductRouteHandler(req, res); }); diff --git a/src/routes/management/productskus.js b/src/routes/management/productskus.js index 4aedf60..41c759f 100644 --- a/src/routes/management/productskus.js +++ b/src/routes/management/productskus.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'barcode', 'product', 'product._id', 'name', 'cost', 'price']; import { listProductSkusRouteHandler, getProductSkuRouteHandler, @@ -13,20 +15,21 @@ import { getProductSkuStatsRouteHandler, getProductSkuHistoryRouteHandler, searchProductSkusRouteHandler, - getProductSkuPropertyValuesRouteHandler + getProductSkuPropertyValuesRouteHandler, + + getProductSkuNeighborsRouteHandler } from '../../services/management/productskus.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'barcode', 'product', 'product._id', 'name', 'cost', 'price']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listProductSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['product', 'product._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); let masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => { getProductSkuHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getProductSkuNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getProductSkuRouteHandler(req, res); }); diff --git a/src/routes/management/taxrates.js b/src/routes/management/taxrates.js index b941356..8ccc72d 100644 --- a/src/routes/management/taxrates.js +++ b/src/routes/management/taxrates.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'rate', 'rateType', 'active', 'country']; import { listTaxRatesRouteHandler, getTaxRateRouteHandler, @@ -14,20 +16,21 @@ import { getTaxRateHistoryRouteHandler, searchTaxRatesRouteHandler, getTaxRatePropertyValuesRouteHandler, + + getTaxRateNeighborsRouteHandler } from '../../services/management/taxrates.js'; // list of tax rates router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'rate', 'rateType', 'active', 'country']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listTaxRatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['rateType', 'country', 'active']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getTaxRateHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getTaxRateNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getTaxRateRouteHandler(req, res); }); diff --git a/src/routes/management/users.js b/src/routes/management/users.js index a2b338f..e09aef2 100644 --- a/src/routes/management/users.js +++ b/src/routes/management/users.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'username', 'firstName', 'lastName', 'email']; import { listUsersRouteHandler, listUsersByPropertiesRouteHandler, @@ -12,21 +14,22 @@ import { getUserHistoryRouteHandler, setAppPasswordRouteHandler, searchUsersRouteHandler, - getUserPropertyValuesRouteHandler + getUserPropertyValuesRouteHandler, + + getUserNeighborsRouteHandler } from '../../services/management/users.js'; // list of document templates router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'username', 'firstName', 'lastName', 'email']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listUsersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = []; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -54,6 +57,12 @@ router.get('/history', isAuthenticated, (req, res) => { getUserHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getUserNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getUserRouteHandler(req, res); }); diff --git a/src/routes/management/vendors.js b/src/routes/management/vendors.js index dee1187..4c3dc9d 100644 --- a/src/routes/management/vendors.js +++ b/src/routes/management/vendors.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; import { listVendorsRouteHandler, getVendorRouteHandler, @@ -14,20 +16,21 @@ import { getVendorHistoryRouteHandler, searchVendorsRouteHandler, getVendorPropertyValuesRouteHandler, + + getVendorNeighborsRouteHandler } from '../../services/management/vendors.js'; // list of vendors router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listVendorsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getVendorHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getVendorNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getVendorRouteHandler(req, res); }); diff --git a/src/routes/misc/notes.js b/src/routes/misc/notes.js index 915f113..f841a8b 100644 --- a/src/routes/misc/notes.js +++ b/src/routes/misc/notes.js @@ -10,23 +10,26 @@ import { getNoteStatsRouteHandler, getNoteHistoryRouteHandler, getNotePropertyValuesRouteHandler, + + getNoteNeighborsRouteHandler } from '../../services/misc/notes.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); +const listAllowedFilters = ['parent._id']; + // list of notes router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['parent._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listNotesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['parent']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -54,6 +57,12 @@ router.get('/history', isAuthenticated, (req, res) => { getNoteHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getNoteNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getNoteRouteHandler(req, res); }); diff --git a/src/routes/production/filamentprofiles.js b/src/routes/production/filamentprofiles.js index 25365ad..3d287d4 100644 --- a/src/routes/production/filamentprofiles.js +++ b/src/routes/production/filamentprofiles.js @@ -10,6 +10,8 @@ import { newFilamentProfileRouteHandler, searchFilamentProfilesRouteHandler, getFilamentProfilePropertyValuesRouteHandler, + + getFilamentProfileNeighborsRouteHandler } from '../../services/production/filamentprofiles.js'; const router = express.Router(); @@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => { newFilamentProfileRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, ['_id', 'name']); + getFilamentProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getFilamentProfileRouteHandler(req, res); }); diff --git a/src/routes/production/gcodefiles.js b/src/routes/production/gcodefiles.js index 90107f7..6a50a36 100644 --- a/src/routes/production/gcodefiles.js +++ b/src/routes/production/gcodefiles.js @@ -2,6 +2,8 @@ import express from 'express'; import { isAuthenticated } from '../../keycloak.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'name', 'filament', 'filament._id', 'filamentSku', 'filamentSku._id']; import { listGCodeFilesRouteHandler, editGCodeFileRouteHandler, @@ -11,22 +13,23 @@ import { getGCodeFileContentRouteHandler, getGCodeFileStatsRouteHandler, searchGCodeFilesRouteHandler, - getGCodeFilePropertyValuesRouteHandler + getGCodeFilePropertyValuesRouteHandler, + + getGCodeFileNeighborsRouteHandler } from '../../services/production/gcodefiles.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; // list of gcodeFiles router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'name', 'filament', 'filament._id', 'filamentSku', 'filamentSku._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listGCodeFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['filament', 'filament._id', 'filamentSku', 'filamentSku._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -54,6 +57,12 @@ router.get('/stats', isAuthenticated, (req, res) => { getGCodeFileStatsRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getGCodeFileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getGCodeFileRouteHandler(req, res); }); diff --git a/src/routes/production/jobs.js b/src/routes/production/jobs.js index b21e5bc..a55baf6 100644 --- a/src/routes/production/jobs.js +++ b/src/routes/production/jobs.js @@ -2,6 +2,8 @@ import express from 'express'; import { isAuthenticated } from '../../keycloak.js'; const router = express.Router(); + +const listAllowedFilters = ['state', 'gcodeFile._id', 'quantity']; import { listJobsRouteHandler, listJobsByPropertiesRouteHandler, @@ -12,22 +14,23 @@ import { getJobStatsRouteHandler, getJobHistoryRouteHandler, searchJobsRouteHandler, - getJobPropertyValuesRouteHandler + getJobPropertyValuesRouteHandler, + + getJobNeighborsRouteHandler } from '../../services/production/jobs.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; // list of jobs router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['state', 'gcodeFile._id', 'quantity']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['state']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getJobHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getJobRouteHandler(req, res); }); diff --git a/src/routes/production/printerprofiles.js b/src/routes/production/printerprofiles.js index 7fafe34..102851f 100644 --- a/src/routes/production/printerprofiles.js +++ b/src/routes/production/printerprofiles.js @@ -10,6 +10,8 @@ import { newPrinterProfileRouteHandler, searchPrinterProfilesRouteHandler, getPrinterProfilePropertyValuesRouteHandler, + + getPrinterProfileNeighborsRouteHandler } from '../../services/production/printerprofiles.js'; const router = express.Router(); @@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => { newPrinterProfileRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, ['_id', 'name']); + getPrinterProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getPrinterProfileRouteHandler(req, res); }); diff --git a/src/routes/production/printers.js b/src/routes/production/printers.js index 209333b..4f10660 100644 --- a/src/routes/production/printers.js +++ b/src/routes/production/printers.js @@ -12,21 +12,22 @@ import { getPrinterHistoryRouteHandler, searchPrintersRouteHandler, getPrinterPropertyValuesRouteHandler, + getPrinterNeighborsRouteHandler, } from '../../services/production/printers.js'; import { convertPropertiesString, getFilter } from '../../utils.js'; +const listAllowedFilters = ['tags', 'host._id', 'active', 'online', 'name', '_id', '_reference']; +const propertiesAllowedFilters = ['tags']; // list of printers router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['tags', 'host._id', 'active', 'online', 'name', '_id', '_reference']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); - const allowedFilters = ['tags']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, propertiesAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -53,6 +54,12 @@ router.get('/history', isAuthenticated, (req, res) => { getPrinterHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getPrinterNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + // get printer stats router.get('/stats', isAuthenticated, (req, res) => { getPrinterStatsRouteHandler(req, res); diff --git a/src/routes/production/subjobs.js b/src/routes/production/subjobs.js index 630e9ec..2620d5a 100644 --- a/src/routes/production/subjobs.js +++ b/src/routes/production/subjobs.js @@ -2,6 +2,8 @@ import express from 'express'; import { isAuthenticated } from '../../keycloak.js'; const router = express.Router(); + +const listAllowedFilters = ['_id', 'job._id', 'printer._id']; import { listSubJobsRouteHandler, listSubJobsByPropertiesRouteHandler, @@ -9,22 +11,23 @@ import { getSubJobStatsRouteHandler, getSubJobHistoryRouteHandler, searchSubJobsRouteHandler, - getSubJobPropertyValuesRouteHandler + getSubJobPropertyValuesRouteHandler, + + getSubJobNeighborsRouteHandler } from '../../services/production/subjobs.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; // list of sub jobs router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['_id', 'job._id', 'printer._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listSubJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['job']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -52,6 +55,12 @@ router.get('/history', isAuthenticated, (req, res) => { getSubJobHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getSubJobNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getSubJobRouteHandler(req, res); }); diff --git a/src/routes/sales/clients.js b/src/routes/sales/clients.js index 786e924..4964ca9 100644 --- a/src/routes/sales/clients.js +++ b/src/routes/sales/clients.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; import { listClientsRouteHandler, getClientRouteHandler, @@ -13,21 +15,22 @@ import { getClientStatsRouteHandler, getClientHistoryRouteHandler, searchClientsRouteHandler, - getClientPropertyValuesRouteHandler + getClientPropertyValuesRouteHandler, + + getClientNeighborsRouteHandler } from '../../services/sales/clients.js'; // list of clients router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listClientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => { getClientHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getClientNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getClientRouteHandler(req, res); }); diff --git a/src/routes/sales/listings.js b/src/routes/sales/listings.js index bca9837..75a24e7 100644 --- a/src/routes/sales/listings.js +++ b/src/routes/sales/listings.js @@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'product', + 'vendor', + 'stockLocation', + 'marketplace', + 'courierServices', + 'state', + 'state.type', + 'createdAt', + 'updatedAt', + ]; import { listListingsRouteHandler, getListingRouteHandler, @@ -16,22 +28,13 @@ import { unpublishListingRouteHandler, searchListingsRouteHandler, getListingPropertyValuesRouteHandler, + + getListingNeighborsRouteHandler } from '../../services/sales/listings.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'product', - 'vendor', - 'stockLocation', - 'marketplace', - 'courierServices', - 'state', - 'state.type', - 'createdAt', - 'updatedAt', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listListingsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -48,7 +51,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'createdAt', 'updatedAt', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -85,6 +88,12 @@ router.post('/:id/unpublish', isAuthenticated, (req, res) => { unpublishListingRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getListingNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getListingRouteHandler(req, res); }); diff --git a/src/routes/sales/listingvarients.js b/src/routes/sales/listingvarients.js index 2d121c5..c6eb5f2 100644 --- a/src/routes/sales/listingvarients.js +++ b/src/routes/sales/listingvarients.js @@ -3,6 +3,17 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = [ + 'listing', + 'listing._id', + 'product', + 'productSku', + 'state', + 'state.type', + 'createdAt', + 'updatedAt', + ]; import { listListingVarientsRouteHandler, getListingVarientRouteHandler, @@ -15,22 +26,14 @@ import { publishListingVarientRouteHandler, unpublishListingVarientRouteHandler, searchListingVarientsRouteHandler, - getListingVarientPropertyValuesRouteHandler + getListingVarientPropertyValuesRouteHandler, + + getListingVarientNeighborsRouteHandler } from '../../services/sales/listingvarients.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = [ - 'listing', - 'listing._id', - 'product', - 'productSku', - 'state', - 'state.type', - 'createdAt', - 'updatedAt', - ]; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listListingVarientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); @@ -46,7 +49,7 @@ router.get('/properties', isAuthenticated, (req, res) => { 'createdAt', 'updatedAt', ]; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -84,6 +87,12 @@ router.post('/:id/unpublish', isAuthenticated, (req, res) => { unpublishListingVarientRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getListingVarientNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getListingVarientRouteHandler(req, res); }); diff --git a/src/routes/sales/marketplaces.js b/src/routes/sales/marketplaces.js index afdeec8..e344906 100644 --- a/src/routes/sales/marketplaces.js +++ b/src/routes/sales/marketplaces.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt']; import { listMarketplacesRouteHandler, getMarketplaceRouteHandler, @@ -19,20 +21,21 @@ import { syncMarketplaceOrdersRouteHandler, marketplaceWebhookRouteHandler, searchMarketplacesRouteHandler, - getMarketplacePropertyValuesRouteHandler + getMarketplacePropertyValuesRouteHandler, + + getMarketplaceNeighborsRouteHandler } from '../../services/sales/marketplaces.js'; router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listMarketplacesRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = JSON.parse(req.query.masterFilter); @@ -87,6 +90,12 @@ router.post('/:id/hook', (req, res) => { marketplaceWebhookRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getMarketplaceNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getMarketplaceRouteHandler(req, res); }); diff --git a/src/routes/sales/salesorders.js b/src/routes/sales/salesorders.js index d5c267f..558b3bf 100644 --- a/src/routes/sales/salesorders.js +++ b/src/routes/sales/salesorders.js @@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js'; import { getFilter, convertPropertiesString } from '../../utils.js'; const router = express.Router(); + +const listAllowedFilters = ['client', 'state', 'value', 'client._id']; import { listSalesOrdersRouteHandler, getSalesOrderRouteHandler, @@ -17,21 +19,22 @@ import { confirmSalesOrderRouteHandler, cancelSalesOrderRouteHandler, searchSalesOrdersRouteHandler, - getSalesOrderPropertyValuesRouteHandler + getSalesOrderPropertyValuesRouteHandler, + + getSalesOrderNeighborsRouteHandler } from '../../services/sales/salesorders.js'; // list of sales orders router.get('/', isAuthenticated, (req, res) => { const { page, limit, property, search, sort, order } = req.query; - const allowedFilters = ['client', 'state', 'value', 'client._id']; - const filter = getFilter(req.query, allowedFilters); + const filter = getFilter(req.query, listAllowedFilters); listSalesOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); }); router.get('/properties', isAuthenticated, (req, res) => { let properties = convertPropertiesString(req.query.properties); const allowedFilters = ['client', 'state.type', 'value', 'client._id']; - const filter = getFilter(req.query, allowedFilters, false); + const filter = getFilter(req.query, listAllowedFilters, false); var masterFilter = {}; if (req.query.masterFilter) { masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); @@ -63,6 +66,12 @@ router.get('/history', isAuthenticated, (req, res) => { getSalesOrderHistoryRouteHandler(req, res); }); +router.get('/neighbors', isAuthenticated, (req, res) => { + const { property, search, sort, order, id } = req.query; + const filter = getFilter(req.query, listAllowedFilters); + getSalesOrderNeighborsRouteHandler(req, res, property, filter, search, sort, order, id); +}); + router.get('/:id', isAuthenticated, (req, res) => { getSalesOrderRouteHandler(req, res); }); diff --git a/src/services/finance/invoices.js b/src/services/finance/invoices.js index 5f0ea7b..6de7203 100644 --- a/src/services/finance/invoices.js +++ b/src/services/finance/invoices.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js'; @@ -574,3 +575,35 @@ export const cancelInvoiceRouteHandler = async (req, res) => { logger.debug(`Cancelled invoice with ID: ${id}`); res.send(result); }; +export const getInvoiceNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: invoiceModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching invoice neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved invoice neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/finance/payments.js b/src/services/finance/payments.js index f799daf..8782c36 100644 --- a/src/services/finance/payments.js +++ b/src/services/finance/payments.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { invoiceModel } from '../../database/schemas/finance/invoice.schema.js'; @@ -469,3 +470,35 @@ export const cancelPaymentRouteHandler = async (req, res) => { logger.debug(`Cancelled payment with ID: ${id}`); res.send(result); }; +export const getPaymentNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: paymentModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching payment neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved payment neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/finance/taxrecords.js b/src/services/finance/taxrecords.js index 76c8962..8f06e66 100644 --- a/src/services/finance/taxrecords.js +++ b/src/services/finance/taxrecords.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('TaxRecords'); logger.level = config.server.logLevel; @@ -204,3 +205,35 @@ export const getTaxRecordHistoryRouteHandler = async (req, res) => { logger.trace('Tax record history:', result); res.send(result); }; +export const getTaxRecordNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: taxRecordModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching taxRecord neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved taxRecord neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/filamentstocks.js b/src/services/inventory/filamentstocks.js index 591764d..c405472 100644 --- a/src/services/inventory/filamentstocks.js +++ b/src/services/inventory/filamentstocks.js @@ -14,6 +14,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js'; const logger = log4js.getLogger('Filament Stocks'); @@ -263,3 +264,35 @@ export const getFilamentStockHistoryRouteHandler = async (req, res) => { logger.trace('Filament stock history:', result); res.send(result); }; +export const getFilamentStockNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: filamentStockModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching filamentStock neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved filamentStock neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/orderitems.js b/src/services/inventory/orderitems.js index 267d596..5c0e556 100644 --- a/src/services/inventory/orderitems.js +++ b/src/services/inventory/orderitems.js @@ -15,6 +15,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Order Items'); logger.level = config.server.logLevel; @@ -414,3 +415,35 @@ export const getOrderItemHistoryRouteHandler = async (req, res) => { logger.trace('Order item history:', result); res.send(result); }; +export const getOrderItemNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: orderItemModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching orderItem neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved orderItem neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/partstocks.js b/src/services/inventory/partstocks.js index a71cf37..5a1ad86 100644 --- a/src/services/inventory/partstocks.js +++ b/src/services/inventory/partstocks.js @@ -14,6 +14,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Part Stocks'); logger.level = config.server.logLevel; @@ -227,3 +228,35 @@ export const getPartStockHistoryRouteHandler = async (req, res) => { logger.trace('Part stock history:', result); res.send(result); }; +export const getPartStockNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: partStockModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching partStock neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved partStock neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/productstocks.js b/src/services/inventory/productstocks.js index 704bcea..349cb7d 100644 --- a/src/services/inventory/productstocks.js +++ b/src/services/inventory/productstocks.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { productSkuModel } from '../../database/schemas/management/productsku.schema.js'; const logger = log4js.getLogger('Product Stocks'); @@ -325,3 +326,35 @@ export const postProductStockRouteHandler = async (req, res) => { logger.debug(`Posted product stock with ID: ${id}`); res.send(result); }; +export const getProductStockNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: productStockModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching productStock neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved productStock neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/purchaseorders.js b/src/services/inventory/purchaseorders.js index b7940bb..8c60191 100644 --- a/src/services/inventory/purchaseorders.js +++ b/src/services/inventory/purchaseorders.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js'; @@ -476,3 +477,35 @@ export const cancelPurchaseOrderRouteHandler = async (req, res) => { logger.debug(`Cancelled purchase order with ID: ${id}`); res.send(result); }; +export const getPurchaseOrderNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: purchaseOrderModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching purchaseOrder neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved purchaseOrder neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/shipments.js b/src/services/inventory/shipments.js index 6fa9a86..0ec2291 100644 --- a/src/services/inventory/shipments.js +++ b/src/services/inventory/shipments.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Shipments'); logger.level = config.server.logLevel; @@ -459,3 +460,35 @@ export const cancelShipmentRouteHandler = async (req, res) => { logger.debug(`Cancelled shipment with ID: ${id}`); res.send(result); }; +export const getShipmentNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: shipmentModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching shipment neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved shipment neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/stockaudits.js b/src/services/inventory/stockaudits.js index 815a19e..4eb8d30 100644 --- a/src/services/inventory/stockaudits.js +++ b/src/services/inventory/stockaudits.js @@ -5,7 +5,8 @@ import mongoose from 'mongoose'; import { getAuditLogs } from '../../utils.js'; import { getModelStats, getModelHistory, - searchObjects + searchObjects, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Stock Audits'); @@ -200,3 +201,35 @@ export const getStockAuditHistoryRouteHandler = async (req, res) => { logger.trace('Stock audit history:', result); res.send(result); }; + +export const getStockAuditNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: stockAuditModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching stock audit neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved stock audit neighbors for ID: ${id}`); + res.send(result); +}; diff --git a/src/services/inventory/stockevents.js b/src/services/inventory/stockevents.js index 8572d78..0c403fb 100644 --- a/src/services/inventory/stockevents.js +++ b/src/services/inventory/stockevents.js @@ -14,6 +14,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Stock Events'); logger.level = config.server.logLevel; @@ -236,3 +237,35 @@ export const getStockEventHistoryRouteHandler = async (req, res) => { logger.trace('Stock event history:', result); res.send(result); }; +export const getStockEventNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: stockEventModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching stockEvent neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved stockEvent neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/stocklocations.js b/src/services/inventory/stocklocations.js index 71fafb8..ff90d06 100644 --- a/src/services/inventory/stocklocations.js +++ b/src/services/inventory/stocklocations.js @@ -14,6 +14,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Stock Locations'); @@ -212,3 +213,35 @@ export const getStockLocationHistoryRouteHandler = async (req, res) => { logger.trace('Stock location history:', result); res.send(result); }; +export const getStockLocationNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: stockLocationModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching stockLocation neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved stockLocation neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/inventory/stocktransfers.js b/src/services/inventory/stocktransfers.js index 43ae682..58df26c 100644 --- a/src/services/inventory/stocktransfers.js +++ b/src/services/inventory/stocktransfers.js @@ -20,6 +20,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Stock Transfers'); @@ -533,3 +534,35 @@ export const getStockTransferHistoryRouteHandler = async (req, res) => { logger.trace('Stock transfer history:', result); res.send(result); }; +export const getStockTransferNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: stockEventModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching stockTransfer neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved stockTransfer neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/apppasswords.js b/src/services/management/apppasswords.js index 6b89577..1ea413a 100644 --- a/src/services/management/apppasswords.js +++ b/src/services/management/apppasswords.js @@ -15,6 +15,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('AppPasswords'); @@ -246,3 +247,35 @@ export const regenerateSecretRouteHandler = async (req, res) => { logger.debug(`Regenerated secret for app password with ID: ${id}`); res.send({ appPassword: plainSecret }); }; +export const getAppPasswordNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: appPasswordModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching appPassword neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved appPassword neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/courier.js b/src/services/management/courier.js index 7a1f099..0ffa852 100644 --- a/src/services/management/courier.js +++ b/src/services/management/courier.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Couriers'); logger.level = config.server.logLevel; @@ -205,3 +206,35 @@ export const getCourierHistoryRouteHandler = async (req, res) => { logger.trace('Courier history:', result); res.send(result); }; +export const getCourierNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: courierModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching courier neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved courier neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/courierservice.js b/src/services/management/courierservice.js index dc8cd43..79557b6 100644 --- a/src/services/management/courierservice.js +++ b/src/services/management/courierservice.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('CourierServices'); logger.level = config.server.logLevel; @@ -223,3 +224,35 @@ export const getCourierServiceHistoryRouteHandler = async (req, res) => { logger.trace('Courier service history:', result); res.send(result); }; +export const getCourierServiceNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: courierServiceModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching courierService neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved courierService neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/documentjobs.js b/src/services/management/documentjobs.js index 5d65163..9cf8606 100644 --- a/src/services/management/documentjobs.js +++ b/src/services/management/documentjobs.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Document Jobs'); logger.level = config.server.logLevel; @@ -201,3 +202,35 @@ export const getDocumentJobHistoryRouteHandler = async (req, res) => { logger.trace('Document job history:', result); res.send(result); }; +export const getDocumentJobNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: documentJobModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching documentJob neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved documentJob neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/documentprinters.js b/src/services/management/documentprinters.js index 16eadd9..f5fd42f 100644 --- a/src/services/management/documentprinters.js +++ b/src/services/management/documentprinters.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Document Templates'); logger.level = config.server.logLevel; @@ -212,3 +213,35 @@ export const getDocumentPrinterHistoryRouteHandler = async (req, res) => { logger.trace('Document printer history:', result); res.send(result); }; +export const getDocumentPrinterNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: documentPrinterModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching documentPrinter neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved documentPrinter neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/documentsizes.js b/src/services/management/documentsizes.js index 92b1b72..66ca9af 100644 --- a/src/services/management/documentsizes.js +++ b/src/services/management/documentsizes.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Document Sizes'); logger.level = config.server.logLevel; @@ -200,3 +201,35 @@ export const getDocumentSizeHistoryRouteHandler = async (req, res) => { logger.trace('Document size history:', result); res.send(result); }; +export const getDocumentSizeNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: documentSizeModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching documentSize neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved documentSize neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/documenttemplates.js b/src/services/management/documenttemplates.js index 190d47a..ea90108 100644 --- a/src/services/management/documenttemplates.js +++ b/src/services/management/documenttemplates.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Document Templates'); logger.level = config.server.logLevel; @@ -229,3 +230,35 @@ export const getDocumentTemplateHistoryRouteHandler = async (req, res) => { logger.trace('Document template history:', result); res.send(result); }; +export const getDocumentTemplateNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: documentTemplateModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching documentTemplate neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved documentTemplate neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/filaments.js b/src/services/management/filaments.js index 8acf34e..bc50739 100644 --- a/src/services/management/filaments.js +++ b/src/services/management/filaments.js @@ -14,6 +14,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Filaments'); @@ -260,3 +261,35 @@ export const getFilamentHistoryRouteHandler = async (req, res) => { logger.trace('Filament history:', result); res.send(result); }; +export const getFilamentNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: filamentModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching filament neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved filament neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/filamentskus.js b/src/services/management/filamentskus.js index 8a232aa..396dc31 100644 --- a/src/services/management/filamentskus.js +++ b/src/services/management/filamentskus.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Filament SKUs'); logger.level = config.server.logLevel; @@ -213,3 +214,35 @@ export const getFilamentSkuHistoryRouteHandler = async (req, res) => { logger.trace('Filament SKU history:', result); res.send(result); }; +export const getFilamentSkuNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: filamentSkuModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching filamentSku neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved filamentSku neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/files.js b/src/services/management/files.js index fa91def..f2ffce2 100644 --- a/src/services/management/files.js +++ b/src/services/management/files.js @@ -17,6 +17,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, createFileThumbnails, getThumbnail, } from '../../database/database.js'; @@ -579,3 +580,35 @@ export const getFileHistoryRouteHandler = async (req, res) => { logger.trace('File history:', result); res.send(result); }; + +export const getFileNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: fileModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching file neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved file neighbors for ID: ${id}`); + res.send(result); +}; diff --git a/src/services/management/hosts.js b/src/services/management/hosts.js index c98cf1b..046383a 100644 --- a/src/services/management/hosts.js +++ b/src/services/management/hosts.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Hosts'); logger.level = config.server.logLevel; @@ -201,3 +202,35 @@ export const getHostHistoryRouteHandler = async (req, res) => { logger.trace('Host history:', result); res.send(result); }; +export const getHostNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: hostModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching host neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved host neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/materials.js b/src/services/management/materials.js index 25eb663..1ad3d99 100644 --- a/src/services/management/materials.js +++ b/src/services/management/materials.js @@ -12,6 +12,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Materials'); @@ -179,3 +180,35 @@ export const getMaterialHistoryRouteHandler = async (req, res) => { logger.trace('Material history:', result); res.send(result); }; +export const getMaterialNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: materialModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching material neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved material neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/notetypes.js b/src/services/management/notetypes.js index 1241e4a..77dc5c3 100644 --- a/src/services/management/notetypes.js +++ b/src/services/management/notetypes.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Note Types'); logger.level = config.server.logLevel; @@ -198,3 +199,35 @@ export const getNoteTypeHistoryRouteHandler = async (req, res) => { logger.trace('Note type history:', result); res.send(result); }; +export const getNoteTypeNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: noteTypeModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching noteType neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved noteType neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/parts.js b/src/services/management/parts.js index e3510e5..1ece91f 100644 --- a/src/services/management/parts.js +++ b/src/services/management/parts.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Parts'); logger.level = config.server.logLevel; @@ -217,3 +218,35 @@ export const getPartHistoryRouteHandler = async (req, res) => { logger.trace('Part history:', result); res.send(result); }; +export const getPartNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: partModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching part neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved part neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/partskus.js b/src/services/management/partskus.js index 06b6aa8..03b06df 100644 --- a/src/services/management/partskus.js +++ b/src/services/management/partskus.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Part SKUs'); logger.level = config.server.logLevel; @@ -231,3 +232,35 @@ export const getPartSkuHistoryRouteHandler = async (req, res) => { logger.trace('Part SKU history:', result); res.send(result); }; +export const getPartSkuNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: partSkuModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching partSku neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved partSku neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/productcategories.js b/src/services/management/productcategories.js index 6261ac2..d804c7b 100644 --- a/src/services/management/productcategories.js +++ b/src/services/management/productcategories.js @@ -13,6 +13,7 @@ import { newObject, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('ProductCategories'); @@ -195,3 +196,35 @@ export const getProductCategoryHistoryRouteHandler = async (req, res) => { logger.trace('Product category history:', result); res.send(result); }; +export const getProductCategoryNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: productCategoryModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching productCategory neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved productCategory neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/products.js b/src/services/management/products.js index 87fd133..6a054cd 100644 --- a/src/services/management/products.js +++ b/src/services/management/products.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Products'); logger.level = config.server.logLevel; @@ -223,3 +224,35 @@ export const getProductHistoryRouteHandler = async (req, res) => { logger.trace('Product history:', result); res.send(result); }; +export const getProductNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: productModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching product neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved product neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/productskus.js b/src/services/management/productskus.js index d108a70..5b5e584 100644 --- a/src/services/management/productskus.js +++ b/src/services/management/productskus.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Product SKUs'); logger.level = config.server.logLevel; @@ -236,3 +237,35 @@ export const getProductSkuHistoryRouteHandler = async (req, res) => { logger.trace('Product SKU history:', result); res.send(result); }; +export const getProductSkuNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: productSkuModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching productSku neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved productSku neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/taxrates.js b/src/services/management/taxrates.js index bd634e8..608de28 100644 --- a/src/services/management/taxrates.js +++ b/src/services/management/taxrates.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('TaxRates'); logger.level = config.server.logLevel; @@ -208,3 +209,35 @@ export const getTaxRateHistoryRouteHandler = async (req, res) => { logger.trace('Tax rate history:', result); res.send(result); }; +export const getTaxRateNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: taxRateModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching taxRate neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved taxRate neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/users.js b/src/services/management/users.js index f7a6cec..80da829 100644 --- a/src/services/management/users.js +++ b/src/services/management/users.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Users'); @@ -206,3 +207,35 @@ export const setAppPasswordRouteHandler = async (req, res) => { res.send({ appPassword }); }; +export const getUserNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: userModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching user neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved user neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/management/vendors.js b/src/services/management/vendors.js index c583f96..e45b3d5 100644 --- a/src/services/management/vendors.js +++ b/src/services/management/vendors.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Vendors'); logger.level = config.server.logLevel; @@ -208,3 +209,35 @@ export const getVendorHistoryRouteHandler = async (req, res) => { logger.trace('Vendor history:', result); res.send(result); }; +export const getVendorNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: vendorModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching vendor neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved vendor neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/misc/notes.js b/src/services/misc/notes.js index 6e6576a..dd1794d 100644 --- a/src/services/misc/notes.js +++ b/src/services/misc/notes.js @@ -12,6 +12,7 @@ import { getModelStats, getModelHistory, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import mongoose from 'mongoose'; import { newNoteNotification } from '../../utils.js'; @@ -204,3 +205,35 @@ export const getNoteHistoryRouteHandler = async (req, res) => { logger.trace('Note history:', result); res.send(result); }; +export const getNoteNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: noteModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching note neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved note neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/production/filamentprofiles.js b/src/services/production/filamentprofiles.js index 7a52dee..be19b59 100644 --- a/src/services/production/filamentprofiles.js +++ b/src/services/production/filamentprofiles.js @@ -11,6 +11,7 @@ import { newObject, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('FilamentProfiles'); @@ -314,3 +315,35 @@ export const deleteFilamentProfileRouteHandler = async (req, res) => { logger.debug(`Deleted filament profile with ID: ${result._id}`); res.send(result); }; +export const getFilamentProfileNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: filamentProfileModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching filamentProfile neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved filamentProfile neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/production/gcodefiles.js b/src/services/production/gcodefiles.js index 843fd03..6f146d2 100644 --- a/src/services/production/gcodefiles.js +++ b/src/services/production/gcodefiles.js @@ -10,6 +10,7 @@ import { newObject, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { getFileContentRouteHandler } from '../management/files.js'; import mongoose from 'mongoose'; @@ -226,3 +227,35 @@ export const getGCodeFileStatsRouteHandler = async (req, res) => { res.status(500).send({ error: error.message }); } }; +export const getGCodeFileNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: gcodeFileModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching gCodeFile neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved gCodeFile neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/production/jobs.js b/src/services/production/jobs.js index bf21ba4..18a4f5d 100644 --- a/src/services/production/jobs.js +++ b/src/services/production/jobs.js @@ -12,7 +12,8 @@ import { getModelStats, getModelHistory, searchObjects, - checkStates + checkStates, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Jobs'); logger.level = config.server.logLevel; @@ -216,3 +217,35 @@ export const getJobHistoryRouteHandler = async (req, res) => { logger.trace('Job history:', result); res.send(result); }; + +export const getJobNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: jobModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching job neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved job neighbors for ID: ${id}`); + res.send(result); +}; diff --git a/src/services/production/printerprofiles.js b/src/services/production/printerprofiles.js index 892c480..6c7b4b4 100644 --- a/src/services/production/printerprofiles.js +++ b/src/services/production/printerprofiles.js @@ -11,6 +11,7 @@ import { newObject, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('PrinterProfiles'); @@ -202,3 +203,35 @@ export const deletePrinterProfileRouteHandler = async (req, res) => { logger.debug(`Deleted printer profile with ID: ${result._id}`); res.send(result); }; +export const getPrinterProfileNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: printerProfileModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching printerProfile neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved printerProfile neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/production/printers.js b/src/services/production/printers.js index fd3167a..926f38e 100644 --- a/src/services/production/printers.js +++ b/src/services/production/printers.js @@ -12,6 +12,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import mongoose from 'mongoose'; @@ -217,3 +218,35 @@ export const getPrinterHistoryRouteHandler = async (req, res) => { logger.trace('Printer history:', result); res.send(result); }; + +export const getPrinterNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: printerModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching printer neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved printer neighbors for ID: ${id}`); + res.send(result); +}; diff --git a/src/services/production/subjobs.js b/src/services/production/subjobs.js index c1c04b5..a9825b5 100644 --- a/src/services/production/subjobs.js +++ b/src/services/production/subjobs.js @@ -9,6 +9,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Sub Jobs'); logger.level = config.server.logLevel; @@ -122,3 +123,35 @@ export const getSubJobHistoryRouteHandler = async (req, res) => { logger.trace('Sub job history:', result); res.send(result); }; +export const getSubJobNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: subJobModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching subJob neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved subJob neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/sales/clients.js b/src/services/sales/clients.js index 74fda09..e98ec6b 100644 --- a/src/services/sales/clients.js +++ b/src/services/sales/clients.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; const logger = log4js.getLogger('Clients'); logger.level = config.server.logLevel; @@ -208,4 +209,35 @@ export const getClientHistoryRouteHandler = async (req, res) => { logger.trace('Client history:', result); res.send(result); }; +export const getClientNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: clientModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching client neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved client neighbors for ID: ${id}`); + res.send(result); +}; diff --git a/src/services/sales/listings.js b/src/services/sales/listings.js index 94d7367..5a5b1ca 100644 --- a/src/services/sales/listings.js +++ b/src/services/sales/listings.js @@ -16,6 +16,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { hasIntegration, @@ -499,3 +500,35 @@ export const unpublishListingRouteHandler = async (req, res) => { res.status(500).send({ error: err.message, code: 500 }); } }; +export const getListingNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: listingModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching listing neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved listing neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/sales/listingvarients.js b/src/services/sales/listingvarients.js index 8dcedcd..e4b012c 100644 --- a/src/services/sales/listingvarients.js +++ b/src/services/sales/listingvarients.js @@ -14,6 +14,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { listingModel } from '../../database/schemas/sales/listing.schema.js'; import { @@ -458,3 +459,35 @@ export const unpublishListingVarientRouteHandler = async (req, res) => { res.status(500).send({ error: err.message, code: 500 }); } }; +export const getListingVarientNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: listingVarientModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching listingVarient neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved listingVarient neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/sales/marketplaces.js b/src/services/sales/marketplaces.js index df1430e..7440f81 100644 --- a/src/services/sales/marketplaces.js +++ b/src/services/sales/marketplaces.js @@ -13,6 +13,7 @@ import { getModelHistory, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import * as marketplaceIntegration from '../../integrations/marketplaceworker.js'; const logger = log4js.getLogger('Marketplaces'); @@ -383,3 +384,35 @@ export const marketplaceWebhookRouteHandler = async (req, res) => { res.status(500).send({ error: err.message, code: 500 }); } }; +export const getMarketplaceNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: marketplaceModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching marketplace neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved marketplace neighbors for ID: ${id}`); + res.send(result); +}; + diff --git a/src/services/sales/salesorders.js b/src/services/sales/salesorders.js index 943ed1b..e10c2fd 100644 --- a/src/services/sales/salesorders.js +++ b/src/services/sales/salesorders.js @@ -15,6 +15,7 @@ import { checkStates, searchObjects, getPropertyValues, + getObjectNeighbors, } from '../../database/database.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js'; @@ -479,4 +480,35 @@ export const cancelSalesOrderRouteHandler = async (req, res) => { logger.debug(`Cancelled sales order with ID: ${id}`); res.send(result); }; +export const getSalesOrderNeighborsRouteHandler = async ( + req, + res, + property = '', + filter = {}, + search = '', + sort = '', + order = 'ascend', + id +) => { + if (!id) { + return res.status(400).send({ error: 'Missing id parameter', code: 400 }); + } + + const result = await getObjectNeighbors({ + model: salesOrderModel, + id, + filter, + search, + sort, + order, + }); + + if (result?.error) { + logger.error('Error fetching salesOrder neighbors.'); + return res.status(result.code).send(result); + } + + logger.debug(`Retrieved salesOrder neighbors for ID: ${id}`); + res.send(result); +};