Compare commits

...

3 Commits

Author SHA1 Message Date
5f59c23fbe Remove debug logging statements from utility functions and schema files to clean up code and improve performance. This includes the removal of console logs in parseFilter, filterDistributeKeys, normalizeFilterQuery, and the stockevent schema, streamlining the codebase for better maintainability.
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good
2026-08-30 12:26:08 +01:00
6a730294b1 Refactor filter handling in various routes to include master filter support
This commit updates multiple routes across the management and inventory modules to enhance the handling of property value requests. The `/values` endpoints are modified to incorporate a filtering mechanism that allows for both a standard filter and an optional master filter, improving the flexibility and accuracy of data retrieval. Additionally, debug logging statements are added to assist in tracking the filter parameters during requests. This refactor aims to streamline the data fetching process and improve the overall user experience when interacting with the API.
2026-08-30 12:25:10 +01:00
933d76969f Refactor eBay order and shipping services integration; introduce trading request utilities
This commit refactors the eBay order integration by introducing a new module for trading requests, encapsulating common functionalities such as XML parsing and request handling. The `orders.js` file is significantly expanded to include new parsing functions for shipping addresses, tracking details, and trading transactions, enhancing the overall order processing capabilities. Additionally, the `shippingServices.js` file is streamlined by removing deprecated constants and functions, replacing them with calls to the new trading request utilities. Comprehensive tests are added to ensure the correctness of the new functionalities and their integration with existing systems, improving the reliability of eBay marketplace operations.
2026-08-30 11:11:59 +01:00
105 changed files with 1980 additions and 552 deletions

View File

