Implement neighbors caching and retrieval for various entities in the inventory and finance modules. Introduced new route handlers for fetching neighbors in invoices, payments, tax records, filament stocks, order items, part stocks, product stocks, purchase orders, shipments, stock audits, stock events, stock locations, and stock transfers. Updated allowed filters for improved query capabilities across these routes. Enhanced database.js with caching logic for neighbors, including cache invalidation on object updates.
Some checks failed
farmcontrol/farmcontrol-api/pipeline/head There was a failure building this commit

This commit is contained in:
Tom Butcher 2026-08-01 13:20:01 +01:00
parent 6a9cd2a2ea
commit 1e807beacf
93 changed files with 2349 additions and 257 deletions

View File

@ -2,6 +2,7 @@ import config from '../config.js';
import { fileModel } from './schemas/management/file.schema.js'; import { fileModel } from './schemas/management/file.schema.js';
import _ from 'lodash'; import _ from 'lodash';
import log4js from 'log4js'; import log4js from 'log4js';
import crypto from 'crypto';
import sharp from 'sharp'; import sharp from 'sharp';
import { encode as encodeBlurHash } from 'blurhash'; import { encode as encodeBlurHash } from 'blurhash';
import { uploadFile, deleteFile, downloadFile, BUCKETS } from './ceph.js'; import { uploadFile, deleteFile, downloadFile, BUCKETS } from './ceph.js';
@ -36,6 +37,9 @@ const cacheLogger = log4js.getLogger('DatabaseCache');
cacheLogger.level = config.server.logLevel; cacheLogger.level = config.server.logLevel;
const CACHE_TTL_SECONDS = parseInt(config.database.redis.cacheTtl || '30', 10); 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) => const mergeObjectUpdates = (target, source) =>
_.mergeWith(target, source, (objValue, srcValue) => { _.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. // Utility to run one or many rollup aggregations in a single query via $facet.
export const aggregateRollups = async ({ model, baseFilter = {}, rollupConfigs = [] }) => { export const aggregateRollups = async ({ model, baseFilter = {}, rollupConfigs = [] }) => {
if (!rollupConfigs.length) { 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 = [] }) => { export const searchObjects = async ({ model, search, populate = [] }) => {
try { try {
const isRefOrIdSearch = search.match(/^.{3}:/); const isRefOrIdSearch = search.match(/^.{3}:/);
@ -873,6 +1040,7 @@ export const editObject = async ({ model, id, updateData, user, populate, recalc
object: updatedObject, object: updatedObject,
populate, populate,
}); });
await invalidateNeighborsCacheForObject({ model, id });
if (model.recalculate && recalculate == true) { if (model.recalculate && recalculate == true) {
logger.debug(`Recalculating ${model.modelName}`); logger.debug(`Recalculating ${model.modelName}`);
@ -1208,6 +1376,7 @@ export const deleteObject = async (
// Invalidate cache for this object // Invalidate cache for this object
await deleteObjectCache({ model, id }); await deleteObjectCache({ model, id });
await invalidateNeighborsCacheForObject({ model, id });
if (model.recalculate) { if (model.recalculate) {
logger.debug(`Recalculating ${model.modelName}`); logger.debug(`Recalculating ${model.modelName}`);

View File

@ -3,6 +3,17 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'vendor',
'client',
'state',
'vendor._id',
'client._id',
'order',
'order._id',
'orderType',
];
import { import {
listInvoicesRouteHandler, listInvoicesRouteHandler,
getInvoiceRouteHandler, getInvoiceRouteHandler,
@ -17,23 +28,15 @@ import {
cancelInvoiceRouteHandler, cancelInvoiceRouteHandler,
postInvoiceRouteHandler, postInvoiceRouteHandler,
searchInvoicesRouteHandler, searchInvoicesRouteHandler,
getInvoicePropertyValuesRouteHandler getInvoicePropertyValuesRouteHandler,
getInvoiceNeighborsRouteHandler
} from '../../services/finance/invoices.js'; } from '../../services/finance/invoices.js';
// list of invoices // list of invoices
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'vendor',
'client',
'state',
'vendor._id',
'client._id',
'order',
'order._id',
'orderType',
];
const filter = getFilter(req.query, allowedFilters);
listInvoicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listInvoicesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -49,7 +52,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'vendor._id', 'vendor._id',
'client._id', 'client._id',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -81,6 +84,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getInvoiceHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getInvoiceRouteHandler(req, res); getInvoiceRouteHandler(req, res);
}); });

View File

@ -3,6 +3,16 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'vendor',
'client',
'state',
'vendor._id',
'client._id',
'invoice',
'invoice._id',
];
import { import {
listPaymentsRouteHandler, listPaymentsRouteHandler,
getPaymentRouteHandler, getPaymentRouteHandler,
@ -18,22 +28,15 @@ import {
declinePaymentRouteHandler, declinePaymentRouteHandler,
cancelPaymentRouteHandler, cancelPaymentRouteHandler,
searchPaymentsRouteHandler, searchPaymentsRouteHandler,
getPaymentPropertyValuesRouteHandler getPaymentPropertyValuesRouteHandler,
getPaymentNeighborsRouteHandler
} from '../../services/finance/payments.js'; } from '../../services/finance/payments.js';
// list of payments // list of payments
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'vendor',
'client',
'state',
'vendor._id',
'client._id',
'invoice',
'invoice._id',
];
const filter = getFilter(req.query, allowedFilters);
listPaymentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPaymentsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -49,7 +52,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'client._id', 'client._id',
'invoice._id', 'invoice._id',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -81,6 +84,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPaymentHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPaymentRouteHandler(req, res); getPaymentRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['taxRate', 'transactionType', 'transaction', 'transactionDate'];
import { import {
listTaxRecordsRouteHandler, listTaxRecordsRouteHandler,
getTaxRecordRouteHandler, getTaxRecordRouteHandler,
@ -13,21 +15,22 @@ import {
getTaxRecordStatsRouteHandler, getTaxRecordStatsRouteHandler,
getTaxRecordHistoryRouteHandler, getTaxRecordHistoryRouteHandler,
searchTaxRecordsRouteHandler, searchTaxRecordsRouteHandler,
getTaxRecordPropertyValuesRouteHandler getTaxRecordPropertyValuesRouteHandler,
getTaxRecordNeighborsRouteHandler
} from '../../services/finance/taxrecords.js'; } from '../../services/finance/taxrecords.js';
// list of tax records // list of tax records
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['taxRate', 'transactionType', 'transaction', 'transactionDate']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listTaxRecordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listTaxRecordsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['taxRate', 'transactionType', 'transaction']; const allowedFilters = ['taxRate', 'transactionType', 'transaction'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getTaxRecordHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getTaxRecordRouteHandler(req, res); getTaxRecordRouteHandler(req, res);
}); });

View File

@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'filament',
'filament._id',
'filamentSku',
'state',
'startingWeight',
'currentWeight',
'filamentSku._id',
'stockLocation',
'stockLocation._id',
];
import { import {
listFilamentStocksRouteHandler, listFilamentStocksRouteHandler,
getFilamentStockRouteHandler, getFilamentStockRouteHandler,
@ -14,24 +26,15 @@ import {
getFilamentStockStatsRouteHandler, getFilamentStockStatsRouteHandler,
getFilamentStockHistoryRouteHandler, getFilamentStockHistoryRouteHandler,
searchFilamentStocksRouteHandler, searchFilamentStocksRouteHandler,
getFilamentStockPropertyValuesRouteHandler getFilamentStockPropertyValuesRouteHandler,
getFilamentStockNeighborsRouteHandler
} from '../../services/inventory/filamentstocks.js'; } from '../../services/inventory/filamentstocks.js';
// list of filament stocks // list of filament stocks
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'filament',
'filament._id',
'filamentSku',
'state',
'startingWeight',
'currentWeight',
'filamentSku._id',
'stockLocation',
'stockLocation._id',
];
const filter = getFilter(req.query, allowedFilters);
listFilamentStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); listFilamentStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -44,7 +47,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'state.type', 'state.type',
'filamentSku._id', 'filamentSku._id',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -76,6 +79,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getFilamentStockHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getFilamentStockRouteHandler(req, res); getFilamentStockRouteHandler(req, res);
}); });

View File

