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 _ from 'lodash';
import log4js from 'log4js';
import crypto from 'crypto';
import sharp from 'sharp';
import { encode as encodeBlurHash } from 'blurhash';
import { uploadFile, deleteFile, downloadFile, BUCKETS } from './ceph.js';
@ -36,6 +37,9 @@ const cacheLogger = log4js.getLogger('DatabaseCache');
cacheLogger.level = config.server.logLevel;
const CACHE_TTL_SECONDS = parseInt(config.database.redis.cacheTtl || '30', 10);
const NEIGHBORS_CACHE_TTL_SECONDS = 60;
const NEIGHBORS_CACHE_WINDOW = 25;
const NEIGHBORS_CACHE_PREFIX = 'neighbors';
const mergeObjectUpdates = (target, source) =>
_.mergeWith(target, source, (objValue, srcValue) => {
@ -133,6 +137,112 @@ export const deleteObjectCache = async ({ model, id }) => {
}
};
const buildNeighborsQueryFilter = (filter = {}, search = '') => {
const queryFilter = { ...filter };
Object.keys(queryFilter).forEach((key) => {
if (key.endsWith('._id')) {
const baseKey = key.slice(0, -4);
queryFilter[baseKey] = queryFilter[key];
delete queryFilter[key];
}
});
if (search) {
const isRefOrIdSearch = search.match(/^.{3}:/);
if (isRefOrIdSearch) {
const lookupValue = search.split(':')[1];
if (lookupValue.length <= 12) {
queryFilter._reference = lookupValue;
} else {
queryFilter._id = lookupValue;
}
} else {
queryFilter.$text = { $search: search };
}
}
return queryFilter;
};
const getNeighborsCacheKey = ({ model, id, filter = {}, search = '', sort = '', order = 'ascend' }) => {
const normalizedSort = sort || 'createdAt';
const normalizedOrder = order || 'ascend';
const queryHash = crypto
.createHash('sha256')
.update(
JSON.stringify({
filter,
search,
sort: normalizedSort,
order: normalizedOrder,
})
)
.digest('hex');
return `${NEIGHBORS_CACHE_PREFIX}:${model.modelName}:${id?.toString()}:${queryHash}`;
};
const neighborsCacheToResponse = (cached) =>
expandObjectIds({
next: cached.next[0] ? { _id: cached.next[0] } : null,
previous: cached.previous[0] ? { _id: cached.previous[0] } : null,
});
const buildNeighborsCacheValue = (ids, index) => {
const previous = ids
.slice(Math.max(0, index - NEIGHBORS_CACHE_WINDOW), index)
.map((neighborId) => String(neighborId))
.reverse();
const next = ids
.slice(index + 1, index + 1 + NEIGHBORS_CACHE_WINDOW)
.map((neighborId) => String(neighborId));
return { previous, next };
};
export const invalidateNeighborsCacheForObject = async ({ model, id }) => {
if (!model || !id) return;
const objectId = id?.toString();
const cacheKeyPrefix = `${NEIGHBORS_CACHE_PREFIX}:${model.modelName}:`;
const cacheKeyForObject = `${cacheKeyPrefix}${objectId}:`;
cacheLogger.trace('Invalidating neighbors cache for object:', {
model: model.modelName,
id: objectId,
});
try {
const matchingKeys = await redisServer.getKeysByPattern(`${cacheKeyPrefix}*`);
for (const cacheKey of matchingKeys) {
if (cacheKey.startsWith(cacheKeyForObject)) {
await redisServer.deleteKey(cacheKey);
continue;
}
const cached = await redisServer.getKey(cacheKey);
if (!cached) continue;
const containsId =
(Array.isArray(cached.previous) && cached.previous.includes(objectId)) ||
(Array.isArray(cached.next) && cached.next.includes(objectId));
if (containsId) {
await redisServer.deleteKey(cacheKey);
}
}
cacheLogger.trace('Invalidated neighbors cache for object:', {
model: model.modelName,
id: objectId,
});
} catch (err) {
cacheLogger.error('Error invalidating neighbors cache:', err);
}
};
// Utility to run one or many rollup aggregations in a single query via $facet.
export const aggregateRollups = async ({ model, baseFilter = {}, rollupConfigs = [] }) => {
if (!rollupConfigs.length) {
@ -427,6 +537,63 @@ export const listObjects = async ({
}
};
export const getObjectNeighbors = async ({
model,
id,
filter = {},
search = '',
sort = '',
order = 'ascend',
}) => {
try {
const sortOrder = order === 'descend' ? -1 : 1;
const sortField = sort || 'createdAt';
const cacheKey = getNeighborsCacheKey({ model, id, filter, search, sort: sortField, order });
cacheLogger.trace('Retrieving neighbors from cache:', {
model: model.modelName,
id: id?.toString(),
});
const cached = await redisServer.getKey(cacheKey);
if (cached) {
cacheLogger.trace('Neighbors cache hit:', {
model: model.modelName,
id: id?.toString(),
});
return neighborsCacheToResponse(cached);
}
cacheLogger.trace('Neighbors cache miss:', {
model: model.modelName,
id: id?.toString(),
});
const queryFilter = buildNeighborsQueryFilter(filter, search);
const results = await model
.find(queryFilter)
.sort({ [sortField]: sortOrder })
.select('_id')
.lean();
const ids = results.map((doc) => doc._id);
const index = ids.findIndex((docId) => String(docId) === String(id));
if (index === -1) {
return { next: null, previous: null };
}
const cacheValue = buildNeighborsCacheValue(ids, index);
await redisServer.setKey(cacheKey, cacheValue, NEIGHBORS_CACHE_TTL_SECONDS);
return neighborsCacheToResponse(cacheValue);
} catch (error) {
logger.error('Object neighbors error:', error);
return { error: error, code: 500 };
}
};
export const searchObjects = async ({ model, search, populate = [] }) => {
try {
const isRefOrIdSearch = search.match(/^.{3}:/);
@ -873,6 +1040,7 @@ export const editObject = async ({ model, id, updateData, user, populate, recalc
object: updatedObject,
populate,
});
await invalidateNeighborsCacheForObject({ model, id });
if (model.recalculate && recalculate == true) {
logger.debug(`Recalculating ${model.modelName}`);
@ -1208,6 +1376,7 @@ export const deleteObject = async (
// Invalidate cache for this object
await deleteObjectCache({ model, id });
await invalidateNeighborsCacheForObject({ model, id });
if (model.recalculate) {
logger.debug(`Recalculating ${model.modelName}`);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,6 +10,8 @@ import {
newFilamentProfileRouteHandler,
searchFilamentProfilesRouteHandler,
getFilamentProfilePropertyValuesRouteHandler,
getFilamentProfileNeighborsRouteHandler
} from '../../services/production/filamentprofiles.js';
const router = express.Router();
@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => {
newFilamentProfileRouteHandler(req, res);
});
router.get('/neighbors', isAuthenticated, (req, res) => {
const { property, search, sort, order, id } = req.query;
const filter = getFilter(req.query, ['_id', 'name']);
getFilamentProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id);
});
router.get('/:id', isAuthenticated, (req, res) => {
getFilamentProfileRouteHandler(req, res);
});

View File

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

View File

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

View File

@ -10,6 +10,8 @@ import {
newPrinterProfileRouteHandler,
searchPrinterProfilesRouteHandler,
getPrinterProfilePropertyValuesRouteHandler,
getPrinterProfileNeighborsRouteHandler
} from '../../services/production/printerprofiles.js';
const router = express.Router();
@ -43,6 +45,12 @@ router.post('/', isAuthenticated, (req, res) => {
newPrinterProfileRouteHandler(req, res);
});
router.get('/neighbors', isAuthenticated, (req, res) => {
const { property, search, sort, order, id } = req.query;
const filter = getFilter(req.query, ['_id', 'name']);
getPrinterProfileNeighborsRouteHandler(req, res, property, filter, search, sort, order, id);
});
router.get('/:id', isAuthenticated, (req, res) => {
getPrinterProfileRouteHandler(req, res);
});

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js';
@ -574,3 +575,35 @@ export const cancelInvoiceRouteHandler = async (req, res) => {
logger.debug(`Cancelled invoice with ID: ${id}`);
res.send(result);
};
export const getInvoiceNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: invoiceModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching invoice neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved invoice neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { invoiceModel } from '../../database/schemas/finance/invoice.schema.js';
@ -469,3 +470,35 @@ export const cancelPaymentRouteHandler = async (req, res) => {
logger.debug(`Cancelled payment with ID: ${id}`);
res.send(result);
};
export const getPaymentNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: paymentModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching payment neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved payment neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('TaxRecords');
logger.level = config.server.logLevel;
@ -204,3 +205,35 @@ export const getTaxRecordHistoryRouteHandler = async (req, res) => {
logger.trace('Tax record history:', result);
res.send(result);
};
export const getTaxRecordNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: taxRecordModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching taxRecord neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved taxRecord neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { stockEventModel } from '../../database/schemas/inventory/stockevent.schema.js';
const logger = log4js.getLogger('Filament Stocks');
@ -263,3 +264,35 @@ export const getFilamentStockHistoryRouteHandler = async (req, res) => {
logger.trace('Filament stock history:', result);
res.send(result);
};
export const getFilamentStockNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: filamentStockModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching filamentStock neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved filamentStock neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Order Items');
logger.level = config.server.logLevel;
@ -414,3 +415,35 @@ export const getOrderItemHistoryRouteHandler = async (req, res) => {
logger.trace('Order item history:', result);
res.send(result);
};
export const getOrderItemNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: orderItemModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching orderItem neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved orderItem neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Part Stocks');
logger.level = config.server.logLevel;
@ -227,3 +228,35 @@ export const getPartStockHistoryRouteHandler = async (req, res) => {
logger.trace('Part stock history:', result);
res.send(result);
};
export const getPartStockNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: partStockModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching partStock neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved partStock neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { productSkuModel } from '../../database/schemas/management/productsku.schema.js';
const logger = log4js.getLogger('Product Stocks');
@ -325,3 +326,35 @@ export const postProductStockRouteHandler = async (req, res) => {
logger.debug(`Posted product stock with ID: ${id}`);
res.send(result);
};
export const getProductStockNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: productStockModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching productStock neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved productStock neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js';
@ -476,3 +477,35 @@ export const cancelPurchaseOrderRouteHandler = async (req, res) => {
logger.debug(`Cancelled purchase order with ID: ${id}`);
res.send(result);
};
export const getPurchaseOrderNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: purchaseOrderModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching purchaseOrder neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved purchaseOrder neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Shipments');
logger.level = config.server.logLevel;
@ -459,3 +460,35 @@ export const cancelShipmentRouteHandler = async (req, res) => {
logger.debug(`Cancelled shipment with ID: ${id}`);
res.send(result);
};
export const getShipmentNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: shipmentModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching shipment neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved shipment neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -5,7 +5,8 @@ import mongoose from 'mongoose';
import { getAuditLogs } from '../../utils.js';
import {
getModelStats, getModelHistory,
searchObjects
searchObjects,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Stock Audits');
@ -200,3 +201,35 @@ export const getStockAuditHistoryRouteHandler = async (req, res) => {
logger.trace('Stock audit history:', result);
res.send(result);
};
export const getStockAuditNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: stockAuditModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching stock audit neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved stock audit neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Stock Events');
logger.level = config.server.logLevel;
@ -236,3 +237,35 @@ export const getStockEventHistoryRouteHandler = async (req, res) => {
logger.trace('Stock event history:', result);
res.send(result);
};
export const getStockEventNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: stockEventModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching stockEvent neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved stockEvent neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Stock Locations');
@ -212,3 +213,35 @@ export const getStockLocationHistoryRouteHandler = async (req, res) => {
logger.trace('Stock location history:', result);
res.send(result);
};
export const getStockLocationNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: stockLocationModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching stockLocation neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved stockLocation neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -20,6 +20,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Stock Transfers');
@ -533,3 +534,35 @@ export const getStockTransferHistoryRouteHandler = async (req, res) => {
logger.trace('Stock transfer history:', result);
res.send(result);
};
export const getStockTransferNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: stockEventModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching stockTransfer neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved stockTransfer neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('AppPasswords');
@ -246,3 +247,35 @@ export const regenerateSecretRouteHandler = async (req, res) => {
logger.debug(`Regenerated secret for app password with ID: ${id}`);
res.send({ appPassword: plainSecret });
};
export const getAppPasswordNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: appPasswordModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching appPassword neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved appPassword neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Couriers');
logger.level = config.server.logLevel;
@ -205,3 +206,35 @@ export const getCourierHistoryRouteHandler = async (req, res) => {
logger.trace('Courier history:', result);
res.send(result);
};
export const getCourierNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: courierModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching courier neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved courier neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('CourierServices');
logger.level = config.server.logLevel;
@ -223,3 +224,35 @@ export const getCourierServiceHistoryRouteHandler = async (req, res) => {
logger.trace('Courier service history:', result);
res.send(result);
};
export const getCourierServiceNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: courierServiceModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching courierService neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved courierService neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Document Jobs');
logger.level = config.server.logLevel;
@ -201,3 +202,35 @@ export const getDocumentJobHistoryRouteHandler = async (req, res) => {
logger.trace('Document job history:', result);
res.send(result);
};
export const getDocumentJobNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: documentJobModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching documentJob neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved documentJob neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Document Templates');
logger.level = config.server.logLevel;
@ -212,3 +213,35 @@ export const getDocumentPrinterHistoryRouteHandler = async (req, res) => {
logger.trace('Document printer history:', result);
res.send(result);
};
export const getDocumentPrinterNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: documentPrinterModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching documentPrinter neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved documentPrinter neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Document Sizes');
logger.level = config.server.logLevel;
@ -200,3 +201,35 @@ export const getDocumentSizeHistoryRouteHandler = async (req, res) => {
logger.trace('Document size history:', result);
res.send(result);
};
export const getDocumentSizeNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: documentSizeModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching documentSize neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved documentSize neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Document Templates');
logger.level = config.server.logLevel;
@ -229,3 +230,35 @@ export const getDocumentTemplateHistoryRouteHandler = async (req, res) => {
logger.trace('Document template history:', result);
res.send(result);
};
export const getDocumentTemplateNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: documentTemplateModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching documentTemplate neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved documentTemplate neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Filaments');
@ -260,3 +261,35 @@ export const getFilamentHistoryRouteHandler = async (req, res) => {
logger.trace('Filament history:', result);
res.send(result);
};
export const getFilamentNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: filamentModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching filament neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved filament neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Filament SKUs');
logger.level = config.server.logLevel;
@ -213,3 +214,35 @@ export const getFilamentSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Filament SKU history:', result);
res.send(result);
};
export const getFilamentSkuNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: filamentSkuModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching filamentSku neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved filamentSku neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -17,6 +17,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
createFileThumbnails,
getThumbnail,
} from '../../database/database.js';
@ -579,3 +580,35 @@ export const getFileHistoryRouteHandler = async (req, res) => {
logger.trace('File history:', result);
res.send(result);
};
export const getFileNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: fileModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching file neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved file neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Hosts');
logger.level = config.server.logLevel;
@ -201,3 +202,35 @@ export const getHostHistoryRouteHandler = async (req, res) => {
logger.trace('Host history:', result);
res.send(result);
};
export const getHostNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: hostModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching host neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved host neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -12,6 +12,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Materials');
@ -179,3 +180,35 @@ export const getMaterialHistoryRouteHandler = async (req, res) => {
logger.trace('Material history:', result);
res.send(result);
};
export const getMaterialNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: materialModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching material neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved material neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Note Types');
logger.level = config.server.logLevel;
@ -198,3 +199,35 @@ export const getNoteTypeHistoryRouteHandler = async (req, res) => {
logger.trace('Note type history:', result);
res.send(result);
};
export const getNoteTypeNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: noteTypeModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching noteType neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved noteType neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Parts');
logger.level = config.server.logLevel;
@ -217,3 +218,35 @@ export const getPartHistoryRouteHandler = async (req, res) => {
logger.trace('Part history:', result);
res.send(result);
};
export const getPartNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: partModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching part neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved part neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Part SKUs');
logger.level = config.server.logLevel;
@ -231,3 +232,35 @@ export const getPartSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Part SKU history:', result);
res.send(result);
};
export const getPartSkuNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: partSkuModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching partSku neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved partSku neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
newObject,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('ProductCategories');
@ -195,3 +196,35 @@ export const getProductCategoryHistoryRouteHandler = async (req, res) => {
logger.trace('Product category history:', result);
res.send(result);
};
export const getProductCategoryNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: productCategoryModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching productCategory neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved productCategory neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Products');
logger.level = config.server.logLevel;
@ -223,3 +224,35 @@ export const getProductHistoryRouteHandler = async (req, res) => {
logger.trace('Product history:', result);
res.send(result);
};
export const getProductNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: productModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching product neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved product neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Product SKUs');
logger.level = config.server.logLevel;
@ -236,3 +237,35 @@ export const getProductSkuHistoryRouteHandler = async (req, res) => {
logger.trace('Product SKU history:', result);
res.send(result);
};
export const getProductSkuNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: productSkuModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching productSku neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved productSku neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('TaxRates');
logger.level = config.server.logLevel;
@ -208,3 +209,35 @@ export const getTaxRateHistoryRouteHandler = async (req, res) => {
logger.trace('Tax rate history:', result);
res.send(result);
};
export const getTaxRateNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: taxRateModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching taxRate neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved taxRate neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Users');
@ -206,3 +207,35 @@ export const setAppPasswordRouteHandler = async (req, res) => {
res.send({ appPassword });
};
export const getUserNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: userModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching user neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved user neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Vendors');
logger.level = config.server.logLevel;
@ -208,3 +209,35 @@ export const getVendorHistoryRouteHandler = async (req, res) => {
logger.trace('Vendor history:', result);
res.send(result);
};
export const getVendorNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: vendorModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching vendor neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved vendor neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -12,6 +12,7 @@ import {
getModelStats,
getModelHistory,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import mongoose from 'mongoose';
import { newNoteNotification } from '../../utils.js';
@ -204,3 +205,35 @@ export const getNoteHistoryRouteHandler = async (req, res) => {
logger.trace('Note history:', result);
res.send(result);
};
export const getNoteNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: noteModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching note neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved note neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -11,6 +11,7 @@ import {
newObject,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('FilamentProfiles');
@ -314,3 +315,35 @@ export const deleteFilamentProfileRouteHandler = async (req, res) => {
logger.debug(`Deleted filament profile with ID: ${result._id}`);
res.send(result);
};
export const getFilamentProfileNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: filamentProfileModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching filamentProfile neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved filamentProfile neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -10,6 +10,7 @@ import {
newObject,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { getFileContentRouteHandler } from '../management/files.js';
import mongoose from 'mongoose';
@ -226,3 +227,35 @@ export const getGCodeFileStatsRouteHandler = async (req, res) => {
res.status(500).send({ error: error.message });
}
};
export const getGCodeFileNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: gcodeFileModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching gCodeFile neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved gCodeFile neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -12,7 +12,8 @@ import {
getModelStats,
getModelHistory,
searchObjects,
checkStates
checkStates,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Jobs');
logger.level = config.server.logLevel;
@ -216,3 +217,35 @@ export const getJobHistoryRouteHandler = async (req, res) => {
logger.trace('Job history:', result);
res.send(result);
};
export const getJobNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: jobModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching job neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved job neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -11,6 +11,7 @@ import {
newObject,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('PrinterProfiles');
@ -202,3 +203,35 @@ export const deletePrinterProfileRouteHandler = async (req, res) => {
logger.debug(`Deleted printer profile with ID: ${result._id}`);
res.send(result);
};
export const getPrinterProfileNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: printerProfileModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching printerProfile neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved printerProfile neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -12,6 +12,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import mongoose from 'mongoose';
@ -217,3 +218,35 @@ export const getPrinterHistoryRouteHandler = async (req, res) => {
logger.trace('Printer history:', result);
res.send(result);
};
export const getPrinterNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: printerModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching printer neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved printer neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -9,6 +9,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Sub Jobs');
logger.level = config.server.logLevel;
@ -122,3 +123,35 @@ export const getSubJobHistoryRouteHandler = async (req, res) => {
logger.trace('Sub job history:', result);
res.send(result);
};
export const getSubJobNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: subJobModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching subJob neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved subJob neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Clients');
logger.level = config.server.logLevel;
@ -208,4 +209,35 @@ export const getClientHistoryRouteHandler = async (req, res) => {
logger.trace('Client history:', result);
res.send(result);
};
export const getClientNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: clientModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching client neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved client neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -16,6 +16,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import {
hasIntegration,
@ -499,3 +500,35 @@ export const unpublishListingRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 });
}
};
export const getListingNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: listingModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching listing neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved listing neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -14,6 +14,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { listingModel } from '../../database/schemas/sales/listing.schema.js';
import {
@ -458,3 +459,35 @@ export const unpublishListingVarientRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 });
}
};
export const getListingVarientNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: listingVarientModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching listingVarient neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved listingVarient neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -13,6 +13,7 @@ import {
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import * as marketplaceIntegration from '../../integrations/marketplaceworker.js';
const logger = log4js.getLogger('Marketplaces');
@ -383,3 +384,35 @@ export const marketplaceWebhookRouteHandler = async (req, res) => {
res.status(500).send({ error: err.message, code: 500 });
}
};
export const getMarketplaceNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: marketplaceModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching marketplace neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved marketplace neighbors for ID: ${id}`);
res.send(result);
};

View File

@ -15,6 +15,7 @@ import {
checkStates,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
import { orderItemModel } from '../../database/schemas/inventory/orderitem.schema.js';
import { shipmentModel } from '../../database/schemas/inventory/shipment.schema.js';
@ -479,4 +480,35 @@ export const cancelSalesOrderRouteHandler = async (req, res) => {
logger.debug(`Cancelled sales order with ID: ${id}`);
res.send(result);
};
export const getSalesOrderNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: salesOrderModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching salesOrder neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved salesOrder neighbors for ID: ${id}`);
res.send(result);
};