@ -1,6 +1,11 @@
import mongoose from 'mongoose';
import { generateId } from '../../utils.js';
import { getObject, editObject, aggregateRollups, aggregateRollupsHistory } from '../../database.js';
import {
getObject,
editObject,
aggregateRollups,
aggregateRollupsHistory,
} from '../../database.js';
const { Schema } = mongoose;
const parentStockModelNames = {
@ -43,8 +48,6 @@ const buildParentState = (parentType, parentStock, currentAmount, startingAmount
const progress = currentAmount / startingAmount;
console.log('progress', progress);
if (currentAmount === startingAmount) {
return { ...parentStock.state, type: fullState, progress: 1 };
}

View File

@ -0,0 +1,81 @@
import { afterEach, describe, expect, it, jest } from '@jest/globals';
import { getOrder, syncOrders } from '../orders.js';
const successXml = `<?xml version="1.0" encoding="utf-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Ack>Success</Ack>
<HasMoreOrders>false</HasMoreOrders>
<OrderArray>
<Order>
<OrderID>12-34567-89012</OrderID>
<OrderStatus>Completed</OrderStatus>
<Subtotal currencyID="GBP">10.00</Subtotal>
<Total currencyID="GBP">12.50</Total>
<BuyerUserID>ebay-buyer</BuyerUserID>
</Order>
</OrderArray>
</GetOrdersResponse>`;
const marketplace = {
name: 'eBay UK',
config: { accessToken: 'token', marketplaceId: 'EBAY_GB' },
};
function mockTradingResponse(xml = successXml) {
return jest.spyOn(global, 'fetch').mockResolvedValue({
ok: true,
status: 200,
text: async () => xml,
});
}
describe('eBay Trading API order fetch', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('syncs orders with GetOrders and a default lookback', async () => {
const fetchSpy = mockTradingResponse();
const orders = await syncOrders(marketplace);
expect(fetchSpy).toHaveBeenCalledWith(
'https://api.ebay.com/ws/api.dll',
expect.objectContaining({
method: 'POST',
headers: expect.objectContaining({
'X-EBAY-API-CALL-NAME': 'GetOrders',
'X-EBAY-API-IAF-TOKEN': 'token',
'X-EBAY-API-SITEID': '3',
}),
})
);
const body = fetchSpy.mock.calls[0][1].body;
expect(body).toContain('<GetOrdersRequest');
expect(body).toContain('<NumberOfDays>30</NumberOfDays>');
expect(body).toContain('<OrderRole>Seller</OrderRole>');
expect(orders).toHaveLength(1);
expect(orders[0].orderId).toBe('12-34567-89012');
});
it('uses CreateTimeFrom/To when a sync window is provided', async () => {
const fetchSpy = mockTradingResponse();
await syncOrders(marketplace, { startTime: 1756512000, endTime: 1756598400 });
const body = fetchSpy.mock.calls[0][1].body;
expect(body).toContain('<CreateTimeFrom>2025-08-30T00:00:00.000Z</CreateTimeFrom>');
expect(body).toContain('<CreateTimeTo>2025-08-31T00:00:00.000Z</CreateTimeTo>');
expect(body).not.toContain('<NumberOfDays>');
});
it('loads a single order by OrderID', async () => {
const fetchSpy = mockTradingResponse();
const order = await getOrder(marketplace, '12-34567-89012');
const body = fetchSpy.mock.calls[0][1].body;
expect(body).toContain('<OrderID>12-34567-89012</OrderID>');
expect(order.orderId).toBe('12-34567-89012');
});
});

View File

@ -6,56 +6,106 @@ import {
mapOrderLineItems,
mapOrderShipments,
handleWebhook,
parseGetOrdersResponse,
} from '../orders.js';
const ebayOrder = {
orderId: '12-34567-89012',
orderFulfillmentStatus: 'NOT_STARTED',
pricingSummary: {
priceSubtotal: { value: '10.00' },
deliveryCost: { value: '2.50' },
tax: { value: '1.20' },
total: { value: '13.70' },
},
buyer: {
username: 'ebay-buyer',
buyerRegistrationAddress: { email: 'buyer@example.com' },
},
fulfillmentStartInstructions: [
{
shippingStep: {
shipTo: {
fullName: 'Jane Buyer',
primaryPhone: { phoneNumber: '012345' },
contactAddress: {
addressLine1: '1 High St',
city: 'London',
postalCode: 'SW1A 1AA',
countryCode: 'GB',
},
},
},
},
],
lineItems: [
{
lineItemId: 'line-1',
const sampleGetOrdersXml = `
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Ack>Success</Ack>
<HasMoreOrders>false</HasMoreOrders>
<OrderArray>
<Order>
<OrderID>12-34567-89012</OrderID>
<ExtendedOrderID>12-34567-89012</ExtendedOrderID>
<OrderStatus>Completed</OrderStatus>
<AmountPaid currencyID="GBP">13.70</AmountPaid>
<CheckoutStatus>
<Status>Complete</Status>
</CheckoutStatus>
<ShippingDetails>
<SalesTax>
<SalesTaxAmount currencyID="GBP">1.20</SalesTaxAmount>
</SalesTax>
<ShipmentTrackingDetails>
<ShippingCarrierUsed>Royal Mail</ShippingCarrierUsed>
<ShipmentTrackingNumber>TRACK123</ShipmentTrackingNumber>
</ShipmentTrackingDetails>
</ShippingDetails>
<CreatedTime>2026-08-01T09:00:00.000Z</CreatedTime>
<ShippingAddress>
<Name>Jane Buyer</Name>
<Street1>1 High St</Street1>
<CityName>London</CityName>
<PostalCode>SW1A 1AA</PostalCode>
<Country>GB</Country>
<Phone>012345</Phone>
</ShippingAddress>
<ShippingServiceSelected>
<ShippingService>UK_RoyalMailFirstClassStandard</ShippingService>
<ShippingServiceCost currencyID="GBP">2.50</ShippingServiceCost>
</ShippingServiceSelected>
<Subtotal currencyID="GBP">10.00</Subtotal>
<Total currencyID="GBP">13.70</Total>
<TransactionArray>
<Transaction>
<Buyer>
<Email>buyer@example.com</Email>
<UserFirstName>Jane</UserFirstName>
<UserLastName>Buyer</UserLastName>
</Buyer>
<Item>
<ItemID>111</ItemID>
<Title>Red widget</Title>
<SKU>SKU-RED</SKU>
</Item>
<QuantityPurchased>2</QuantityPurchased>
<TransactionID>line-1</TransactionID>
<TransactionPrice currencyID="GBP">5.00</TransactionPrice>
<Taxes>
<TotalTaxAmount currencyID="GBP">1.00</TotalTaxAmount>
</Taxes>
<OrderLineItemID>line-1</OrderLineItemID>
</Transaction>
</TransactionArray>
<BuyerUserID>ebay-buyer</BuyerUserID>
<PaidTime>2026-08-01T09:05:00.000Z</PaidTime>
<ShippedTime>2026-08-01T10:00:00.000Z</ShippedTime>
<CancelStatus>NotApplicable</CancelStatus>
</Order>
</OrderArray>
</GetOrdersResponse>
`;
const ebayOrder = parseGetOrdersResponse(sampleGetOrdersXml).orders[0];
describe('eBay Trading API GetOrders parsing', () => {
it('parses order totals, buyer, lines, and tracking', () => {
expect(ebayOrder).toMatchObject({
orderId: '12-34567-89012',
orderStatus: 'Completed',
buyerUserId: 'ebay-buyer',
buyerEmail: 'buyer@example.com',
subtotal: 10,
shippingAmount: 2.5,
salesTaxAmount: 1.2,
total: 13.7,
});
expect(ebayOrder.shippingAddress.city).toBe('London');
expect(ebayOrder.transactions[0]).toMatchObject({
sku: 'SKU-RED',
title: 'Red widget',
quantity: 2,
lineItemCost: { value: '5.00' },
taxes: [{ amount: { value: '1.00' } }],
},
],
shippingFulfillments: [
{
fulfillmentId: 'ful-1',
shipmentTrackingNumber: 'TRACK123',
shippedDate: '2026-08-01T10:00:00.000Z',
lineItems: [{ lineItemId: 'line-1' }],
},
],
};
transactionPrice: 5,
});
expect(ebayOrder.shipments[0].trackingNumber).toBe('TRACK123');
});
it('treats HasMoreOrders as false when missing', () => {
expect(parseGetOrdersResponse('<Ack>Success</Ack>')).toEqual({
orders: [],
hasMoreOrders: false,
});
});
});
describe('eBay order mappers', () => {
it('maps sales order totals and externalReference', () => {
@ -64,13 +114,18 @@ describe('eBay order mappers', () => {
expect(mapped.totalAmount).toBe(10);
expect(mapped.shippingAmount).toBe(2.5);
expect(mapped.totalTaxAmount).toBe(1.2);
expect(mapped.state.type).toBe('draft');
expect(mapped.state.type).toBe('shipped');
});
it('maps cancelled orders', () => {
expect(
mapOrderStatus({ cancelStatus: { cancelState: 'CANCELED' } })
).toBe('cancelled');
expect(mapOrderStatus({ cancelStatus: 'CancelClosedWithRefund' })).toBe('cancelled');
expect(mapOrderStatus({ orderStatus: 'Cancelled' })).toBe('cancelled');
});
it('maps paid but unshipped orders as confirmed', () => {
expect(mapOrderStatus({ orderStatus: 'Completed', checkoutStatus: 'Complete' })).toBe(
'confirmed'
);
});
it('maps buyer to client with marketplace buyer id', () => {
@ -93,10 +148,10 @@ describe('eBay order mappers', () => {
});
});
it('maps shipments from fulfillments', () => {
it('maps shipments from tracking details', () => {
const shipments = mapOrderShipments(ebayOrder);
expect(shipments[0]).toMatchObject({
externalReference: 'ful-1',
externalReference: 'TRACK123',
trackingNumber: 'TRACK123',
});
expect(shipments[0].state.type).toBe('shipped');
@ -105,7 +160,10 @@ describe('eBay order mappers', () => {
it('classifies commerce notification topics', async () => {
const sold = await handleWebhook(
{ name: 'eBay' },
{ metadata: { topic: 'ORDER_CONFIRMATION' }, notification: { data: { orderId: 'o1' }, notificationId: 'n1' } }
{
metadata: { topic: 'ORDER_CONFIRMATION' },
notification: { data: { orderId: 'o1' }, notificationId: 'n1' },
}
);
expect(sold).toMatchObject({ action: 'orderUpdate', orderId: 'o1', notificationId: 'n1' });

View File

@ -1,49 +1,217 @@
import { makeRequest, logger } from './shared.js';
import { makeTradingRequest, xmlBlocks, xmlEscape, xmlNumber, xmlText } from './trading.js';
const ENTRIES_PER_PAGE = 100;
const DEFAULT_LOOKBACK_DAYS = 30;
const MAX_RANGE_MS = 90 * 24 * 60 * 60 * 1000;
const INVALID_EMAILS = new Set(['', 'invalid request']);
const CANCELLED_STATUSES = new Set([
'Cancelled',
'CancelClosedNoRefund',
'CancelClosedWithRefund',
'CancelClosedUnknownRefund',
'CancelClosedForCommitment',
]);
function headerXml(orderXml) {
return String(orderXml || '').replace(/<TransactionArray>[\s\S]*?<\/TransactionArray>/i, '');
}
function parseShippingAddress(xml) {
const block = xmlBlocks(xml, 'ShippingAddress')[0] || '';
return {
name: xmlText(block, 'Name'),
street1: xmlText(block, 'Street1'),
street2: xmlText(block, 'Street2'),
city: xmlText(block, 'CityName'),
state: xmlText(block, 'StateOrProvince'),
postalCode: xmlText(block, 'PostalCode'),
country: xmlText(block, 'Country'),
phone: xmlText(block, 'Phone'),
};
}
function parseTrackingDetails(xml) {
return xmlBlocks(xml, 'ShipmentTrackingDetails')
.map((block) => ({
trackingNumber: xmlText(block, 'ShipmentTrackingNumber'),
carrier: xmlText(block, 'ShippingCarrierUsed'),
}))
.filter((detail) => detail.trackingNumber);
}
function parseTradingTransaction(xml) {
const item = xmlBlocks(xml, 'Item')[0] || '';
const buyer = xmlBlocks(xml, 'Buyer')[0] || '';
const taxes = xmlBlocks(xml, 'Taxes')[0] || '';
return {
transactionId: xmlText(xml, 'TransactionID'),
orderLineItemId: xmlText(xml, 'OrderLineItemID'),
sku: xmlText(item, 'SKU'),
title: xmlText(item, 'Title'),
quantity: xmlNumber(xml, 'QuantityPurchased') || 1,
transactionPrice: xmlNumber(xml, 'TransactionPrice'),
totalTaxAmount: xmlNumber(taxes, 'TotalTaxAmount'),
email: xmlText(buyer, 'Email'),
firstName: xmlText(buyer, 'UserFirstName'),
lastName: xmlText(buyer, 'UserLastName'),
tracking: parseTrackingDetails(xml),
};
}
function firstValidEmail(transactions) {
for (const transaction of transactions) {
const email = (transaction.email || '').trim();
if (email && !INVALID_EMAILS.has(email.toLowerCase())) {
return email;
}
}
return '';
}
function dedupeTracking(details) {
const seen = new Set();
const unique = [];
for (const detail of details) {
if (seen.has(detail.trackingNumber)) continue;
seen.add(detail.trackingNumber);
unique.push(detail);
}
return unique;
}
export function parseTradingOrder(orderXml) {
const header = headerXml(orderXml);
const shippingSelected = xmlBlocks(header, 'ShippingServiceSelected')[0] || '';
const salesTaxBlock = xmlBlocks(header, 'SalesTax')[0] || '';
const checkout = xmlBlocks(header, 'CheckoutStatus')[0] || '';
const transactions = xmlBlocks(orderXml, 'Transaction').map(parseTradingTransaction);
const taxFromTransactions = transactions.reduce((sum, line) => sum + line.totalTaxAmount, 0);
return {
orderId: xmlText(header, 'OrderID') || xmlText(header, 'ExtendedOrderID'),
extendedOrderId: xmlText(header, 'ExtendedOrderID'),
orderStatus: xmlText(header, 'OrderStatus'),
cancelStatus: xmlText(header, 'CancelStatus'),
checkoutStatus: xmlText(checkout, 'Status'),
paidTime: xmlText(header, 'PaidTime'),
shippedTime: xmlText(header, 'ShippedTime'),
createdTime: xmlText(header, 'CreatedTime'),
buyerUserId: xmlText(header, 'BuyerUserID'),
buyerEmail: firstValidEmail(transactions),
shippingAddress: parseShippingAddress(header),
subtotal: xmlNumber(header, 'Subtotal'),
total: xmlNumber(header, 'Total'),
amountPaid: xmlNumber(header, 'AmountPaid'),
shippingAmount: xmlNumber(shippingSelected, 'ShippingServiceCost'),
salesTaxAmount: xmlNumber(salesTaxBlock, 'SalesTaxAmount') || taxFromTransactions,
transactions,
shipments: dedupeTracking([
...parseTrackingDetails(header),
...transactions.flatMap((line) => line.tracking),
]),
};
}
export function parseGetOrdersResponse(xml = '') {
return {
orders: xmlBlocks(xml, 'Order').map(parseTradingOrder),
hasMoreOrders: xmlText(xml, 'HasMoreOrders').toLowerCase() === 'true',
};
}
function buildGetOrdersRequest({
startIso,
endIso,
numberOfDays,
pageNumber = 1,
orderIds = [],
} = {}) {
const filters = [];
if (orderIds.length) {
filters.push(
` <OrderIDArray>\n${orderIds
.map((id) => ` <OrderID>${xmlEscape(id)}</OrderID>`)
.join('\n')}\n </OrderIDArray>`
);
} else if (numberOfDays) {
filters.push(` <NumberOfDays>${numberOfDays}</NumberOfDays>`);
} else {
if (startIso) filters.push(` <CreateTimeFrom>${startIso}</CreateTimeFrom>`);
if (endIso) filters.push(` <CreateTimeTo>${endIso}</CreateTimeTo>`);
}
return `<?xml version="1.0" encoding="utf-8"?>
<GetOrdersRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<ErrorLanguage>en_GB</ErrorLanguage>
<WarningLevel>High</WarningLevel>
<DetailLevel>ReturnAll</DetailLevel>
<OrderRole>Seller</OrderRole>
<OrderStatus>All</OrderStatus>
${filters.join('\n')}
<Pagination>
<EntriesPerPage>${ENTRIES_PER_PAGE}</EntriesPerPage>
<PageNumber>${pageNumber}</PageNumber>
</Pagination>
</GetOrdersRequest>`;
}
function createTimeWindows(startTime, endTime) {
if (!startTime && !endTime) {
return [{ numberOfDays: DEFAULT_LOOKBACK_DAYS }];
}
const nowSec = Math.floor(Date.now() / 1000);
const startSec = startTime || endTime - DEFAULT_LOOKBACK_DAYS * 86400;
const endSec = endTime || nowSec;
const windows = [];
let cursor = Math.min(startSec, endSec) * 1000;
const endMs = Math.max(startSec, endSec) * 1000;
while (cursor < endMs) {
const windowEnd = Math.min(cursor + MAX_RANGE_MS, endMs);
windows.push({
startIso: new Date(cursor).toISOString(),
endIso: new Date(windowEnd).toISOString(),
});
cursor = windowEnd;
}
return windows.length ? windows : [{ numberOfDays: DEFAULT_LOOKBACK_DAYS }];
}
async function fetchOrdersPage(marketplace, requestOptions) {
const xml = await makeTradingRequest({
marketplace,
callName: 'GetOrders',
body: buildGetOrdersRequest(requestOptions),
});
return parseGetOrdersResponse(xml);
}
async function fetchOrdersInWindow(marketplace, windowOptions) {
const orders = [];
let pageNumber = 1;
let hasMore = true;
while (hasMore) {
const page = await fetchOrdersPage(marketplace, { ...windowOptions, pageNumber });
if (page.orders.length) {
orders.push(...page.orders);
}
hasMore = page.hasMoreOrders && page.orders.length > 0;
pageNumber += 1;
}
return orders;
}
async function fetchAllOrders(marketplace, { startTime, endTime } = {}) {
const orders = [];
let offset = 0;
const limit = 50;
const filterParts = [];
if (startTime) {
const isoStart = new Date(startTime * 1000).toISOString();
filterParts.push(`creationdate:[${isoStart}..`);
for (const window of createTimeWindows(startTime, endTime)) {
orders.push(...(await fetchOrdersInWindow(marketplace, window)));
}
if (endTime) {
const isoEnd = new Date(endTime * 1000).toISOString();
if (filterParts.length && filterParts[0].startsWith('creationdate:')) {
filterParts[0] = filterParts[0] + `${isoEnd}]`;
} else {
filterParts.push(`creationdate:[..${isoEnd}]`);
}
} else if (filterParts.length) {
filterParts[0] = filterParts[0] + ']';
}
do {
const params = { limit, offset };
if (filterParts.length) {
params.filter = filterParts.join(',');
}
const data = await makeRequest({
marketplace,
path: '/sell/fulfillment/v1/order',
params,
});
if (data?.orders?.length) {
orders.push(...data.orders);
}
if (!data?.orders?.length || orders.length >= (data.total || 0)) {
break;
}
offset += limit;
} while (true);
return orders;
}
@ -56,38 +224,32 @@ export async function syncOrders(marketplace, { startTime, endTime } = {}) {
return orders;
}
const ORDER_STATUS_MAP = {
NOT_STARTED: 'draft',
IN_PROGRESS: 'confirmed',
FULFILLED: 'shipped',
CANCELLED: 'cancelled',
};
const FULFILLMENT_STATUS_MAP = {
NOT_STARTED: 'confirmed',
IN_PROGRESS: 'shipped',
FULFILLED: 'delivered',
};
export function mapOrderStatus(ebayOrder) {
if (ebayOrder.cancelStatus?.cancelState === 'CANCELED') {
const cancelStatus = ebayOrder.cancelStatus || '';
if (CANCELLED_STATUSES.has(ebayOrder.orderStatus) || CANCELLED_STATUSES.has(cancelStatus)) {
return 'cancelled';
}
const fulfillmentStatus = ebayOrder.fulfillmentStartInstructions?.[0]?.fulfillmentStatus;
if (fulfillmentStatus && FULFILLMENT_STATUS_MAP[fulfillmentStatus]) {
return FULFILLMENT_STATUS_MAP[fulfillmentStatus];
if (ebayOrder.shippedTime) {
return 'shipped';
}
return ORDER_STATUS_MAP[ebayOrder.orderFulfillmentStatus] || 'draft';
if (
ebayOrder.orderStatus === 'Completed' ||
ebayOrder.checkoutStatus === 'Complete' ||
ebayOrder.paidTime
) {
return 'confirmed';
}
return 'draft';
}
export function mapOrderToSalesOrder(ebayOrder) {
const pricingSummary = ebayOrder.pricingSummary || {};
const totalAmount = parseFloat(pricingSummary.priceSubtotal?.value || 0);
const shippingAmount = parseFloat(pricingSummary.deliveryCost?.value || 0);
const totalTax = parseFloat(pricingSummary.tax?.value || 0);
const grandTotal = parseFloat(pricingSummary.total?.value || 0);
const totalAmount = ebayOrder.subtotal || 0;
const shippingAmount = ebayOrder.shippingAmount || 0;
const totalTax = ebayOrder.salesTaxAmount || 0;
const grandTotal = ebayOrder.total || 0;
return {
externalReference: ebayOrder.orderId,
@ -103,54 +265,47 @@ export function mapOrderToSalesOrder(ebayOrder) {
}
export function mapBuyerToClient(ebayOrder) {
const buyer = ebayOrder.buyer || {};
const address = ebayOrder.fulfillmentStartInstructions?.[0]?.shippingStep?.shipTo || {};
const fullName = address.fullName || buyer.username || 'Unknown';
const contactAddress = address.contactAddress || {};
const address = ebayOrder.shippingAddress || {};
const buyer = ebayOrder.transactions?.[0] || {};
const buyerName = [buyer.firstName, buyer.lastName].filter(Boolean).join(' ');
const fullName = address.name || buyerName || ebayOrder.buyerUserId || 'Unknown';
return {
name: fullName,
email: buyer.buyerRegistrationAddress?.email || '',
phone: address.primaryPhone?.phoneNumber || '',
externalReference: buyer.username || '',
email: ebayOrder.buyerEmail || '',
phone: address.phone || '',
externalReference: ebayOrder.buyerUserId || '',
address: {
addressLine1: contactAddress.addressLine1 || '',
addressLine2: contactAddress.addressLine2 || '',
city: contactAddress.city || '',
state: contactAddress.stateOrProvince || '',
postcode: contactAddress.postalCode || '',
country: contactAddress.countryCode || '',
addressLine1: address.street1 || '',
addressLine2: address.street2 || '',
city: address.city || '',
state: address.state || '',
postcode: address.postalCode || '',
country: address.country || '',
},
};
}
export async function getOrder(marketplace, orderId) {
const order = await makeRequest({
const xml = await makeTradingRequest({
marketplace,
path: `/sell/fulfillment/v1/order/${encodeURIComponent(orderId)}`,
callName: 'GetOrders',
body: buildGetOrdersRequest({ orderIds: [orderId] }),
});
const fulfillments = await makeRequest({
marketplace,
path: `/sell/fulfillment/v1/order/${encodeURIComponent(orderId)}/shipping_fulfillment`,
acceptableStatuses: [404],
});
return {
...order,
shippingFulfillments: fulfillments?.fulfillments || [],
};
const { orders } = parseGetOrdersResponse(xml);
if (!orders.length) {
throw new Error(`eBay order ${orderId} was not found`);
}
return orders[0];
}
export function mapOrderLineItems(ebayOrder) {
return (ebayOrder.lineItems || []).map((line) => {
const unit = parseFloat(line.lineItemCost?.value || 0);
const tax = (line.taxes || []).reduce(
(sum, taxLine) => sum + parseFloat(taxLine.amount?.value || 0),
0
);
return (ebayOrder.transactions || []).map((line) => {
const unit = line.transactionPrice || 0;
const tax = line.totalTaxAmount || 0;
const quantity = line.quantity || 1;
return {
externalReference: line.lineItemId,
externalReference: line.orderLineItemId || line.transactionId,
sku: line.sku || '',
name: line.title || line.sku || 'Marketplace item',
quantity,
@ -163,24 +318,26 @@ export function mapOrderLineItems(ebayOrder) {
}
export function mapOrderShipments(ebayOrder) {
const shippingAmount = parseFloat(ebayOrder.pricingSummary?.deliveryCost?.value || 0);
const fulfillments = ebayOrder.shippingFulfillments || [];
if (!fulfillments.length) {
const shipments = ebayOrder.shipments || [];
if (!shipments.length) {
return [];
}
const splitAmount = shippingAmount / fulfillments.length;
return fulfillments.map((fulfillment) => ({
externalReference: fulfillment.fulfillmentId,
trackingNumber: fulfillment.shipmentTrackingNumber || '',
const shippingAmount = ebayOrder.shippingAmount || 0;
const splitAmount = shippingAmount / shipments.length;
return shipments.map((shipment) => ({
externalReference: shipment.trackingNumber,
trackingNumber: shipment.trackingNumber || '',
amount: splitAmount,
amountWithTax: splitAmount,
state: { type: fulfillment.shippedDate ? 'shipped' : 'planned' },
shippedAt: fulfillment.shippedDate ? new Date(fulfillment.shippedDate) : undefined,
lineItemIds: (fulfillment.lineItems || []).map((line) => line.lineItemId).filter(Boolean),
state: { type: ebayOrder.shippedTime ? 'shipped' : 'planned' },
shippedAt: ebayOrder.shippedTime ? new Date(ebayOrder.shippedTime) : undefined,
}));
}
export async function createShippingFulfillment(marketplace, { orderId, lineItems, trackingNumber, shippingCarrierCode }) {
export async function createShippingFulfillment(
marketplace,
{ orderId, lineItems, trackingNumber, shippingCarrierCode }
) {
if (!orderId) {
throw new Error('orderId is required to create an eBay shipping fulfillment');
}
@ -204,14 +361,9 @@ export async function createShippingFulfillment(marketplace, { orderId, lineItem
}
export async function handleWebhook(marketplace, event) {
const topic =
event?.metadata?.topic ||
event?.topic ||
event?.notification?.topic ||
'';
const topic = event?.metadata?.topic || event?.topic || event?.notification?.topic || '';
const data = event?.notification?.data || event?.data || {};
const notificationId =
event?.notification?.notificationId || event?.notificationId || '';
const notificationId = event?.notification?.notificationId || event?.notificationId || '';
logger.info(`eBay webhook received: ${topic} for marketplace ${marketplace.name}`);
@ -220,7 +372,10 @@ export async function handleWebhook(marketplace, event) {
const normalized = String(topic).toUpperCase();
if (normalized.includes('ACCOUNT_DELETION') || normalized.includes('MARKETPLACE_ACCOUNT_DELETION')) {
if (
normalized.includes('ACCOUNT_DELETION') ||
normalized.includes('MARKETPLACE_ACCOUNT_DELETION')
) {
return {
action: 'accountDeletion',
userId: data.userId || data.username,
@ -233,7 +388,11 @@ export async function handleWebhook(marketplace, event) {
return { action: 'disconnect', notificationId, topic };
}
if (normalized.includes('ORDER') || normalized === 'ITEM.SOLD' || normalized === 'ORDER.FULFILLMENT') {
if (
normalized.includes('ORDER') ||
normalized === 'ITEM.SOLD' ||
normalized === 'ORDER.FULFILLMENT'
) {
return {
action: orderId && topic.toLowerCase().includes('cancel') ? 'orderCancel' : 'orderUpdate',
orderId,

View File

@ -1,43 +1,8 @@
import { logger, getMarketplaceDebugContext } from './shared.js';
import { logger } from './shared.js';
import { makeTradingRequest } from './trading.js';
import { fetchEbayCategoryReferences } from './categoryTree.js';
import { syncAccountPolicies } from './accountPolicySync.js';
const TRADING_COMPATIBILITY_LEVEL = '1399';
const TRADING_SANDBOX_URL = 'https://api.sandbox.ebay.com/ws/api.dll';
const TRADING_PRODUCTION_URL = 'https://api.ebay.com/ws/api.dll';
const MARKETPLACE_SITE_IDS = {
EBAY_US: '0',
EBAY_ENCA: '2',
EBAY_GB: '3',
EBAY_AU: '15',
EBAY_AT: '16',
EBAY_FRBE: '23',
EBAY_FR: '71',
EBAY_DE: '77',
EBAY_IT: '101',
EBAY_NLBE: '123',
EBAY_NL: '146',
EBAY_ES: '186',
EBAY_CH: '193',
EBAY_HK: '201',
EBAY_IN: '203',
EBAY_IE: '205',
EBAY_MY: '207',
EBAY_PH: '211',
EBAY_PL: '212',
EBAY_SG: '216',
};
function getTradingApiUrl(marketplace) {
return marketplace.config?.sandbox ? TRADING_SANDBOX_URL : TRADING_PRODUCTION_URL;
}
function getSiteId(marketplace) {
const marketplaceId = marketplace.config?.marketplaceId || 'EBAY_GB';
return MARKETPLACE_SITE_IDS[marketplaceId] || MARKETPLACE_SITE_IDS.EBAY_GB;
}
export function parseShippingServiceDetails(xml = '') {
const blocks = xml.match(/<ShippingServiceDetails>[\s\S]*?<\/ShippingServiceDetails>/g) || [];
const services = [];
@ -68,67 +33,13 @@ function buildGeteBayDetailsRequest() {
}
export async function fetchEbayShippingServices(marketplace) {
const accessToken = marketplace.config?.accessToken;
if (!accessToken) {
throw new Error(
'eBay marketplace is not authenticated. Complete marketplace authorization first.'
);
}
const url = getTradingApiUrl(marketplace);
const siteId = getSiteId(marketplace);
const startedAt = Date.now();
logger.debug('eBay Trading API GeteBayDetails request', {
...getMarketplaceDebugContext(marketplace),
siteId,
url,
});
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'text/xml',
'X-EBAY-API-CALL-NAME': 'GeteBayDetails',
'X-EBAY-API-SITEID': siteId,
'X-EBAY-API-COMPATIBILITY-LEVEL': TRADING_COMPATIBILITY_LEVEL,
'X-EBAY-API-IAF-TOKEN': accessToken,
},
const xml = await makeTradingRequest({
marketplace,
callName: 'GeteBayDetails',
body: buildGeteBayDetailsRequest(),
});
const xml = await response.text();
const durationMs = Date.now() - startedAt;
if (!response.ok) {
logger.error(`GeteBayDetails failed (${response.status})`, {
durationMs,
...getMarketplaceDebugContext(marketplace),
siteId,
});
throw new Error(`eBay GeteBayDetails error (${response.status})`);
}
const ackMatch = xml.match(/<Ack>([^<]+)<\/Ack>/);
const ack = ackMatch?.[1];
if (ack && ack !== 'Success' && ack !== 'Warning') {
const message =
xml.match(/<LongMessage>([^<]+)<\/LongMessage>/)?.[1] ||
xml.match(/<ShortMessage>([^<]+)<\/ShortMessage>/)?.[1] ||
ack;
logger.error(`GeteBayDetails failed: ${message}`, {
ack,
durationMs,
...getMarketplaceDebugContext(marketplace),
siteId,
});
throw new Error(`eBay GeteBayDetails failed: ${message}`);
}
const services = parseShippingServiceDetails(xml);
logger.debug(`GeteBayDetails succeeded (${durationMs}ms)`, {
...getMarketplaceDebugContext(marketplace),
siteId,
serviceCount: services.length,
});
logger.info(
`Fetched ${services.length} eBay shipping service(s) for marketplace "${marketplace.name}"`
);

View File

@ -0,0 +1,141 @@
import { logger, getMarketplaceDebugContext, formatDebugPayload } from './shared.js';
const TRADING_COMPATIBILITY_LEVEL = '1399';
const TRADING_SANDBOX_URL = 'https://api.sandbox.ebay.com/ws/api.dll';
const TRADING_PRODUCTION_URL = 'https://api.ebay.com/ws/api.dll';
const MARKETPLACE_SITE_IDS = {
EBAY_US: '0',
EBAY_ENCA: '2',
EBAY_GB: '3',
EBAY_AU: '15',
EBAY_AT: '16',
EBAY_FRBE: '23',
EBAY_FR: '71',
EBAY_DE: '77',
EBAY_IT: '101',
EBAY_NLBE: '123',
EBAY_NL: '146',
EBAY_ES: '186',
EBAY_CH: '193',
EBAY_HK: '201',
EBAY_IN: '203',
EBAY_IE: '205',
EBAY_MY: '207',
EBAY_PH: '211',
EBAY_PL: '212',
EBAY_SG: '216',
};
export function getTradingApiUrl(marketplace) {
return marketplace.config?.sandbox ? TRADING_SANDBOX_URL : TRADING_PRODUCTION_URL;
}
export function getTradingSiteId(marketplace) {
const marketplaceId = marketplace.config?.marketplaceId || 'EBAY_GB';
return MARKETPLACE_SITE_IDS[marketplaceId] || MARKETPLACE_SITE_IDS.EBAY_GB;
}
export function xmlEscape(value) {
return String(value ?? '')
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;');
}
export function xmlUnescape(value) {
return String(value ?? '')
.replace(/&apos;/g, "'")
.replace(/&quot;/g, '"')
.replace(/&gt;/g, '>')
.replace(/&lt;/g, '<')
.replace(/&amp;/g, '&');
}
export function xmlBlocks(xml, tag) {
const re = new RegExp(`<${tag}(?:\\s[^>]*)?>[\\s\\S]*?</${tag}>`, 'gi');
return String(xml || '').match(re) || [];
}
export function xmlText(xml, tag) {
const re = new RegExp(`<${tag}(?:\\s[^>]*)?>([\\s\\S]*?)</${tag}>`, 'i');
const match = String(xml || '').match(re);
if (!match) return '';
return xmlUnescape(match[1].replace(/<[^>]+>/g, '').trim());
}
export function xmlNumber(xml, tag) {
const parsed = parseFloat(xmlText(xml, tag));
return Number.isFinite(parsed) ? parsed : 0;
}
export async function makeTradingRequest({
marketplace,
callName,
body,
logResponse = false,
} = {}) {
const accessToken = marketplace.config?.accessToken;
if (!accessToken) {
throw new Error(
'eBay marketplace is not authenticated. Complete marketplace authorization first.'
);
}
const url = getTradingApiUrl(marketplace);
const siteId = getTradingSiteId(marketplace);
const startedAt = Date.now();
logger.debug(`eBay Trading API ${callName} request`, {
...getMarketplaceDebugContext(marketplace),
siteId,
url,
});
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'text/xml',
'X-EBAY-API-CALL-NAME': callName,
'X-EBAY-API-SITEID': siteId,
'X-EBAY-API-COMPATIBILITY-LEVEL': TRADING_COMPATIBILITY_LEVEL,
'X-EBAY-API-IAF-TOKEN': accessToken,
},
body,
});
const xml = await response.text();
const durationMs = Date.now() - startedAt;
if (!response.ok) {
logger.error(`${callName} failed (${response.status})`, {
durationMs,
...getMarketplaceDebugContext(marketplace),
siteId,
});
throw new Error(`eBay ${callName} error (${response.status})`);
}
const ack = xmlText(xml, 'Ack');
if (ack && ack !== 'Success' && ack !== 'Warning') {
const message = xmlText(xml, 'LongMessage') || xmlText(xml, 'ShortMessage') || ack;
logger.error(`${callName} failed: ${message}`, {
ack,
durationMs,
...getMarketplaceDebugContext(marketplace),
siteId,
response: formatDebugPayload(xml),
});
throw new Error(`eBay ${callName} failed: ${message}`);
}
logger.debug(`eBay Trading API ${callName} -> ${ack || response.status} (${durationMs}ms)`, {
...getMarketplaceDebugContext(marketplace),
siteId,
response: logResponse ? formatDebugPayload(xml) : undefined,
});
return xml;
}

View File

@ -84,10 +84,24 @@ router.get('/properties', checkPermissions('invoice', 'list'), isAuthenticated,
listInvoicesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('invoice', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getInvoicePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('invoice', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true, invoiceModel);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true, invoiceModel
);
}
getInvoicePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('invoice', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchInvoicesRouteHandler(req, res, search);

View File

@ -65,7 +65,17 @@ router.get(
checkPermissions('paymentPolicy', 'list'),
isAuthenticated,
async (req, res) => {
getPaymentPolicyPropertyValuesRouteHandler(req, res, req.query.property);
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPaymentPolicyPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);

View File

@ -65,10 +65,24 @@ router.get('/properties', checkPermissions('payment', 'list'), isAuthenticated,
listPaymentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('payment', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPaymentPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('payment', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPaymentPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('payment', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchPaymentsRouteHandler(req, res, search);

View File

@ -50,10 +50,24 @@ router.get('/properties', checkPermissions('taxRecord', 'list'), isAuthenticated
listTaxRecordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('taxRecord', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getTaxRecordPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('taxRecord', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getTaxRecordPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('taxRecord', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchTaxRecordsRouteHandler(req, res, search);

View File

@ -60,10 +60,24 @@ router.get('/properties', checkPermissions('filamentStock', 'list'), isAuthentic
listFilamentStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('filamentStock', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getFilamentStockPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('filamentStock', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFilamentStockPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('filamentStock', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchFilamentStocksRouteHandler(req, res, search);

View File

@ -74,10 +74,24 @@ router.get('/properties', checkPermissions('orderItem', 'list'), isAuthenticated
listOrderItemsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('orderItem', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getOrderItemPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('orderItem', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getOrderItemPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('orderItem', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchOrderItemsRouteHandler(req, res, search);

View File

@ -52,10 +52,24 @@ router.get('/properties', checkPermissions('partStock', 'list'), isAuthenticated
listPartStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('partStock', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPartStockPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('partStock', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPartStockPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('partStock', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchPartStocksRouteHandler(req, res, search);

View File

@ -51,10 +51,24 @@ router.get('/properties', checkPermissions('productStock', 'list'), isAuthentica
listProductStocksByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('productStock', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getProductStockPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('productStock', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getProductStockPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('productStock', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchProductStocksRouteHandler(req, res, search);

View File

@ -78,10 +78,24 @@ router.get('/properties', checkPermissions('purchaseOrder', 'list'), isAuthentic
listPurchaseOrdersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('purchaseOrder', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPurchaseOrderPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('purchaseOrder', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPurchaseOrderPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('purchaseOrder', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchPurchaseOrdersRouteHandler(req, res, search);

View File

@ -83,10 +83,24 @@ router.get('/properties', checkPermissions('shipment', 'list'), isAuthenticated,
listShipmentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('shipment', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getShipmentPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('shipment', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getShipmentPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('shipment', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchShipmentsRouteHandler(req, res, search);

View File

@ -41,10 +41,24 @@ router.get('/properties', checkPermissions('stockEvent', 'list'), isAuthenticate
listStockEventsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('stockEvent', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getStockEventPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('stockEvent', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getStockEventPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('stockEvent', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchStockEventsRouteHandler(req, res, search);

View File

@ -40,10 +40,24 @@ router.get('/properties', checkPermissions('stockLocation', 'list'), isAuthentic
listStockLocationsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('stockLocation', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getStockLocationPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('stockLocation', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getStockLocationPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('stockLocation', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchStockLocationsRouteHandler(req, res, search);

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('stockTransfer', 'list'), isAuthentic
listStockTransfersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('stockTransfer', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getStockTransferPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('stockTransfer', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getStockTransferPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('stockTransfer', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchStockTransfersRouteHandler(req, res, search);

View File

@ -46,10 +46,24 @@ router.get('/properties', checkPermissions('appPassword', 'list'), isAuthenticat
listAppPasswordsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('appPassword', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getAppPasswordPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('appPassword', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getAppPasswordPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('appPassword', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -50,10 +50,24 @@ router.get('/properties', checkPermissions('courier', 'list'), isAuthenticated,
listCouriersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('courier', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getCourierPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('courier', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getCourierPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('courier', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -76,10 +76,24 @@ router.get('/properties', checkPermissions('courierService', 'list'), isAuthenti
listCourierServicesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('courierService', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getCourierServicePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('courierService', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getCourierServicePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('courierService', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('documentJob', 'list'), isAuthenticat
listDocumentJobsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('documentJob', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getDocumentJobPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('documentJob', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getDocumentJobPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('documentJob', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('documentPrinter', 'list'), isAuthent
listDocumentPrintersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('documentPrinter', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getDocumentPrinterPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('documentPrinter', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getDocumentPrinterPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('documentPrinter', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -64,10 +64,24 @@ router.get('/properties', checkPermissions('documentSize', 'list'), isAuthentica
listDocumentSizesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('documentSize', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getDocumentSizePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('documentSize', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getDocumentSizePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('documentSize', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -66,10 +66,24 @@ router.get('/properties', checkPermissions('documentTemplate', 'list'), isAuthen
listDocumentTemplatesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('documentTemplate', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getDocumentTemplatePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('documentTemplate', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getDocumentTemplatePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('documentTemplate', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -70,10 +70,24 @@ router.get('/properties', checkPermissions('filament', 'list'), isAuthenticated,
listFilamentsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('filament', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getFilamentPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('filament', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFilamentPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('filament', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -59,10 +59,24 @@ router.get('/properties', checkPermissions('filamentSku', 'list'), isAuthenticat
listFilamentSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('filamentSku', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getFilamentSkuPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('filamentSku', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFilamentSkuPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('filamentSku', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchFilamentSkusRouteHandler(req, res, search);

View File

@ -52,10 +52,24 @@ router.get('/properties', checkPermissions('file', 'list'), isAuthenticated, asy
listFilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('file', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getFilePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('file', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFilePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('file', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('host', 'list'), isAuthenticated, asy
listHostsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('host', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getHostPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('host', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getHostPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('host', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('material', 'list'), isAuthenticated,
listMaterialsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('material', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getMaterialPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('material', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getMaterialPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('material', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('noteType', 'list'), isAuthenticated,
listNoteTypesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('noteType', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getNoteTypePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('noteType', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getNoteTypePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('noteType', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchNoteTypesRouteHandler(req, res, search);

View File

@ -59,10 +59,24 @@ router.get('/properties', checkPermissions('part', 'list'), isAuthenticated, asy
listPartsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('part', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPartPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('part', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPartPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('part', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -60,10 +60,24 @@ router.get('/properties', checkPermissions('partSku', 'list'), isAuthenticated,
listPartSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('partSku', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPartSkuPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('partSku', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPartSkuPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('partSku', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchPartSkusRouteHandler(req, res, search);

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('permissionSetting', 'list'), isAuthe
listPermissionSettingsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('permissionSetting', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPermissionSettingsPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('permissionSetting', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPermissionSettingsPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('permissionSetting', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -46,10 +46,24 @@ router.get('/properties', checkPermissions('productCategory', 'list'), isAuthent
listProductCategoriesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('productCategory', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getProductCategoryPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('productCategory', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getProductCategoryPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('productCategory', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -60,10 +60,24 @@ router.get('/properties', checkPermissions('product', 'list'), isAuthenticated,
listProductsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('product', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getProductPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('product', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getProductPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('product', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -60,10 +60,24 @@ router.get('/properties', checkPermissions('productSku', 'list'), isAuthenticate
listProductSkusByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('productSku', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getProductSkuPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('productSku', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getProductSkuPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('productSku', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchProductSkusRouteHandler(req, res, search);

View File

@ -61,10 +61,24 @@ router.get('/properties', checkPermissions('taxRate', 'list'), isAuthenticated,
listTaxRatesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('taxRate', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getTaxRatePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('taxRate', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getTaxRatePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('taxRate', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('userGroup', 'list'), isAuthenticated
listUserGroupsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('userGroup', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getUserGroupPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('userGroup', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getUserGroupPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('userGroup', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -50,10 +50,24 @@ router.get('/properties', checkPermissions('user', 'list'), isAuthenticated, asy
listUsersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('user', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getUserPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('user', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getUserPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('user', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchUsersRouteHandler(req, res, search);

View File

@ -48,10 +48,24 @@ router.get('/properties', checkPermissions('vendor', 'list'), isAuthenticated, a
listVendorsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('vendor', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getVendorPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('vendor', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getVendorPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('vendor', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;

View File

@ -46,10 +46,24 @@ router.get('/properties', checkPermissions('filamentProfile', 'list'), isAuthent
listFilamentProfilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('filamentProfile', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getFilamentProfilePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('filamentProfile', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFilamentProfilePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('filamentProfile', 'list'), isAuthenticated, async (req, res) => {
searchFilamentProfilesRouteHandler(req, res, req.query.search);

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('gcodeFile', 'list'), isAuthenticated
listGCodeFilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('gcodeFile', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getGCodeFilePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('gcodeFile', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getGCodeFilePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('gcodeFile', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchGCodeFilesRouteHandler(req, res, search);

View File

@ -45,7 +45,17 @@ import { convertPropertiesString, getFilter, getSort } from '../../utils.js';
router.get('/', isAuthenticated, checkPermissions('job', 'list'), async (req, res) => {
const { page, limit, property, search, sortProperty, sortOrder } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
listJobsRouteHandler(req, res, page, limit, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder);
listJobsRouteHandler(
req,
res,
page,
limit,
property,
filter,
search,
getSort(sortProperty, listAllowedSorters),
sortOrder
);
});
router.get('/properties', checkPermissions('job', 'list'), isAuthenticated, async (req, res) => {
@ -60,7 +70,12 @@ router.get('/properties', checkPermissions('job', 'list'), isAuthenticated, asyn
router.get('/values', checkPermissions('job', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getJobPropertyValuesRouteHandler(req, res, property);
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(JSON.parse(req.query.masterFilter), listAllowedFilters, true);
}
getJobPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
});
router.get('/search', checkPermissions('job', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
@ -84,7 +99,16 @@ router.get('/history', isAuthenticated, async (req, res) => {
router.get('/neighbors', isAuthenticated, async (req, res) => {
const { property, search, sortProperty, sortOrder, id } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
getJobNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id);
getJobNeighborsRouteHandler(
req,
res,
property,
filter,
search,
getSort(sortProperty, listAllowedSorters),
sortOrder,
id
);
});
router.get('/:id', isAuthenticated, checkPermissions('job', 'info'), async (req, res) => {

View File

@ -45,10 +45,24 @@ router.get('/properties', checkPermissions('printerProfile', 'list'), isAuthenti
listPrinterProfilesByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('printerProfile', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPrinterProfilePropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('printerProfile', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPrinterProfilePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('printerProfile', 'list'), isAuthenticated, async (req, res) => {
searchPrinterProfilesRouteHandler(req, res, req.query.search);

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('printer', 'list'), isAuthenticated,
listPrintersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('printer', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getPrinterPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('printer', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getPrinterPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('printer', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchPrintersRouteHandler(req, res, search);

View File

@ -56,10 +56,24 @@ router.get('/properties', checkPermissions('subJob', 'list'), isAuthenticated, a
listSubJobsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('subJob', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getSubJobPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('subJob', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getSubJobPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('subJob', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchSubJobsRouteHandler(req, res, search);

View File

@ -49,10 +49,24 @@ router.get('/properties', checkPermissions('client', 'list'), isAuthenticated, a
listClientsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('client', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getClientPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('client', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getClientPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('client', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchClientsRouteHandler(req, res, search);

View File

@ -76,7 +76,17 @@ router.get(
checkPermissions('fulfillmentPolicy', 'list'),
isAuthenticated,
async (req, res) => {
getFulfillmentPolicyPropertyValuesRouteHandler(req, res, req.query.property);
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getFulfillmentPolicyPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);

View File

@ -84,10 +84,24 @@ router.get('/properties', checkPermissions('listing', 'list'), isAuthenticated,
listListingsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('listing', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getListingPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('listing', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getListingPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('listing', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchListingsRouteHandler(req, res, search);

View File

@ -2,6 +2,7 @@ import express from 'express';
import { isAuthenticated } from '../../keycloak.js';
import { checkPermissions } from '../../database/permissions.js';
import { getFilter, convertPropertiesString, getSort } from '../../utils.js';
import { listingVarientModel } from '../../database/schemas/sales/listingvarient.schema.js';
const router = express.Router();
@ -19,18 +20,26 @@ const listAllowedFilters = [
'updatedAt',
'_reference',
];
const listAllowedSorters = ['state', 'stockQuantity', 'price', 'lastSyncedAt', 'createdAt', 'updatedAt', '_id'];
const listAllowedSorters = [
'state',
'stockQuantity',
'price',
'lastSyncedAt',
'createdAt',
'updatedAt',
'_id',
];
const propertiesAllowedFilters = [
'listing',
'listing._id',
'product',
'productSku',
'stockQuantity',
'state',
'state.type',
'createdAt',
'updatedAt',
];
'listing',
'listing._id',
'product',
'productSku',
'stockQuantity',
'state',
'state.type',
'createdAt',
'updatedAt',
];
import {
listListingVarientsRouteHandler,
getListingVarientRouteHandler,
@ -44,39 +53,77 @@ import {
unpublishListingVarientRouteHandler,
searchListingVarientsRouteHandler,
getListingVarientPropertyValuesRouteHandler,
getListingVarientNeighborsRouteHandler
getListingVarientNeighborsRouteHandler,
} from '../../services/sales/listingvarients.js';
router.get('/', isAuthenticated, checkPermissions('listingVarient', 'list'), async (req, res) => {
const { page, limit, property, search, sortProperty, sortOrder } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
listListingVarientsRouteHandler(req, res, page, limit, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder);
const filter = await getFilter(req.query, listAllowedFilters);
listListingVarientsRouteHandler(
req,
res,
page,
limit,
property,
filter,
search,
getSort(sortProperty, listAllowedSorters),
sortOrder
);
});
router.get('/properties', checkPermissions('listingVarient', 'list'), isAuthenticated, async (req, res) => {
let properties = convertPropertiesString(req.query.properties);
const filter = await getFilter(req.query, propertiesAllowedFilters, false);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter);
router.get(
'/properties',
checkPermissions('listingVarient', 'list'),
isAuthenticated,
async (req, res) => {
let properties = convertPropertiesString(req.query.properties);
const filter = await getFilter(req.query, propertiesAllowedFilters, false);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter);
}
listListingVarientsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
}
listListingVarientsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
);
router.get('/values', checkPermissions('listingVarient', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getListingVarientPropertyValuesRouteHandler(req, res, property);
});
router.get('/search', checkPermissions('listingVarient', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchListingVarientsRouteHandler(req, res, search);
});
router.get(
'/values',
checkPermissions('listingVarient', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true, listingVarientModel);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true,
listingVarientModel
);
}
getListingVarientPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get(
'/search',
checkPermissions('listingVarient', 'list'),
isAuthenticated,
async (req, res) => {
const { search } = req.query;
searchListingVarientsRouteHandler(req, res, search);
}
);
router.post('/', isAuthenticated, checkPermissions('listing', 'newListingVarient'), async (req, res) => {
newListingVarientRouteHandler(req, res);
});
router.post(
'/',
isAuthenticated,
checkPermissions('listing', 'newListingVarient'),
async (req, res) => {
newListingVarientRouteHandler(req, res);
}
);
router.get('/stats', isAuthenticated, async (req, res) => {
getListingVarientStatsRouteHandler(req, res);
@ -86,27 +133,56 @@ router.get('/history', isAuthenticated, async (req, res) => {
getListingVarientHistoryRouteHandler(req, res);
});
router.post('/:id/publish', isAuthenticated, checkPermissions('listingVarient', 'publish'), async (req, res) => {
publishListingVarientRouteHandler(req, res);
});
router.post(
'/:id/publish',
isAuthenticated,
checkPermissions('listingVarient', 'publish'),
async (req, res) => {
publishListingVarientRouteHandler(req, res);
}
);
router.post('/:id/unpublish', isAuthenticated, checkPermissions('listingVarient', 'unpublish'), async (req, res) => {
unpublishListingVarientRouteHandler(req, res);
});
router.post(
'/:id/unpublish',
isAuthenticated,
checkPermissions('listingVarient', 'unpublish'),
async (req, res) => {
unpublishListingVarientRouteHandler(req, res);
}
);
router.get('/neighbors', isAuthenticated, async (req, res) => {
const { property, search, sortProperty, sortOrder, id } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
getListingVarientNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id);
getListingVarientNeighborsRouteHandler(
req,
res,
property,
filter,
search,
getSort(sortProperty, listAllowedSorters),
sortOrder,
id
);
});
router.get('/:id', isAuthenticated, checkPermissions('listingVarient', 'info'), async (req, res) => {
getListingVarientRouteHandler(req, res);
});
router.get(
'/:id',
isAuthenticated,
checkPermissions('listingVarient', 'info'),
async (req, res) => {
getListingVarientRouteHandler(req, res);
}
);
router.put('/:id', isAuthenticated, checkPermissions('listingVarient', 'edit'), async (req, res) => {
editListingVarientRouteHandler(req, res);
});
router.put(
'/:id',
isAuthenticated,
checkPermissions('listingVarient', 'edit'),
async (req, res) => {
editListingVarientRouteHandler(req, res);
}
);
router.delete('/:id', isAuthenticated, async (req, res) => {
deleteListingVarientRouteHandler(req, res);

View File

@ -101,7 +101,16 @@ router.get(
isAuthenticated,
async (req, res) => {
const { property } = req.query;
getMarketplacePropertyValuesRouteHandler(req, res, property);
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getMarketplacePropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get(

View File

@ -81,7 +81,17 @@ router.get(
checkPermissions('returnPolicy', 'list'),
isAuthenticated,
async (req, res) => {
getReturnPolicyPropertyValuesRouteHandler(req, res, req.query.property);
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getReturnPolicyPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);

View File

@ -51,10 +51,24 @@ router.get('/properties', checkPermissions('salesOrder', 'list'), isAuthenticate
listSalesOrdersByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', checkPermissions('salesOrder', 'list'), isAuthenticated, async (req, res) => {
const { property } = req.query;
getSalesOrderPropertyValuesRouteHandler(req, res, property);
});
router.get(
'/values',
checkPermissions('salesOrder', 'list'),
isAuthenticated,
async (req, res) => {
const { property } = req.query;
const filter = await getFilter(req.query, listAllowedFilters, true);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = await getFilter(
JSON.parse(req.query.masterFilter),
listAllowedFilters,
true
);
}
getSalesOrderPropertyValuesRouteHandler(req, res, property, filter, masterFilter);
}
);
router.get('/search', checkPermissions('salesOrder', 'list'), isAuthenticated, async (req, res) => {
const { search } = req.query;
searchSalesOrdersRouteHandler(req, res, search);

View File

@ -95,10 +95,17 @@ export const listInvoicesByPropertiesRouteHandler = async (
res.send(result);
};
export const getInvoicePropertyValuesRouteHandler = async (req, res, property) => {
export const getInvoicePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: invoiceModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -89,10 +89,17 @@ export const listPaymentPoliciesByPropertiesRouteHandler = async (
res.send(result);
};
export const getPaymentPolicyPropertyValuesRouteHandler = async (req, res, property) => {
export const getPaymentPolicyPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: paymentPolicyModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -84,10 +84,17 @@ export const listPaymentsByPropertiesRouteHandler = async (
res.send(result);
};
export const getPaymentPropertyValuesRouteHandler = async (req, res, property) => {
export const getPaymentPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: paymentModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listTaxRecordsByPropertiesRouteHandler = async (
res.send(result);
};
export const getTaxRecordPropertyValuesRouteHandler = async (req, res, property) => {
export const getTaxRecordPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: taxRecordModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -82,10 +82,17 @@ export const listFilamentStocksByPropertiesRouteHandler = async (
res.send(result);
};
export const getFilamentStockPropertyValuesRouteHandler = async (req, res, property) => {
export const getFilamentStockPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: filamentStockModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -173,10 +173,17 @@ export const listOrderItemsByPropertiesRouteHandler = async (
res.send(result);
};
export const getOrderItemPropertyValuesRouteHandler = async (req, res, property) => {
export const getOrderItemPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: orderItemModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -85,10 +85,17 @@ export const listPartStocksByPropertiesRouteHandler = async (
res.send(result);
};
export const getPartStockPropertyValuesRouteHandler = async (req, res, property) => {
export const getPartStockPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: partStockModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -144,10 +144,17 @@ export const listProductStocksByPropertiesRouteHandler = async (
res.send(result);
};
export const getProductStockPropertyValuesRouteHandler = async (req, res, property) => {
export const getProductStockPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: productStockModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -81,10 +81,17 @@ export const listPurchaseOrdersByPropertiesRouteHandler = async (
res.send(result);
};
export const getPurchaseOrderPropertyValuesRouteHandler = async (req, res, property) => {
export const getPurchaseOrderPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: purchaseOrderModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -82,10 +82,17 @@ export const listShipmentsByPropertiesRouteHandler = async (
res.send(result);
};
export const getShipmentPropertyValuesRouteHandler = async (req, res, property) => {
export const getShipmentPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: shipmentModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -79,10 +79,17 @@ export const listStockEventsByPropertiesRouteHandler = async (
res.send(result);
};
export const getStockEventPropertyValuesRouteHandler = async (req, res, property) => {
export const getStockEventPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: stockEventModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listStockLocationsByPropertiesRouteHandler = async (
res.send(result);
};
export const getStockLocationPropertyValuesRouteHandler = async (req, res, property) => {
export const getStockLocationPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: stockLocationModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -281,10 +281,17 @@ export const listStockTransfersByPropertiesRouteHandler = async (
res.send(result);
};
export const getStockTransferPropertyValuesRouteHandler = async (req, res, property) => {
export const getStockTransferPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: stockTransferModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -82,10 +82,17 @@ export const listAppPasswordsByPropertiesRouteHandler = async (
res.send(result);
};
export const getAppPasswordPropertyValuesRouteHandler = async (req, res, property) => {
export const getAppPasswordPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: appPasswordModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listCouriersByPropertiesRouteHandler = async (
res.send(result);
};
export const getCourierPropertyValuesRouteHandler = async (req, res, property) => {
export const getCourierPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: courierModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -78,10 +78,17 @@ export const listCourierServicesByPropertiesRouteHandler = async (
res.send(result);
};
export const getCourierServicePropertyValuesRouteHandler = async (req, res, property) => {
export const getCourierServicePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: courierServiceModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -75,10 +75,17 @@ export const listDocumentJobsByPropertiesRouteHandler = async (
res.send(result);
};
export const getDocumentJobPropertyValuesRouteHandler = async (req, res, property) => {
export const getDocumentJobPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: documentJobModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -78,10 +78,17 @@ export const listDocumentPrintersByPropertiesRouteHandler = async (
res.send(result);
};
export const getDocumentPrinterPropertyValuesRouteHandler = async (req, res, property) => {
export const getDocumentPrinterPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: documentPrinterModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listDocumentSizesByPropertiesRouteHandler = async (
res.send(result);
};
export const getDocumentSizePropertyValuesRouteHandler = async (req, res, property) => {
export const getDocumentSizePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: documentSizeModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -112,10 +112,17 @@ export const listDocumentTemplatesByPropertiesRouteHandler = async (
res.send(result);
};
export const getDocumentTemplatePropertyValuesRouteHandler = async (req, res, property) => {
export const getDocumentTemplatePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: documentTemplateModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -78,10 +78,17 @@ export const listFilamentsByPropertiesRouteHandler = async (
res.send(result);
};
export const getFilamentPropertyValuesRouteHandler = async (req, res, property) => {
export const getFilamentPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: filamentModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listFilamentSkusByPropertiesRouteHandler = async (
res.send(result);
};
export const getFilamentSkuPropertyValuesRouteHandler = async (req, res, property) => {
export const getFilamentSkuPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: filamentSkuModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -111,10 +111,17 @@ export const listFilesByPropertiesRouteHandler = async (
res.send(result);
};
export const getFilePropertyValuesRouteHandler = async (req, res, property) => {
export const getFilePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: fileModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listHostsByPropertiesRouteHandler = async (
res.send(result);
};
export const getHostPropertyValuesRouteHandler = async (req, res, property) => {
export const getHostPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: hostModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listMaterialsByPropertiesRouteHandler = async (
res.send(result);
};
export const getMaterialPropertyValuesRouteHandler = async (req, res, property) => {
export const getMaterialPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: materialModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listNoteTypesByPropertiesRouteHandler = async (
res.send(result);
};
export const getNoteTypePropertyValuesRouteHandler = async (req, res, property) => {
export const getNoteTypePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: noteTypeModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listPartsByPropertiesRouteHandler = async (
res.send(result);
};
export const getPartPropertyValuesRouteHandler = async (req, res, property) => {
export const getPartPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: partModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -82,10 +82,17 @@ export const listPartSkusByPropertiesRouteHandler = async (
res.send(result);
};
export const getPartSkuPropertyValuesRouteHandler = async (req, res, property) => {
export const getPartSkuPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: partSkuModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -77,10 +77,17 @@ export const listPermissionSettingsByPropertiesRouteHandler = async (
res.send(result);
};
export const getPermissionSettingsPropertyValuesRouteHandler = async (req, res, property) => {
export const getPermissionSettingsPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: permissionSettingModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -79,10 +79,17 @@ export const listProductCategoriesByPropertiesRouteHandler = async (
res.send(result);
};
export const getProductCategoryPropertyValuesRouteHandler = async (req, res, property) => {
export const getProductCategoryPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: productCategoryModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listProductsByPropertiesRouteHandler = async (
res.send(result);
};
export const getProductPropertyValuesRouteHandler = async (req, res, property) => {
export const getProductPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: productModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -85,10 +85,17 @@ export const listProductSkusByPropertiesRouteHandler = async (
res.send(result);
};
export const getProductSkuPropertyValuesRouteHandler = async (req, res, property) => {
export const getProductSkuPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: productSkuModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -80,10 +80,17 @@ export const listTaxRatesByPropertiesRouteHandler = async (
res.send(result);
};
export const getTaxRatePropertyValuesRouteHandler = async (req, res, property) => {
export const getTaxRatePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: taxRateModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -83,10 +83,17 @@ export const listUserGroupsByPropertiesRouteHandler = async (
res.send(result);
};
export const getUserGroupPropertyValuesRouteHandler = async (req, res, property) => {
export const getUserGroupPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: userGroupModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -78,10 +78,17 @@ export const listUsersByPropertiesRouteHandler = async (
res.send(result);
};
export const getUserPropertyValuesRouteHandler = async (req, res, property) => {
export const getUserPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: userModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listVendorsByPropertiesRouteHandler = async (
res.send(result);
};
export const getVendorPropertyValuesRouteHandler = async (req, res, property) => {
export const getVendorPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: vendorModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -225,10 +225,17 @@ export const listFilamentProfilesByPropertiesRouteHandler = async (
res.send(result);
};
export const getFilamentProfilePropertyValuesRouteHandler = async (req, res, property) => {
export const getFilamentProfilePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: filamentProfileModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,10 +76,17 @@ export const listGCodeFilesByPropertiesRouteHandler = async (
res.send(result);
};
export const getGCodeFilePropertyValuesRouteHandler = async (req, res, property) => {
export const getGCodeFilePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: gcodeFileModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -76,11 +76,17 @@ export const listJobsByPropertiesRouteHandler = async (
res.send(result);
};
export const getJobPropertyValuesRouteHandler = async (req, res, property, filter = {}) => {
export const getJobPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: jobModel,
property,
filter,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -113,10 +113,17 @@ export const listPrinterProfilesByPropertiesRouteHandler = async (
res.send(result);
};
export const getPrinterProfilePropertyValuesRouteHandler = async (req, res, property) => {
export const getPrinterProfilePropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: printerProfileModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -77,10 +77,17 @@ export const listPrintersByPropertiesRouteHandler = async (
res.send(result);
};
export const getPrinterPropertyValuesRouteHandler = async (req, res, property) => {
export const getPrinterPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: printerModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -71,10 +71,17 @@ export const listSubJobsByPropertiesRouteHandler = async (
res.send(result);
};
export const getSubJobPropertyValuesRouteHandler = async (req, res, property) => {
export const getSubJobPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: subJobModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -74,10 +74,17 @@ export const listClientsByPropertiesRouteHandler = async (
res.send(result);
};
export const getClientPropertyValuesRouteHandler = async (req, res, property) => {
export const getClientPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: clientModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -95,10 +95,17 @@ export const listFulfillmentPoliciesByPropertiesRouteHandler = async (
res.send(result);
};
export const getFulfillmentPolicyPropertyValuesRouteHandler = async (req, res, property) => {
export const getFulfillmentPolicyPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: fulfillmentPolicyModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

View File

@ -144,10 +144,17 @@ export const listListingsByPropertiesRouteHandler = async (
res.send(result);
};
export const getListingPropertyValuesRouteHandler = async (req, res, property) => {
export const getListingPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: listingModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};

Some files were not shown because too many files have changed in this diff Show More