@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'name',
'itemType',
'item',
'item._id',
'order',
'order._id',
'orderType',
'shipment',
'shipment._id',
];
import { import {
listOrderItemsRouteHandler, listOrderItemsRouteHandler,
getOrderItemRouteHandler, getOrderItemRouteHandler,
@ -14,24 +26,15 @@ import {
getOrderItemStatsRouteHandler, getOrderItemStatsRouteHandler,
getOrderItemHistoryRouteHandler, getOrderItemHistoryRouteHandler,
searchOrderItemsRouteHandler, searchOrderItemsRouteHandler,
getOrderItemPropertyValuesRouteHandler getOrderItemPropertyValuesRouteHandler,
getOrderItemNeighborsRouteHandler
} from '../../services/inventory/orderitems.js'; } from '../../services/inventory/orderitems.js';
// list of order items // list of order items
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'name',
'itemType',
'item',
'item._id',
'order',
'order._id',
'orderType',
'shipment',
'shipment._id',
];
const filter = getFilter(req.query, allowedFilters);
listOrderItemsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listOrderItemsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -48,7 +51,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'shipment', 'shipment',
'shipment._id', 'shipment._id',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -80,6 +83,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getOrderItemHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getOrderItemRouteHandler(req, res); getOrderItemRouteHandler(req, res);
}); });

View File

@ -3,6 +3,16 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'partSku',
'state',
'startingQuantity',
'currentQuantity',
'partSku._id',
'stockLocation',
'stockLocation._id',
];
import { import {
listPartStocksRouteHandler, listPartStocksRouteHandler,
getPartStockRouteHandler, getPartStockRouteHandler,
@ -14,29 +24,22 @@ import {
getPartStockStatsRouteHandler, getPartStockStatsRouteHandler,
getPartStockHistoryRouteHandler, getPartStockHistoryRouteHandler,
searchPartStocksRouteHandler, searchPartStocksRouteHandler,
getPartStockPropertyValuesRouteHandler getPartStockPropertyValuesRouteHandler,
getPartStockNeighborsRouteHandler
} from '../../services/inventory/partstocks.js'; } from '../../services/inventory/partstocks.js';
// list of part stocks // list of part stocks
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'partSku',
'state',
'startingQuantity',
'currentQuantity',
'partSku._id',
'stockLocation',
'stockLocation._id',
];
const filter = getFilter(req.query, allowedFilters);
listPartStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPartStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['part', 'state.type']; const allowedFilters = ['part', 'state.type'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -68,6 +71,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPartStockHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPartStockRouteHandler(req, res); getPartStockRouteHandler(req, res);
}); });

View File

@ -3,6 +3,15 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'productSku',
'state',
'currentQuantity',
'productSku._id',
'stockLocation',
'stockLocation._id',
];
import { import {
listProductStocksRouteHandler, listProductStocksRouteHandler,
getProductStockRouteHandler, getProductStockRouteHandler,
@ -15,27 +24,21 @@ import {
getProductStockStatsRouteHandler, getProductStockStatsRouteHandler,
getProductStockHistoryRouteHandler, getProductStockHistoryRouteHandler,
searchProductStocksRouteHandler, searchProductStocksRouteHandler,
getProductStockPropertyValuesRouteHandler getProductStockPropertyValuesRouteHandler,
getProductStockNeighborsRouteHandler
} from '../../services/inventory/productstocks.js'; } from '../../services/inventory/productstocks.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'productSku',
'state',
'currentQuantity',
'productSku._id',
'stockLocation',
'stockLocation._id',
];
const filter = getFilter(req.query, allowedFilters);
listProductStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order); listProductStocksRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['productSku', 'state.type']; const allowedFilters = ['productSku', 'state.type'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -65,6 +68,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getProductStockHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getProductStockRouteHandler(req, res); getProductStockRouteHandler(req, res);
}); });

View File

@ -3,6 +3,19 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'vendor',
'state',
'value',
'vendor._id',
'totalAmount',
'totalAmountWithTax',
'totalTaxAmount',
'shippingAmount',
'shippingAmountWithTax',
'grandTotalAmount',
];
import { import {
listPurchaseOrdersRouteHandler, listPurchaseOrdersRouteHandler,
getPurchaseOrderRouteHandler, getPurchaseOrderRouteHandler,
@ -17,25 +30,15 @@ import {
acknowledgePurchaseOrderRouteHandler, acknowledgePurchaseOrderRouteHandler,
cancelPurchaseOrderRouteHandler, cancelPurchaseOrderRouteHandler,
searchPurchaseOrdersRouteHandler, searchPurchaseOrdersRouteHandler,
getPurchaseOrderPropertyValuesRouteHandler getPurchaseOrderPropertyValuesRouteHandler,
getPurchaseOrderNeighborsRouteHandler
} from '../../services/inventory/purchaseorders.js'; } from '../../services/inventory/purchaseorders.js';
// list of purchase orders // list of purchase orders
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'vendor',
'state',
'value',
'vendor._id',
'totalAmount',
'totalAmountWithTax',
'totalTaxAmount',
'shippingAmount',
'shippingAmountWithTax',
'grandTotalAmount',
];
const filter = getFilter(req.query, allowedFilters);
listPurchaseOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPurchaseOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -53,7 +56,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'shippingAmountWithTax', 'shippingAmountWithTax',
'grandTotalAmount', 'grandTotalAmount',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true);
@ -85,6 +88,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPurchaseOrderHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPurchaseOrderRouteHandler(req, res); getPurchaseOrderRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['orderType', 'order', 'state', 'courierService', 'order._id', 'taxRate'];
import { import {
listShipmentsRouteHandler, listShipmentsRouteHandler,
getShipmentRouteHandler, getShipmentRouteHandler,
@ -17,14 +19,15 @@ import {
receiveShipmentRouteHandler, receiveShipmentRouteHandler,
cancelShipmentRouteHandler, cancelShipmentRouteHandler,
searchShipmentsRouteHandler, searchShipmentsRouteHandler,
getShipmentPropertyValuesRouteHandler getShipmentPropertyValuesRouteHandler,
getShipmentNeighborsRouteHandler
} from '../../services/inventory/shipments.js'; } from '../../services/inventory/shipments.js';
// list of shipments // list of shipments
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['orderType', 'order', 'state', 'courierService', 'order._id', 'taxRate']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listShipmentsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listShipmentsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -38,7 +41,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'order._id', 'order._id',
'taxRate', 'taxRate',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true);
@ -70,6 +73,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getShipmentHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getShipmentRouteHandler(req, res); getShipmentRouteHandler(req, res);
}); });

View File

