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); +};