@ -1,6 +1,6 @@
import express from 'express'; import express from 'express';
import { isAuthenticated } from '../../keycloak.js'; import { isAuthenticated } from '../../keycloak.js';
import { parseFilter } from '../../utils.js'; import { parseFilter, getFilter } from '../../utils.js';
const router = express.Router(); const router = express.Router();
import { import {
@ -11,20 +11,21 @@ import {
deleteStockAuditRouteHandler, deleteStockAuditRouteHandler,
getStockAuditStatsRouteHandler, getStockAuditStatsRouteHandler,
getStockAuditHistoryRouteHandler, getStockAuditHistoryRouteHandler,
searchStockAuditsRouteHandler searchStockAuditsRouteHandler,
getStockAuditNeighborsRouteHandler,
} from '../../services/inventory/stockaudits.js'; } from '../../services/inventory/stockaudits.js';
const listAllowedFilters = ['status', 'type', 'createdBy'];
// List stock audits // List stock audits
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property } = req.query; const { page, limit, property } = req.query;
const allowedFilters = ['status', 'type', 'createdBy'];
var filter = {}; var filter = {};
for (const [key, value] of Object.entries(req.query)) { for (const [key, value] of Object.entries(req.query)) {
for (var i = 0; i < allowedFilters.length; i++) { for (var i = 0; i < listAllowedFilters.length; i++) {
if (key == allowedFilters[i]) { if (key == listAllowedFilters[i]) {
const parsedFilter = parseFilter(key, value); const parsedFilter = parseFilter(key, value);
filter = { ...filter, ...parsedFilter }; filter = { ...filter, ...parsedFilter };
} }
@ -54,6 +55,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getStockAuditHistoryRouteHandler(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 // Get specific stock audit
router.get('/:id', isAuthenticated, (req, res) => { router.get('/:id', isAuthenticated, (req, res) => {
getStockAuditRouteHandler(req, res); getStockAuditRouteHandler(req, res);

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['owner._id', 'parent._id'];
import { import {
listStockEventsRouteHandler, listStockEventsRouteHandler,
getStockEventRouteHandler, getStockEventRouteHandler,
@ -14,21 +16,22 @@ import {
getStockEventStatsRouteHandler, getStockEventStatsRouteHandler,
getStockEventHistoryRouteHandler, getStockEventHistoryRouteHandler,
searchStockEventsRouteHandler, searchStockEventsRouteHandler,
getStockEventPropertyValuesRouteHandler getStockEventPropertyValuesRouteHandler,
getStockEventNeighborsRouteHandler
} from '../../services/inventory/stockevents.js'; } from '../../services/inventory/stockevents.js';
// list of stock events // list of stock events
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, sort, order } = req.query; const { page, limit, sort, order } = req.query;
const allowedFilters = ['owner._id', 'parent._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listStockEventsRouteHandler(req, res, page, limit, filter, sort, order); listStockEventsRouteHandler(req, res, page, limit, filter, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['owner._id', 'parent._id']; const allowedFilters = ['owner._id', 'parent._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -60,6 +63,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getStockEventHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getStockEventRouteHandler(req, res); getStockEventRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name'];
import { import {
listStockLocationsRouteHandler, listStockLocationsRouteHandler,
getStockLocationRouteHandler, getStockLocationRouteHandler,
@ -14,20 +16,21 @@ import {
getStockLocationStatsRouteHandler, getStockLocationStatsRouteHandler,
getStockLocationHistoryRouteHandler, getStockLocationHistoryRouteHandler,
searchStockLocationsRouteHandler, searchStockLocationsRouteHandler,
getStockLocationPropertyValuesRouteHandler getStockLocationPropertyValuesRouteHandler,
getStockLocationNeighborsRouteHandler
} from '../../services/inventory/stocklocations.js'; } from '../../services/inventory/stocklocations.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listStockLocationsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listStockLocationsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name']; const allowedFilters = ['name'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -57,6 +60,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getStockLocationHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getStockLocationRouteHandler(req, res); getStockLocationRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['state', 'state.type', 'postedAt'];
import { import {
listStockTransfersRouteHandler, listStockTransfersRouteHandler,
getStockTransferRouteHandler, getStockTransferRouteHandler,
@ -15,20 +17,21 @@ import {
getStockTransferStatsRouteHandler, getStockTransferStatsRouteHandler,
getStockTransferHistoryRouteHandler, getStockTransferHistoryRouteHandler,
searchStockTransfersRouteHandler, searchStockTransfersRouteHandler,
getStockTransferPropertyValuesRouteHandler getStockTransferPropertyValuesRouteHandler,
getStockTransferNeighborsRouteHandler
} from '../../services/inventory/stocktransfers.js'; } from '../../services/inventory/stocktransfers.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['state', 'state.type', 'postedAt']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listStockTransfersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listStockTransfersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['state.type']; const allowedFilters = ['state.type'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -58,6 +61,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getStockTransferHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getStockTransferRouteHandler(req, res); getStockTransferRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'user', 'active', 'user._id'];
import { import {
listAppPasswordsRouteHandler, listAppPasswordsRouteHandler,
getAppPasswordRouteHandler, getAppPasswordRouteHandler,
@ -15,19 +17,20 @@ import {
regenerateSecretRouteHandler, regenerateSecretRouteHandler,
searchAppPasswordsRouteHandler, searchAppPasswordsRouteHandler,
getAppPasswordPropertyValuesRouteHandler, getAppPasswordPropertyValuesRouteHandler,
getAppPasswordNeighborsRouteHandler
} from '../../services/management/apppasswords.js'; } from '../../services/management/apppasswords.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'user', 'active', 'user._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listAppPasswordsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listAppPasswordsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
const properties = convertPropertiesString(req.query.properties); const properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name', 'user', 'active']; 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) : {}; const masterFilter = req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {};
listAppPasswordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter); listAppPasswordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
}); });
@ -58,6 +61,12 @@ router.post('/:id/regenerateSecret', isAuthenticated, async (req, res) => {
regenerateSecretRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getAppPasswordRouteHandler(req, res); getAppPasswordRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country'];
import { import {
listCouriersRouteHandler, listCouriersRouteHandler,
getCourierRouteHandler, getCourierRouteHandler,
@ -14,20 +16,21 @@ import {
getCourierHistoryRouteHandler, getCourierHistoryRouteHandler,
searchCouriersRouteHandler, searchCouriersRouteHandler,
getCourierPropertyValuesRouteHandler, getCourierPropertyValuesRouteHandler,
getCourierNeighborsRouteHandler
} from '../../services/management/courier.js'; } from '../../services/management/courier.js';
// list of couriers // list of couriers
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listCouriersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listCouriersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country']; const allowedFilters = ['name', 'website', 'email', 'phone', 'contact', 'country'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getCourierHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getCourierRouteHandler(req, res); getCourierRouteHandler(req, res);
}); });

View File

@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'_id',
'courier',
'courier._id',
'name',
'active',
'tracked',
'deliveryTime',
'cost',
'costWithTax',
];
import { import {
listCourierServicesRouteHandler, listCourierServicesRouteHandler,
getCourierServiceRouteHandler, getCourierServiceRouteHandler,
@ -14,23 +26,14 @@ import {
getCourierServiceHistoryRouteHandler, getCourierServiceHistoryRouteHandler,
searchCourierServicesRouteHandler, searchCourierServicesRouteHandler,
getCourierServicePropertyValuesRouteHandler, getCourierServicePropertyValuesRouteHandler,
getCourierServiceNeighborsRouteHandler
} from '../../services/management/courierservice.js'; } from '../../services/management/courierservice.js';
// list of courier services // list of courier services
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'_id',
'courier',
'courier._id',
'name',
'active',
'tracked',
'deliveryTime',
'cost',
'costWithTax',
];
const filter = getFilter(req.query, allowedFilters);
listCourierServicesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listCourierServicesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -47,7 +50,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'cost', 'cost',
'costWithTax', 'costWithTax',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -79,6 +82,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getCourierServiceHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getCourierServiceRouteHandler(req, res); getCourierServiceRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'width', 'height'];
import { import {
listDocumentJobsRouteHandler, listDocumentJobsRouteHandler,
getDocumentJobRouteHandler, getDocumentJobRouteHandler,
@ -14,20 +16,21 @@ import {
getDocumentJobHistoryRouteHandler, getDocumentJobHistoryRouteHandler,
searchDocumentJobsRouteHandler, searchDocumentJobsRouteHandler,
getDocumentJobPropertyValuesRouteHandler, getDocumentJobPropertyValuesRouteHandler,
getDocumentJobNeighborsRouteHandler
} from '../../services/management/documentjobs.js'; } from '../../services/management/documentjobs.js';
// list of document jobs // list of document jobs
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'width', 'height']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listDocumentJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listDocumentJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = []; const allowedFilters = [];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getDocumentJobHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getDocumentJobRouteHandler(req, res); getDocumentJobRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'tags', 'active', 'isGlobal'];
import { import {
listDocumentPrintersRouteHandler, listDocumentPrintersRouteHandler,
getDocumentPrinterRouteHandler, getDocumentPrinterRouteHandler,
@ -14,20 +16,21 @@ import {
getDocumentPrinterHistoryRouteHandler, getDocumentPrinterHistoryRouteHandler,
searchDocumentPrintersRouteHandler, searchDocumentPrintersRouteHandler,
getDocumentPrinterPropertyValuesRouteHandler, getDocumentPrinterPropertyValuesRouteHandler,
getDocumentPrinterNeighborsRouteHandler
} from '../../services/management/documentprinters.js'; } from '../../services/management/documentprinters.js';
// list of document printers // list of document printers
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'tags', 'active', 'isGlobal']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listDocumentPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listDocumentPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['tags']; const allowedFilters = ['tags'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getDocumentPrinterHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getDocumentPrinterRouteHandler(req, res); getDocumentPrinterRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'width', 'height'];
import { import {
listDocumentSizesRouteHandler, listDocumentSizesRouteHandler,
getDocumentSizeRouteHandler, getDocumentSizeRouteHandler,
@ -14,20 +16,21 @@ import {
getDocumentSizeHistoryRouteHandler, getDocumentSizeHistoryRouteHandler,
searchDocumentSizesRouteHandler, searchDocumentSizesRouteHandler,
getDocumentSizePropertyValuesRouteHandler, getDocumentSizePropertyValuesRouteHandler,
getDocumentSizeNeighborsRouteHandler
} from '../../services/management/documentsizes.js'; } from '../../services/management/documentsizes.js';
// list of document sizes // list of document sizes
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'width', 'height']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listDocumentSizesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listDocumentSizesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = []; const allowedFilters = [];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getDocumentSizeHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getDocumentSizeRouteHandler(req, res); getDocumentSizeRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'tags', 'active', 'global', 'objectType'];
import { import {
listDocumentTemplatesRouteHandler, listDocumentTemplatesRouteHandler,
getDocumentTemplateRouteHandler, getDocumentTemplateRouteHandler,
@ -14,20 +16,20 @@ import {
getDocumentTemplateHistoryRouteHandler, getDocumentTemplateHistoryRouteHandler,
getDocumentTemplatePropertyValuesRouteHandler, getDocumentTemplatePropertyValuesRouteHandler,
searchDocumentTemplatesRouteHandler, searchDocumentTemplatesRouteHandler,
getDocumentTemplateNeighborsRouteHandler,
} from '../../services/management/documenttemplates.js'; } from '../../services/management/documenttemplates.js';
// list of document templates // list of document templates
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'tags', 'active', 'global', 'objectType']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listDocumentTemplatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listDocumentTemplatesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['documentSize', 'tags']; const allowedFilters = ['documentSize', 'tags'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +61,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getDocumentTemplateHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getDocumentTemplateRouteHandler(req, res); getDocumentTemplateRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js'; import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'material', 'material._id', 'diameter', 'name', 'cost'];
import { import {
listFilamentsRouteHandler, listFilamentsRouteHandler,
listFilamentsByPropertiesRouteHandler, listFilamentsByPropertiesRouteHandler,
@ -15,19 +17,20 @@ import {
getFilamentHistoryRouteHandler, getFilamentHistoryRouteHandler,
searchFilamentsRouteHandler, searchFilamentsRouteHandler,
getFilamentPropertyValuesRouteHandler, getFilamentPropertyValuesRouteHandler,
getFilamentNeighborsRouteHandler
} from '../../services/management/filaments.js'; } from '../../services/management/filaments.js';
// list of filaments // list of filaments
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'material', 'material._id', 'diameter', 'name', 'cost'];
var filter = {}; var filter = {};
for (const [key, value] of Object.entries(req.query)) { for (const [key, value] of Object.entries(req.query)) {
for (var i = 0; i < allowedFilters.length; i++) { for (var i = 0; i < listAllowedFilters.length; i++) {
if (key == allowedFilters[i]) { if (key == listAllowedFilters[i]) {
filter = { ...filter, ...parseFilter(key, value) }; filter = { ...filter, ...parseFilter(key, value) };
} }
} }
@ -39,7 +42,7 @@ router.get('/', isAuthenticated, (req, res) => {
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['diameter', 'material']; const allowedFilters = ['diameter', 'material'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -71,6 +74,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getFilamentHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getFilamentRouteHandler(req, res); getFilamentRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'barcode', 'filament', 'filament._id', 'name', 'color', 'cost', 'costWithTax'];
import { import {
listFilamentSkusRouteHandler, listFilamentSkusRouteHandler,
getFilamentSkuRouteHandler, getFilamentSkuRouteHandler,
@ -13,20 +15,21 @@ import {
getFilamentSkuStatsRouteHandler, getFilamentSkuStatsRouteHandler,
getFilamentSkuHistoryRouteHandler, getFilamentSkuHistoryRouteHandler,
searchFilamentSkusRouteHandler, searchFilamentSkusRouteHandler,
getFilamentSkuPropertyValuesRouteHandler getFilamentSkuPropertyValuesRouteHandler,
getFilamentSkuNeighborsRouteHandler
} from '../../services/management/filamentskus.js'; } from '../../services/management/filamentskus.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; 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, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listFilamentSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); listFilamentSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['filament', 'filament._id']; const allowedFilters = ['filament', 'filament._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
let masterFilter = {}; let masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getFilamentSkuHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getFilamentSkuRouteHandler(req, res); getFilamentSkuRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'type', 'size', 'extension'];
import { import {
listFilesRouteHandler, listFilesRouteHandler,
getFileRouteHandler, getFileRouteHandler,
@ -17,20 +19,21 @@ import {
getFileHistoryRouteHandler, getFileHistoryRouteHandler,
searchFilesRouteHandler, searchFilesRouteHandler,
getFilePropertyValuesRouteHandler, getFilePropertyValuesRouteHandler,
getFileNeighborsRouteHandler
} from '../../services/management/files.js'; } from '../../services/management/files.js';
// list of files // list of files
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'type', 'size', 'extension']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['type', 'extension']; const allowedFilters = ['type', 'extension'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -66,6 +69,12 @@ router.delete('/:id/flush', isAuthenticated, (req, res) => {
flushFileRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getFileRouteHandler(req, res); getFileRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'tags'];
import { import {
listHostsRouteHandler, listHostsRouteHandler,
getHostRouteHandler, getHostRouteHandler,
@ -14,20 +16,21 @@ import {
getHostHistoryRouteHandler, getHostHistoryRouteHandler,
searchHostsRouteHandler, searchHostsRouteHandler,
getHostPropertyValuesRouteHandler, getHostPropertyValuesRouteHandler,
getHostNeighborsRouteHandler
} from '../../services/management/hosts.js'; } from '../../services/management/hosts.js';
// list of hosts // list of hosts
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'tags']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listHostsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listHostsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['tags']; const allowedFilters = ['tags'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getHostHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getHostRouteHandler(req, res); getHostRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js'; import { convertPropertiesString, getFilter, parseFilter } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'tags'];
import { import {
listMaterialsRouteHandler, listMaterialsRouteHandler,
listMaterialsByPropertiesRouteHandler, listMaterialsByPropertiesRouteHandler,
@ -13,18 +15,19 @@ import {
getMaterialHistoryRouteHandler, getMaterialHistoryRouteHandler,
searchMaterialsRouteHandler, searchMaterialsRouteHandler,
getMaterialPropertyValuesRouteHandler, getMaterialPropertyValuesRouteHandler,
getMaterialNeighborsRouteHandler
} from '../../services/management/materials.js'; } from '../../services/management/materials.js';
// list of materials // list of materials
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'tags'];
var filter = {}; var filter = {};
for (const [key, value] of Object.entries(req.query)) { for (const [key, value] of Object.entries(req.query)) {
if (allowedFilters.includes(key)) { if (listAllowedFilters.includes(key)) {
filter = { ...filter, ...parseFilter(key, value) }; filter = { ...filter, ...parseFilter(key, value) };
} }
} }
@ -35,7 +38,7 @@ router.get('/', isAuthenticated, (req, res) => {
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name', 'tags']; const allowedFilters = ['name', 'tags'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -67,6 +70,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getMaterialHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getMaterialRouteHandler(req, res); getMaterialRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'active', 'color'];
import { import {
listNoteTypesRouteHandler, listNoteTypesRouteHandler,
getNoteTypeRouteHandler, getNoteTypeRouteHandler,
@ -13,21 +15,22 @@ import {
getNoteTypeStatsRouteHandler, getNoteTypeStatsRouteHandler,
getNoteTypeHistoryRouteHandler, getNoteTypeHistoryRouteHandler,
searchNoteTypesRouteHandler, searchNoteTypesRouteHandler,
getNoteTypePropertyValuesRouteHandler getNoteTypePropertyValuesRouteHandler,
getNoteTypeNeighborsRouteHandler
} from '../../services/management/notetypes.js'; } from '../../services/management/notetypes.js';
// list of note types // list of note types
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'active', 'color']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listNoteTypesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listNoteTypesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['active', 'color']; const allowedFilters = ['active', 'color'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getNoteTypeHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getNoteTypeRouteHandler(req, res); getNoteTypeRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['product._id', '_id', 'name'];
import { import {
listPartsRouteHandler, listPartsRouteHandler,
getPartRouteHandler, getPartRouteHandler,
@ -14,20 +16,21 @@ import {
getPartHistoryRouteHandler, getPartHistoryRouteHandler,
searchPartsRouteHandler, searchPartsRouteHandler,
getPartPropertyValuesRouteHandler, getPartPropertyValuesRouteHandler,
getPartNeighborsRouteHandler
} from '../../services/management/parts.js'; } from '../../services/management/parts.js';
// list of parts // list of parts
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['product._id', '_id', 'name']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listPartsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPartsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['product._id']; const allowedFilters = ['product._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPartHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPartRouteHandler(req, res); getPartRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'barcode', 'part', 'part._id', 'name', 'cost', 'price'];
import { import {
listPartSkusRouteHandler, listPartSkusRouteHandler,
getPartSkuRouteHandler, getPartSkuRouteHandler,
@ -13,20 +15,21 @@ import {
getPartSkuStatsRouteHandler, getPartSkuStatsRouteHandler,
getPartSkuHistoryRouteHandler, getPartSkuHistoryRouteHandler,
searchPartSkusRouteHandler, searchPartSkusRouteHandler,
getPartSkuPropertyValuesRouteHandler getPartSkuPropertyValuesRouteHandler,
getPartSkuNeighborsRouteHandler
} from '../../services/management/partskus.js'; } from '../../services/management/partskus.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'barcode', 'part', 'part._id', 'name', 'cost', 'price']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listPartSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPartSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['part', 'part._id']; const allowedFilters = ['part', 'part._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
let masterFilter = {}; let masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPartSkuHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPartSkuRouteHandler(req, res); getPartSkuRouteHandler(req, res);
}); });

View File

@ -12,21 +12,24 @@ import {
newProductCategoryRouteHandler, newProductCategoryRouteHandler,
searchProductCategoriesRouteHandler, searchProductCategoriesRouteHandler,
getProductCategoryPropertyValuesRouteHandler, getProductCategoryPropertyValuesRouteHandler,
getProductCategoryNeighborsRouteHandler
} from '../../services/management/productcategories.js'; } from '../../services/management/productcategories.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name'];
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listProductCategoriesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listProductCategoriesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
const properties = convertPropertiesString(req.query.properties); const properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name']; const allowedFilters = ['name'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getProductCategoryHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getProductCategoryRouteHandler(req, res); getProductCategoryRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'globalPrice', 'productCategory', 'productCategory._id'];
import { import {
listProductsRouteHandler, listProductsRouteHandler,
getProductRouteHandler, getProductRouteHandler,
@ -14,20 +16,21 @@ import {
getProductHistoryRouteHandler, getProductHistoryRouteHandler,
searchProductsRouteHandler, searchProductsRouteHandler,
getProductPropertyValuesRouteHandler, getProductPropertyValuesRouteHandler,
getProductNeighborsRouteHandler
} from '../../services/management/products.js'; } from '../../services/management/products.js';
// list of products // list of products
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'globalPrice', 'productCategory', 'productCategory._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listProductsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listProductsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = []; const allowedFilters = [];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getProductHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getProductRouteHandler(req, res); getProductRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'barcode', 'product', 'product._id', 'name', 'cost', 'price'];
import { import {
listProductSkusRouteHandler, listProductSkusRouteHandler,
getProductSkuRouteHandler, getProductSkuRouteHandler,
@ -13,20 +15,21 @@ import {
getProductSkuStatsRouteHandler, getProductSkuStatsRouteHandler,
getProductSkuHistoryRouteHandler, getProductSkuHistoryRouteHandler,
searchProductSkusRouteHandler, searchProductSkusRouteHandler,
getProductSkuPropertyValuesRouteHandler getProductSkuPropertyValuesRouteHandler,
getProductSkuNeighborsRouteHandler
} from '../../services/management/productskus.js'; } from '../../services/management/productskus.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'barcode', 'product', 'product._id', 'name', 'cost', 'price']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listProductSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order); listProductSkusRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['product', 'product._id']; const allowedFilters = ['product', 'product._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
let masterFilter = {}; let masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -56,6 +59,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getProductSkuHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getProductSkuRouteHandler(req, res); getProductSkuRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'rate', 'rateType', 'active', 'country'];
import { import {
listTaxRatesRouteHandler, listTaxRatesRouteHandler,
getTaxRateRouteHandler, getTaxRateRouteHandler,
@ -14,20 +16,21 @@ import {
getTaxRateHistoryRouteHandler, getTaxRateHistoryRouteHandler,
searchTaxRatesRouteHandler, searchTaxRatesRouteHandler,
getTaxRatePropertyValuesRouteHandler, getTaxRatePropertyValuesRouteHandler,
getTaxRateNeighborsRouteHandler
} from '../../services/management/taxrates.js'; } from '../../services/management/taxrates.js';
// list of tax rates // list of tax rates
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'rate', 'rateType', 'active', 'country']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listTaxRatesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listTaxRatesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['rateType', 'country', 'active']; const allowedFilters = ['rateType', 'country', 'active'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getTaxRateHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getTaxRateRouteHandler(req, res); getTaxRateRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { convertPropertiesString, getFilter } from '../../utils.js'; import { convertPropertiesString, getFilter } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'username', 'firstName', 'lastName', 'email'];
import { import {
listUsersRouteHandler, listUsersRouteHandler,
listUsersByPropertiesRouteHandler, listUsersByPropertiesRouteHandler,
@ -12,21 +14,22 @@ import {
getUserHistoryRouteHandler, getUserHistoryRouteHandler,
setAppPasswordRouteHandler, setAppPasswordRouteHandler,
searchUsersRouteHandler, searchUsersRouteHandler,
getUserPropertyValuesRouteHandler getUserPropertyValuesRouteHandler,
getUserNeighborsRouteHandler
} from '../../services/management/users.js'; } from '../../services/management/users.js';
// list of document templates // list of document templates
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'username', 'firstName', 'lastName', 'email']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listUsersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listUsersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = []; const allowedFilters = [];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -54,6 +57,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getUserHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getUserRouteHandler(req, res); getUserRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['country', 'active', 'createdAt', 'updatedAt'];
import { import {
listVendorsRouteHandler, listVendorsRouteHandler,
getVendorRouteHandler, getVendorRouteHandler,
@ -14,20 +16,21 @@ import {
getVendorHistoryRouteHandler, getVendorHistoryRouteHandler,
searchVendorsRouteHandler, searchVendorsRouteHandler,
getVendorPropertyValuesRouteHandler, getVendorPropertyValuesRouteHandler,
getVendorNeighborsRouteHandler
} from '../../services/management/vendors.js'; } from '../../services/management/vendors.js';
// list of vendors // list of vendors
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listVendorsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listVendorsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getVendorHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getVendorRouteHandler(req, res); getVendorRouteHandler(req, res);
}); });

View File

@ -10,23 +10,26 @@ import {
getNoteStatsRouteHandler, getNoteStatsRouteHandler,
getNoteHistoryRouteHandler, getNoteHistoryRouteHandler,
getNotePropertyValuesRouteHandler, getNotePropertyValuesRouteHandler,
getNoteNeighborsRouteHandler
} from '../../services/misc/notes.js'; } from '../../services/misc/notes.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['parent._id'];
// list of notes // list of notes
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['parent._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listNotesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listNotesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['parent']; const allowedFilters = ['parent'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -54,6 +57,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getNoteHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getNoteRouteHandler(req, res); getNoteRouteHandler(req, res);
}); });

View File

@ -10,6 +10,8 @@ import {
newFilamentProfileRouteHandler, newFilamentProfileRouteHandler,
searchFilamentProfilesRouteHandler, searchFilamentProfilesRouteHandler,
getFilamentProfilePropertyValuesRouteHandler, getFilamentProfilePropertyValuesRouteHandler,
getFilamentProfileNeighborsRouteHandler
} from '../../services/production/filamentprofiles.js'; } from '../../services/production/filamentprofiles.js';
const router = express.Router(); const router = express.Router();
@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => {
newFilamentProfileRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getFilamentProfileRouteHandler(req, res); getFilamentProfileRouteHandler(req, res);
}); });

View File

@ -2,6 +2,8 @@ import express from 'express';
import { isAuthenticated } from '../../keycloak.js'; import { isAuthenticated } from '../../keycloak.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'name', 'filament', 'filament._id', 'filamentSku', 'filamentSku._id'];
import { import {
listGCodeFilesRouteHandler, listGCodeFilesRouteHandler,
editGCodeFileRouteHandler, editGCodeFileRouteHandler,
@ -11,22 +13,23 @@ import {
getGCodeFileContentRouteHandler, getGCodeFileContentRouteHandler,
getGCodeFileStatsRouteHandler, getGCodeFileStatsRouteHandler,
searchGCodeFilesRouteHandler, searchGCodeFilesRouteHandler,
getGCodeFilePropertyValuesRouteHandler getGCodeFilePropertyValuesRouteHandler,
getGCodeFileNeighborsRouteHandler
} from '../../services/production/gcodefiles.js'; } from '../../services/production/gcodefiles.js';
import { convertPropertiesString, getFilter } from '../../utils.js'; import { convertPropertiesString, getFilter } from '../../utils.js';
// list of gcodeFiles // list of gcodeFiles
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'name', 'filament', 'filament._id', 'filamentSku', 'filamentSku._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listGCodeFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listGCodeFilesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['filament', 'filament._id', 'filamentSku', 'filamentSku._id']; const allowedFilters = ['filament', 'filament._id', 'filamentSku', 'filamentSku._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -54,6 +57,12 @@ router.get('/stats', isAuthenticated, (req, res) => {
getGCodeFileStatsRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getGCodeFileRouteHandler(req, res); getGCodeFileRouteHandler(req, res);
}); });

View File

@ -2,6 +2,8 @@ import express from 'express';
import { isAuthenticated } from '../../keycloak.js'; import { isAuthenticated } from '../../keycloak.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['state', 'gcodeFile._id', 'quantity'];
import { import {
listJobsRouteHandler, listJobsRouteHandler,
listJobsByPropertiesRouteHandler, listJobsByPropertiesRouteHandler,
@ -12,22 +14,23 @@ import {
getJobStatsRouteHandler, getJobStatsRouteHandler,
getJobHistoryRouteHandler, getJobHistoryRouteHandler,
searchJobsRouteHandler, searchJobsRouteHandler,
getJobPropertyValuesRouteHandler getJobPropertyValuesRouteHandler,
getJobNeighborsRouteHandler
} from '../../services/production/jobs.js'; } from '../../services/production/jobs.js';
import { convertPropertiesString, getFilter } from '../../utils.js'; import { convertPropertiesString, getFilter } from '../../utils.js';
// list of jobs // list of jobs
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['state', 'gcodeFile._id', 'quantity']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['state']; const allowedFilters = ['state'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getJobHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getJobRouteHandler(req, res); getJobRouteHandler(req, res);
}); });

View File

@ -10,6 +10,8 @@ import {
newPrinterProfileRouteHandler, newPrinterProfileRouteHandler,
searchPrinterProfilesRouteHandler, searchPrinterProfilesRouteHandler,
getPrinterProfilePropertyValuesRouteHandler, getPrinterProfilePropertyValuesRouteHandler,
getPrinterProfileNeighborsRouteHandler
} from '../../services/production/printerprofiles.js'; } from '../../services/production/printerprofiles.js';
const router = express.Router(); const router = express.Router();
@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => {
newPrinterProfileRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getPrinterProfileRouteHandler(req, res); getPrinterProfileRouteHandler(req, res);
}); });

View File

@ -12,21 +12,22 @@ import {
getPrinterHistoryRouteHandler, getPrinterHistoryRouteHandler,
searchPrintersRouteHandler, searchPrintersRouteHandler,
getPrinterPropertyValuesRouteHandler, getPrinterPropertyValuesRouteHandler,
getPrinterNeighborsRouteHandler,
} from '../../services/production/printers.js'; } from '../../services/production/printers.js';
import { convertPropertiesString, getFilter } from '../../utils.js'; import { convertPropertiesString, getFilter } from '../../utils.js';
const listAllowedFilters = ['tags', 'host._id', 'active', 'online', 'name', '_id', '_reference'];
const propertiesAllowedFilters = ['tags'];
// list of printers // list of printers
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['tags', 'host._id', 'active', 'online', 'name', '_id', '_reference']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listPrintersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['tags']; const filter = getFilter(req.query, propertiesAllowedFilters, false);
const filter = getFilter(req.query, allowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -53,6 +54,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getPrinterHistoryRouteHandler(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 // get printer stats
router.get('/stats', isAuthenticated, (req, res) => { router.get('/stats', isAuthenticated, (req, res) => {
getPrinterStatsRouteHandler(req, res); getPrinterStatsRouteHandler(req, res);

View File

@ -2,6 +2,8 @@ import express from 'express';
import { isAuthenticated } from '../../keycloak.js'; import { isAuthenticated } from '../../keycloak.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['_id', 'job._id', 'printer._id'];
import { import {
listSubJobsRouteHandler, listSubJobsRouteHandler,
listSubJobsByPropertiesRouteHandler, listSubJobsByPropertiesRouteHandler,
@ -9,22 +11,23 @@ import {
getSubJobStatsRouteHandler, getSubJobStatsRouteHandler,
getSubJobHistoryRouteHandler, getSubJobHistoryRouteHandler,
searchSubJobsRouteHandler, searchSubJobsRouteHandler,
getSubJobPropertyValuesRouteHandler getSubJobPropertyValuesRouteHandler,
getSubJobNeighborsRouteHandler
} from '../../services/production/subjobs.js'; } from '../../services/production/subjobs.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
// list of sub jobs // list of sub jobs
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['_id', 'job._id', 'printer._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listSubJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listSubJobsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['job']; const allowedFilters = ['job'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -52,6 +55,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getSubJobHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getSubJobRouteHandler(req, res); getSubJobRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['country', 'active', 'createdAt', 'updatedAt'];
import { import {
listClientsRouteHandler, listClientsRouteHandler,
getClientRouteHandler, getClientRouteHandler,
@ -13,21 +15,22 @@ import {
getClientStatsRouteHandler, getClientStatsRouteHandler,
getClientHistoryRouteHandler, getClientHistoryRouteHandler,
searchClientsRouteHandler, searchClientsRouteHandler,
getClientPropertyValuesRouteHandler getClientPropertyValuesRouteHandler,
getClientNeighborsRouteHandler
} from '../../services/sales/clients.js'; } from '../../services/sales/clients.js';
// list of clients // list of clients
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listClientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listClientsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt']; const allowedFilters = ['country', 'active', 'createdAt', 'updatedAt'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -59,6 +62,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getClientHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getClientRouteHandler(req, res); getClientRouteHandler(req, res);
}); });

View File

@ -3,6 +3,18 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'product',
'vendor',
'stockLocation',
'marketplace',
'courierServices',
'state',
'state.type',
'createdAt',
'updatedAt',
];
import { import {
listListingsRouteHandler, listListingsRouteHandler,
getListingRouteHandler, getListingRouteHandler,
@ -16,22 +28,13 @@ import {
unpublishListingRouteHandler, unpublishListingRouteHandler,
searchListingsRouteHandler, searchListingsRouteHandler,
getListingPropertyValuesRouteHandler, getListingPropertyValuesRouteHandler,
getListingNeighborsRouteHandler
} from '../../services/sales/listings.js'; } from '../../services/sales/listings.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'product',
'vendor',
'stockLocation',
'marketplace',
'courierServices',
'state',
'state.type',
'createdAt',
'updatedAt',
];
const filter = getFilter(req.query, allowedFilters);
listListingsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listListingsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -48,7 +51,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'createdAt', 'createdAt',
'updatedAt', 'updatedAt',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -85,6 +88,12 @@ router.post('/:id/unpublish', isAuthenticated, (req, res) => {
unpublishListingRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getListingRouteHandler(req, res); getListingRouteHandler(req, res);
}); });

View File

@ -3,6 +3,17 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = [
'listing',
'listing._id',
'product',
'productSku',
'state',
'state.type',
'createdAt',
'updatedAt',
];
import { import {
listListingVarientsRouteHandler, listListingVarientsRouteHandler,
getListingVarientRouteHandler, getListingVarientRouteHandler,
@ -15,22 +26,14 @@ import {
publishListingVarientRouteHandler, publishListingVarientRouteHandler,
unpublishListingVarientRouteHandler, unpublishListingVarientRouteHandler,
searchListingVarientsRouteHandler, searchListingVarientsRouteHandler,
getListingVarientPropertyValuesRouteHandler getListingVarientPropertyValuesRouteHandler,
getListingVarientNeighborsRouteHandler
} from '../../services/sales/listingvarients.js'; } from '../../services/sales/listingvarients.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = [ const filter = getFilter(req.query, listAllowedFilters);
'listing',
'listing._id',
'product',
'productSku',
'state',
'state.type',
'createdAt',
'updatedAt',
];
const filter = getFilter(req.query, allowedFilters);
listListingVarientsRouteHandler(req, res, page, limit, property, filter, search, sort, order); listListingVarientsRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
@ -46,7 +49,7 @@ router.get('/properties', isAuthenticated, (req, res) => {
'createdAt', 'createdAt',
'updatedAt', 'updatedAt',
]; ];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -84,6 +87,12 @@ router.post('/:id/unpublish', isAuthenticated, (req, res) => {
unpublishListingVarientRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getListingVarientRouteHandler(req, res); getListingVarientRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt'];
import { import {
listMarketplacesRouteHandler, listMarketplacesRouteHandler,
getMarketplaceRouteHandler, getMarketplaceRouteHandler,
@ -19,20 +21,21 @@ import {
syncMarketplaceOrdersRouteHandler, syncMarketplaceOrdersRouteHandler,
marketplaceWebhookRouteHandler, marketplaceWebhookRouteHandler,
searchMarketplacesRouteHandler, searchMarketplacesRouteHandler,
getMarketplacePropertyValuesRouteHandler getMarketplacePropertyValuesRouteHandler,
getMarketplaceNeighborsRouteHandler
} from '../../services/sales/marketplaces.js'; } from '../../services/sales/marketplaces.js';
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listMarketplacesRouteHandler(req, res, page, limit, property, filter, search, sort, order); listMarketplacesRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['name', 'provider', 'active', 'connected', 'state.type', 'createdAt', 'updatedAt']; 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 = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter); masterFilter = JSON.parse(req.query.masterFilter);
@ -87,6 +90,12 @@ router.post('/:id/hook', (req, res) => {
marketplaceWebhookRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getMarketplaceRouteHandler(req, res); getMarketplaceRouteHandler(req, res);
}); });

View File

@ -3,6 +3,8 @@ import { isAuthenticated } from '../../keycloak.js';
import { getFilter, convertPropertiesString } from '../../utils.js'; import { getFilter, convertPropertiesString } from '../../utils.js';
const router = express.Router(); const router = express.Router();
const listAllowedFilters = ['client', 'state', 'value', 'client._id'];
import { import {
listSalesOrdersRouteHandler, listSalesOrdersRouteHandler,
getSalesOrderRouteHandler, getSalesOrderRouteHandler,
@ -17,21 +19,22 @@ import {
confirmSalesOrderRouteHandler, confirmSalesOrderRouteHandler,
cancelSalesOrderRouteHandler, cancelSalesOrderRouteHandler,
searchSalesOrdersRouteHandler, searchSalesOrdersRouteHandler,
getSalesOrderPropertyValuesRouteHandler getSalesOrderPropertyValuesRouteHandler,
getSalesOrderNeighborsRouteHandler
} from '../../services/sales/salesorders.js'; } from '../../services/sales/salesorders.js';
// list of sales orders // list of sales orders
router.get('/', isAuthenticated, (req, res) => { router.get('/', isAuthenticated, (req, res) => {
const { page, limit, property, search, sort, order } = req.query; const { page, limit, property, search, sort, order } = req.query;
const allowedFilters = ['client', 'state', 'value', 'client._id']; const filter = getFilter(req.query, listAllowedFilters);
const filter = getFilter(req.query, allowedFilters);
listSalesOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order); listSalesOrdersRouteHandler(req, res, page, limit, property, filter, search, sort, order);
}); });
router.get('/properties', isAuthenticated, (req, res) => { router.get('/properties', isAuthenticated, (req, res) => {
let properties = convertPropertiesString(req.query.properties); let properties = convertPropertiesString(req.query.properties);
const allowedFilters = ['client', 'state.type', 'value', 'client._id']; const allowedFilters = ['client', 'state.type', 'value', 'client._id'];
const filter = getFilter(req.query, allowedFilters, false); const filter = getFilter(req.query, listAllowedFilters, false);
var masterFilter = {}; var masterFilter = {};
if (req.query.masterFilter) { if (req.query.masterFilter) {
masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true); masterFilter = getFilter(JSON.parse(req.query.masterFilter), allowedFilters, true);
@ -63,6 +66,12 @@ router.get('/history', isAuthenticated, (req, res) => {
getSalesOrderHistoryRouteHandler(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) => { router.get('/:id', isAuthenticated, (req, res) => {
getSalesOrderRouteHandler(req, res); getSalesOrderRouteHandler(req, res);
}); });

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.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}`); logger.debug(`Cancelled invoice with ID: ${id}`);
res.send(result); 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);
};

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { invoiceModel } from '../../database/schemas/finance/invoice.schema.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}`); logger.debug(`Cancelled payment with ID: ${id}`);
res.send(result); 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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('TaxRecords'); const logger = log4js.getLogger('TaxRecords');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -204,3 +205,35 @@ export const getTaxRecordHistoryRouteHandler = async (req, res) => {
logger.trace('Tax record history:', result); logger.trace('Tax record history:', result);
res.send(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);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js'; import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js';
const logger = log4js.getLogger('Filament Stocks'); const logger = log4js.getLogger('Filament Stocks');
@ -263,3 +264,35 @@ export const getFilamentStockHistoryRouteHandler = async (req, res) => {
logger.trace('Filament stock history:', result); logger.trace('Filament stock history:', result);
res.send(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);
};

View File

@ -15,6 +15,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Order Items'); const logger = log4js.getLogger('Order Items');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -414,3 +415,35 @@ export const getOrderItemHistoryRouteHandler = async (req, res) => {
logger.trace('Order item history:', result); logger.trace('Order item history:', result);
res.send(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);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Part Stocks'); const logger = log4js.getLogger('Part Stocks');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -227,3 +228,35 @@ export const getPartStockHistoryRouteHandler = async (req, res) => {
logger.trace('Part stock history:', result); logger.trace('Part stock history:', result);
res.send(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);
};

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { productSkuModel } from '../../database/schemas/management/productsku.schema.js'; import { productSkuModel } from '../../database/schemas/management/productsku.schema.js';
const logger = log4js.getLogger('Product Stocks'); const logger = log4js.getLogger('Product Stocks');
@ -325,3 +326,35 @@ export const postProductStockRouteHandler = async (req, res) => {
logger.debug(`Posted product stock with ID: ${id}`); logger.debug(`Posted product stock with ID: ${id}`);
res.send(result); 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);
};

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.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}`); logger.debug(`Cancelled purchase order with ID: ${id}`);
res.send(result); 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);
};

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Shipments'); const logger = log4js.getLogger('Shipments');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -459,3 +460,35 @@ export const cancelShipmentRouteHandler = async (req, res) => {
logger.debug(`Cancelled shipment with ID: ${id}`); logger.debug(`Cancelled shipment with ID: ${id}`);
res.send(result); 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);
};

View File

@ -5,7 +5,8 @@ import mongoose from 'mongoose';
import { getAuditLogs } from '../../utils.js'; import { getAuditLogs } from '../../utils.js';
import { import {
getModelStats, getModelHistory, getModelStats, getModelHistory,
searchObjects searchObjects,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Stock Audits'); const logger = log4js.getLogger('Stock Audits');
@ -200,3 +201,35 @@ export const getStockAuditHistoryRouteHandler = async (req, res) => {
logger.trace('Stock audit history:', result); logger.trace('Stock audit history:', result);
res.send(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);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Stock Events'); const logger = log4js.getLogger('Stock Events');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -236,3 +237,35 @@ export const getStockEventHistoryRouteHandler = async (req, res) => {
logger.trace('Stock event history:', result); logger.trace('Stock event history:', result);
res.send(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);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Stock Locations'); const logger = log4js.getLogger('Stock Locations');
@ -212,3 +213,35 @@ export const getStockLocationHistoryRouteHandler = async (req, res) => {
logger.trace('Stock location history:', result); logger.trace('Stock location history:', result);
res.send(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);
};

View File

@ -20,6 +20,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Stock Transfers'); const logger = log4js.getLogger('Stock Transfers');
@ -533,3 +534,35 @@ export const getStockTransferHistoryRouteHandler = async (req, res) => {
logger.trace('Stock transfer history:', result); logger.trace('Stock transfer history:', result);
res.send(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);
};

View File

@ -15,6 +15,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('AppPasswords'); 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}`); logger.debug(`Regenerated secret for app password with ID: ${id}`);
res.send({ appPassword: plainSecret }); 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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Couriers'); const logger = log4js.getLogger('Couriers');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -205,3 +206,35 @@ export const getCourierHistoryRouteHandler = async (req, res) => {
logger.trace('Courier history:', result); logger.trace('Courier history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('CourierServices'); const logger = log4js.getLogger('CourierServices');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -223,3 +224,35 @@ export const getCourierServiceHistoryRouteHandler = async (req, res) => {
logger.trace('Courier service history:', result); logger.trace('Courier service history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Document Jobs'); const logger = log4js.getLogger('Document Jobs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -201,3 +202,35 @@ export const getDocumentJobHistoryRouteHandler = async (req, res) => {
logger.trace('Document job history:', result); logger.trace('Document job history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Document Templates'); const logger = log4js.getLogger('Document Templates');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -212,3 +213,35 @@ export const getDocumentPrinterHistoryRouteHandler = async (req, res) => {
logger.trace('Document printer history:', result); logger.trace('Document printer history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Document Sizes'); const logger = log4js.getLogger('Document Sizes');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -200,3 +201,35 @@ export const getDocumentSizeHistoryRouteHandler = async (req, res) => {
logger.trace('Document size history:', result); logger.trace('Document size history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Document Templates'); const logger = log4js.getLogger('Document Templates');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -229,3 +230,35 @@ export const getDocumentTemplateHistoryRouteHandler = async (req, res) => {
logger.trace('Document template history:', result); logger.trace('Document template history:', result);
res.send(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);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Filaments'); const logger = log4js.getLogger('Filaments');
@ -260,3 +261,35 @@ export const getFilamentHistoryRouteHandler = async (req, res) => {
logger.trace('Filament history:', result); logger.trace('Filament history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Filament SKUs'); const logger = log4js.getLogger('Filament SKUs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -213,3 +214,35 @@ export const getFilamentSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Filament SKU history:', result); logger.trace('Filament SKU history:', result);
res.send(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);
};

View File

@ -17,6 +17,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
createFileThumbnails, createFileThumbnails,
getThumbnail, getThumbnail,
} from '../../database/database.js'; } from '../../database/database.js';
@ -579,3 +580,35 @@ export const getFileHistoryRouteHandler = async (req, res) => {
logger.trace('File history:', result); logger.trace('File history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Hosts'); const logger = log4js.getLogger('Hosts');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -201,3 +202,35 @@ export const getHostHistoryRouteHandler = async (req, res) => {
logger.trace('Host history:', result); logger.trace('Host history:', result);
res.send(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);
};

View File

@ -12,6 +12,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Materials'); const logger = log4js.getLogger('Materials');
@ -179,3 +180,35 @@ export const getMaterialHistoryRouteHandler = async (req, res) => {
logger.trace('Material history:', result); logger.trace('Material history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Note Types'); const logger = log4js.getLogger('Note Types');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -198,3 +199,35 @@ export const getNoteTypeHistoryRouteHandler = async (req, res) => {
logger.trace('Note type history:', result); logger.trace('Note type history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Parts'); const logger = log4js.getLogger('Parts');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -217,3 +218,35 @@ export const getPartHistoryRouteHandler = async (req, res) => {
logger.trace('Part history:', result); logger.trace('Part history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Part SKUs'); const logger = log4js.getLogger('Part SKUs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -231,3 +232,35 @@ export const getPartSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Part SKU history:', result); logger.trace('Part SKU history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
newObject, newObject,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('ProductCategories'); const logger = log4js.getLogger('ProductCategories');
@ -195,3 +196,35 @@ export const getProductCategoryHistoryRouteHandler = async (req, res) => {
logger.trace('Product category history:', result); logger.trace('Product category history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Products'); const logger = log4js.getLogger('Products');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -223,3 +224,35 @@ export const getProductHistoryRouteHandler = async (req, res) => {
logger.trace('Product history:', result); logger.trace('Product history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Product SKUs'); const logger = log4js.getLogger('Product SKUs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -236,3 +237,35 @@ export const getProductSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Product SKU history:', result); logger.trace('Product SKU history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('TaxRates'); const logger = log4js.getLogger('TaxRates');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -208,3 +209,35 @@ export const getTaxRateHistoryRouteHandler = async (req, res) => {
logger.trace('Tax rate history:', result); logger.trace('Tax rate history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Users'); const logger = log4js.getLogger('Users');
@ -206,3 +207,35 @@ export const setAppPasswordRouteHandler = async (req, res) => {
res.send({ appPassword }); 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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Vendors'); const logger = log4js.getLogger('Vendors');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -208,3 +209,35 @@ export const getVendorHistoryRouteHandler = async (req, res) => {
logger.trace('Vendor history:', result); logger.trace('Vendor history:', result);
res.send(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);
};

View File

@ -12,6 +12,7 @@ import {
getModelStats, getModelStats,
getModelHistory, getModelHistory,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import mongoose from 'mongoose'; import mongoose from 'mongoose';
import { newNoteNotification } from '../../utils.js'; import { newNoteNotification } from '../../utils.js';
@ -204,3 +205,35 @@ export const getNoteHistoryRouteHandler = async (req, res) => {
logger.trace('Note history:', result); logger.trace('Note history:', result);
res.send(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);
};

View File

@ -11,6 +11,7 @@ import {
newObject, newObject,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('FilamentProfiles'); const logger = log4js.getLogger('FilamentProfiles');
@ -314,3 +315,35 @@ export const deleteFilamentProfileRouteHandler = async (req, res) => {
logger.debug(`Deleted filament profile with ID: ${result._id}`); logger.debug(`Deleted filament profile with ID: ${result._id}`);
res.send(result); 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);
};

View File

@ -10,6 +10,7 @@ import {
newObject, newObject,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { getFileContentRouteHandler } from '../management/files.js'; import { getFileContentRouteHandler } from '../management/files.js';
import mongoose from 'mongoose'; import mongoose from 'mongoose';
@ -226,3 +227,35 @@ export const getGCodeFileStatsRouteHandler = async (req, res) => {
res.status(500).send({ error: error.message }); 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);
};

View File

@ -12,7 +12,8 @@ import {
getModelStats, getModelStats,
getModelHistory, getModelHistory,
searchObjects, searchObjects,
checkStates checkStates,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Jobs'); const logger = log4js.getLogger('Jobs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -216,3 +217,35 @@ export const getJobHistoryRouteHandler = async (req, res) => {
logger.trace('Job history:', result); logger.trace('Job history:', result);
res.send(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);
};

View File

@ -11,6 +11,7 @@ import {
newObject, newObject,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('PrinterProfiles'); const logger = log4js.getLogger('PrinterProfiles');
@ -202,3 +203,35 @@ export const deletePrinterProfileRouteHandler = async (req, res) => {
logger.debug(`Deleted printer profile with ID: ${result._id}`); logger.debug(`Deleted printer profile with ID: ${result._id}`);
res.send(result); 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);
};

View File

@ -12,6 +12,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import mongoose from 'mongoose'; import mongoose from 'mongoose';
@ -217,3 +218,35 @@ export const getPrinterHistoryRouteHandler = async (req, res) => {
logger.trace('Printer history:', result); logger.trace('Printer history:', result);
res.send(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);
};

View File

@ -9,6 +9,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Sub Jobs'); const logger = log4js.getLogger('Sub Jobs');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -122,3 +123,35 @@ export const getSubJobHistoryRouteHandler = async (req, res) => {
logger.trace('Sub job history:', result); logger.trace('Sub job history:', result);
res.send(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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
const logger = log4js.getLogger('Clients'); const logger = log4js.getLogger('Clients');
logger.level = config.server.logLevel; logger.level = config.server.logLevel;
@ -208,4 +209,35 @@ export const getClientHistoryRouteHandler = async (req, res) => {
logger.trace('Client history:', result); logger.trace('Client history:', result);
res.send(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);
};

View File

@ -16,6 +16,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { import {
hasIntegration, hasIntegration,
@ -499,3 +500,35 @@ export const unpublishListingRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 }); 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);
};

View File

@ -14,6 +14,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { listingModel } from '../../database/schemas/sales/listing.schema.js'; import { listingModel } from '../../database/schemas/sales/listing.schema.js';
import { import {
@ -458,3 +459,35 @@ export const unpublishListingVarientRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 }); 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);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory, getModelHistory,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import * as marketplaceIntegration from '../../integrations/marketplaceworker.js'; import * as marketplaceIntegration from '../../integrations/marketplaceworker.js';
const logger = log4js.getLogger('Marketplaces'); const logger = log4js.getLogger('Marketplaces');
@ -383,3 +384,35 @@ export const marketplaceWebhookRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 }); 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);
};

View File

@ -15,6 +15,7 @@ import {
checkStates, checkStates,
searchObjects, searchObjects,
getPropertyValues, getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js'; } from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js'; import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.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}`); logger.debug(`Cancelled sales order with ID: ${id}`);
res.send(result); 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);
};