diff --git a/src/database/database.js b/src/database/database.js index 5d22250..3e305ed 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -1643,6 +1643,73 @@ export const deleteObject = async ( } }; +export const deleteObjects = async ({ + model, + filter = {}, + user = null, + checkUnused = false, + states, +}) => { + try { + const convertedFilter = + filter && Object.keys(filter).length > 0 + ? convertObjectIdStringsInFilter(filter) + : {}; + const objects = await model.find(convertedFilter); + const errors = []; + let deletedCount = 0; + + for (const object of objects) { + const id = object._id; + const state = object.state?.type ?? object.state; + + if (Array.isArray(states) && !states.includes(state)) { + errors.push({ + id: String(id), + status: 400, + error: `Object must be in one of these states: ${states.join(', ')}.`, + }); + continue; + } + + try { + const result = await deleteObject({ + model, + id, + user, + checkUnused, + }); + if (result?.error) { + errors.push({ + id: String(id), + status: result.code || 500, + ...result, + }); + continue; + } + + deletedCount += 1; + } catch (error) { + errors.push({ + id: String(id), + status: 500, + error: error.message || 'Delete failed.', + }); + } + } + + return { + matchedCount: objects.length, + deletedCount, + failedCount: errors.length, + errors, + }; + } catch (error) { + logger.error('deleteObjects error:', error); + return { error: error.message, code: 500 }; + } +}; + export const flushFile = async ({ id, user }) => { try { logger.info(`Starting file deletion process for file ID: ${id}`); diff --git a/src/routes/finance/invoices.js b/src/routes/finance/invoices.js index 2f51cf0..ff00b88 100644 --- a/src/routes/finance/invoices.js +++ b/src/routes/finance/invoices.js @@ -38,6 +38,7 @@ import { editMultipleInvoicesRouteHandler, newInvoiceRouteHandler, deleteInvoiceRouteHandler, + deleteInvoiceByFilterRouteHandler, listInvoicesByPropertiesRouteHandler, getInvoiceStatsRouteHandler, getInvoiceHistoryRouteHandler, @@ -141,6 +142,25 @@ router.put('/:id', isAuthenticated, checkPermissions('invoice', 'edit'), async ( editInvoiceRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('invoice', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteInvoiceByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteInvoiceRouteHandler(req, res); }); diff --git a/src/routes/finance/paymentpolicies.js b/src/routes/finance/paymentpolicies.js index 964b942..b5d3757 100644 --- a/src/routes/finance/paymentpolicies.js +++ b/src/routes/finance/paymentpolicies.js @@ -8,6 +8,7 @@ import { editPaymentPolicyRouteHandler, newPaymentPolicyRouteHandler, deletePaymentPolicyRouteHandler, + deletePaymentPolicyByFilterRouteHandler, listPaymentPoliciesByPropertiesRouteHandler, getPaymentPolicyStatsRouteHandler, getPaymentPolicyHistoryRouteHandler, @@ -122,6 +123,25 @@ router.put('/:id', isAuthenticated, checkPermissions('paymentPolicy', 'edit'), a editPaymentPolicyRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('paymentPolicy', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePaymentPolicyByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePaymentPolicyRouteHandler(req, res); }); diff --git a/src/routes/finance/payments.js b/src/routes/finance/payments.js index 484f8e3..e2a46d3 100644 --- a/src/routes/finance/payments.js +++ b/src/routes/finance/payments.js @@ -35,6 +35,7 @@ import { editMultiplePaymentsRouteHandler, newPaymentRouteHandler, deletePaymentRouteHandler, + deletePaymentByFilterRouteHandler, listPaymentsByPropertiesRouteHandler, getPaymentStatsRouteHandler, getPaymentHistoryRouteHandler, @@ -122,6 +123,25 @@ router.put('/:id', isAuthenticated, checkPermissions('payment', 'edit'), async ( editPaymentRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('payment', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePaymentByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePaymentRouteHandler(req, res); }); diff --git a/src/routes/finance/taxrecords.js b/src/routes/finance/taxrecords.js index cef97cb..6a0f932 100644 --- a/src/routes/finance/taxrecords.js +++ b/src/routes/finance/taxrecords.js @@ -24,6 +24,7 @@ import { editTaxRecordRouteHandler, newTaxRecordRouteHandler, deleteTaxRecordRouteHandler, + deleteTaxRecordByFilterRouteHandler, listTaxRecordsByPropertiesRouteHandler, getTaxRecordStatsRouteHandler, getTaxRecordHistoryRouteHandler, @@ -102,6 +103,25 @@ router.put('/:id', isAuthenticated, checkPermissions('taxRecord', 'edit'), async editTaxRecordRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('taxRecord', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteTaxRecordByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteTaxRecordRouteHandler(req, res); }); diff --git a/src/routes/inventory/filamentstocks.js b/src/routes/inventory/filamentstocks.js index 21aca5f..6935fd1 100644 --- a/src/routes/inventory/filamentstocks.js +++ b/src/routes/inventory/filamentstocks.js @@ -34,6 +34,7 @@ import { editMultipleFilamentStocksRouteHandler, newFilamentStockRouteHandler, deleteFilamentStockRouteHandler, + deleteFilamentStockByFilterRouteHandler, postFilamentStockRouteHandler, listFilamentStocksByPropertiesRouteHandler, getFilamentStockStatsRouteHandler, @@ -118,6 +119,25 @@ router.put('/:id', isAuthenticated, checkPermissions('filamentStock', 'edit'), a editFilamentStockRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('filamentStock', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFilamentStockByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFilamentStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/orderitems.js b/src/routes/inventory/orderitems.js index f4685d8..83f8f42 100644 --- a/src/routes/inventory/orderitems.js +++ b/src/routes/inventory/orderitems.js @@ -39,6 +39,7 @@ import { editMultipleOrderItemsRouteHandler, newOrderItemRouteHandler, deleteOrderItemRouteHandler, + deleteOrderItemByFilterRouteHandler, listOrderItemsByPropertiesRouteHandler, getOrderItemStatsRouteHandler, getOrderItemHistoryRouteHandler, @@ -139,6 +140,25 @@ router.put('/:id', isAuthenticated, checkPermissions('orderItem', 'edit'), async editOrderItemRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('orderItem', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteOrderItemByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteOrderItemRouteHandler(req, res); }); diff --git a/src/routes/inventory/partstocks.js b/src/routes/inventory/partstocks.js index 329678f..43c2a27 100644 --- a/src/routes/inventory/partstocks.js +++ b/src/routes/inventory/partstocks.js @@ -34,6 +34,7 @@ import { editMultiplePartStocksRouteHandler, newPartStockRouteHandler, deletePartStockRouteHandler, + deletePartStockByFilterRouteHandler, postPartStockRouteHandler, listPartStocksByPropertiesRouteHandler, getPartStockStatsRouteHandler, @@ -118,6 +119,25 @@ router.put('/:id', isAuthenticated, checkPermissions('partStock', 'edit'), async editPartStockRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('partStock', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePartStockByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePartStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/productstocks.js b/src/routes/inventory/productstocks.js index 5c19861..9d4d08c 100644 --- a/src/routes/inventory/productstocks.js +++ b/src/routes/inventory/productstocks.js @@ -35,6 +35,7 @@ import { editMultipleProductStocksRouteHandler, newProductStockRouteHandler, deleteProductStockRouteHandler, + deleteProductStockByFilterRouteHandler, postProductStockRouteHandler, listProductStocksByPropertiesRouteHandler, getProductStockStatsRouteHandler, @@ -115,6 +116,25 @@ router.put('/:id', isAuthenticated, checkPermissions('productStock', 'edit'), as editProductStockRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('productStock', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteProductStockByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteProductStockRouteHandler(req, res); }); diff --git a/src/routes/inventory/purchaseorders.js b/src/routes/inventory/purchaseorders.js index 20a6016..b2dee38 100644 --- a/src/routes/inventory/purchaseorders.js +++ b/src/routes/inventory/purchaseorders.js @@ -50,6 +50,7 @@ import { editMultiplePurchaseOrdersRouteHandler, newPurchaseOrderRouteHandler, deletePurchaseOrderRouteHandler, + deletePurchaseOrderByFilterRouteHandler, listPurchaseOrdersByPropertiesRouteHandler, getPurchaseOrderStatsRouteHandler, getPurchaseOrderHistoryRouteHandler, @@ -134,6 +135,25 @@ router.put('/:id', isAuthenticated, checkPermissions('purchaseOrder', 'edit'), a editPurchaseOrderRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('purchaseOrder', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePurchaseOrderByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePurchaseOrderRouteHandler(req, res); }); diff --git a/src/routes/inventory/shipments.js b/src/routes/inventory/shipments.js index 820ea45..498b595 100644 --- a/src/routes/inventory/shipments.js +++ b/src/routes/inventory/shipments.js @@ -41,6 +41,7 @@ import { editMultipleShipmentsRouteHandler, newShipmentRouteHandler, deleteShipmentRouteHandler, + deleteShipmentByFilterRouteHandler, listShipmentsByPropertiesRouteHandler, getShipmentStatsRouteHandler, getShipmentHistoryRouteHandler, @@ -148,6 +149,25 @@ router.put('/:id', isAuthenticated, checkPermissions('shipment', 'edit'), async editShipmentRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('shipment', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteShipmentByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteShipmentRouteHandler(req, res); }); diff --git a/src/routes/inventory/stockaudits.js b/src/routes/inventory/stockaudits.js index f15aa06..b53ba79 100644 --- a/src/routes/inventory/stockaudits.js +++ b/src/routes/inventory/stockaudits.js @@ -24,6 +24,7 @@ import { newStockAuditRouteHandler, updateStockAuditRouteHandler, deleteStockAuditRouteHandler, + deleteStockAuditByFilterRouteHandler, getStockAuditStatsRouteHandler, getStockAuditHistoryRouteHandler, searchStockAuditsRouteHandler, @@ -114,6 +115,25 @@ router.put('/:id', isAuthenticated, checkPermissions('stockAudit', 'edit'), asyn updateStockAuditRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('stockAudit', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteStockAuditByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteStockAuditRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocklocations.js b/src/routes/inventory/stocklocations.js index b054589..f8e7b5e 100644 --- a/src/routes/inventory/stocklocations.js +++ b/src/routes/inventory/stocklocations.js @@ -15,6 +15,7 @@ import { editMultipleStockLocationsRouteHandler, newStockLocationRouteHandler, deleteStockLocationRouteHandler, + deleteStockLocationByFilterRouteHandler, listStockLocationsByPropertiesRouteHandler, getStockLocationStatsRouteHandler, getStockLocationHistoryRouteHandler, @@ -82,6 +83,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getStockLocationNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('stockLocation', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteStockLocationByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, checkPermissions('stockLocation', 'info'), async (req, res) => { getStockLocationRouteHandler(req, res); }); diff --git a/src/routes/inventory/stocktransfers.js b/src/routes/inventory/stocktransfers.js index 0ddd07c..743a4d7 100644 --- a/src/routes/inventory/stocktransfers.js +++ b/src/routes/inventory/stocktransfers.js @@ -24,6 +24,7 @@ import { editMultipleStockTransfersRouteHandler, newStockTransferRouteHandler, deleteStockTransferRouteHandler, + deleteStockTransferByFilterRouteHandler, postStockTransferRouteHandler, listStockTransfersByPropertiesRouteHandler, getStockTransferStatsRouteHandler, @@ -104,6 +105,25 @@ router.put('/:id', isAuthenticated, checkPermissions('stockTransfer', 'edit'), a editStockTransferRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('stockTransfer', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteStockTransferByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteStockTransferRouteHandler(req, res); }); diff --git a/src/routes/management/apppasswords.js b/src/routes/management/apppasswords.js index 015511b..ebd03d7 100644 --- a/src/routes/management/apppasswords.js +++ b/src/routes/management/apppasswords.js @@ -23,6 +23,7 @@ import { editAppPasswordRouteHandler, newAppPasswordRouteHandler, deleteAppPasswordRouteHandler, + deleteAppPasswordByFilterRouteHandler, listAppPasswordsByPropertiesRouteHandler, getAppPasswordStatsRouteHandler, getAppPasswordHistoryRouteHandler, @@ -92,6 +93,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getAppPasswordNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('appPassword', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteAppPasswordByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getAppPasswordRouteHandler(req, res); }); diff --git a/src/routes/management/courier.js b/src/routes/management/courier.js index f5252b9..c96a540 100644 --- a/src/routes/management/courier.js +++ b/src/routes/management/courier.js @@ -24,6 +24,7 @@ import { editCourierRouteHandler, newCourierRouteHandler, deleteCourierRouteHandler, + deleteCourierByFilterRouteHandler, listCouriersByPropertiesRouteHandler, getCourierStatsRouteHandler, getCourierHistoryRouteHandler, @@ -102,6 +103,25 @@ router.put('/:id', isAuthenticated, checkPermissions('courier', 'edit'), async ( editCourierRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('courier', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteCourierByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteCourierRouteHandler(req, res); }); diff --git a/src/routes/management/courierservice.js b/src/routes/management/courierservice.js index 88f9de3..18b3caa 100644 --- a/src/routes/management/courierservice.js +++ b/src/routes/management/courierservice.js @@ -55,6 +55,7 @@ import { editCourierServiceRouteHandler, newCourierServiceRouteHandler, deleteCourierServiceRouteHandler, + deleteCourierServiceByFilterRouteHandler, listCourierServicesByPropertiesRouteHandler, getCourierServiceStatsRouteHandler, getCourierServiceHistoryRouteHandler, @@ -133,6 +134,25 @@ router.put('/:id', isAuthenticated, checkPermissions('courierService', 'edit'), editCourierServiceRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('courierService', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteCourierServiceByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteCourierServiceRouteHandler(req, res); }); diff --git a/src/routes/management/documentprinters.js b/src/routes/management/documentprinters.js index de61fc0..c4ab1d8 100644 --- a/src/routes/management/documentprinters.js +++ b/src/routes/management/documentprinters.js @@ -32,6 +32,7 @@ import { editDocumentPrinterRouteHandler, newDocumentPrinterRouteHandler, deleteDocumentPrinterRouteHandler, + deleteDocumentPrinterByFilterRouteHandler, listDocumentPrintersByPropertiesRouteHandler, getDocumentPrinterStatsRouteHandler, getDocumentPrinterHistoryRouteHandler, @@ -102,6 +103,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getDocumentPrinterNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('documentPrinter', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteDocumentPrinterByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getDocumentPrinterRouteHandler(req, res); }); diff --git a/src/routes/management/documentsizes.js b/src/routes/management/documentsizes.js index 41187e8..2571590 100644 --- a/src/routes/management/documentsizes.js +++ b/src/routes/management/documentsizes.js @@ -38,6 +38,7 @@ import { editDocumentSizeRouteHandler, newDocumentSizeRouteHandler, deleteDocumentSizeRouteHandler, + deleteDocumentSizeByFilterRouteHandler, listDocumentSizesByPropertiesRouteHandler, getDocumentSizeStatsRouteHandler, getDocumentSizeHistoryRouteHandler, @@ -108,6 +109,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getDocumentSizeNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('documentSize', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteDocumentSizeByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getDocumentSizeRouteHandler(req, res); }); diff --git a/src/routes/management/documenttemplates.js b/src/routes/management/documenttemplates.js index 33c4464..aa482e5 100644 --- a/src/routes/management/documenttemplates.js +++ b/src/routes/management/documenttemplates.js @@ -38,6 +38,7 @@ import { editDocumentTemplateRouteHandler, newDocumentTemplateRouteHandler, deleteDocumentTemplateRouteHandler, + deleteDocumentTemplateByFilterRouteHandler, listDocumentTemplatesByPropertiesRouteHandler, getDocumentTemplateStatsRouteHandler, getDocumentTemplateHistoryRouteHandler, @@ -115,6 +116,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getDocumentTemplateNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('documentTemplate', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteDocumentTemplateByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.post('/:id/intellisense', isAuthenticated, checkPermissions('documentTemplate', 'design'), async (req, res) => { intellisenseDocumentTemplateRouteHandler(req, res); }); diff --git a/src/routes/management/emailaccounts.js b/src/routes/management/emailaccounts.js index abd82aa..ae5df1f 100644 --- a/src/routes/management/emailaccounts.js +++ b/src/routes/management/emailaccounts.js @@ -3,6 +3,7 @@ import { isAuthenticated } from '../../keycloak.js'; import { checkPermissions } from '../../database/permissions.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; import { + deleteEmailAccountByFilterRouteHandler, deleteEmailAccountRouteHandler, editEmailAccountRouteHandler, getEmailAccountRouteHandler, @@ -75,6 +76,24 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { ); }); router.post('/', isAuthenticated, checkPermissions('emailAccount', 'new'), newEmailAccountRouteHandler); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('emailAccount', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + filters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + filters, + true + ); + deleteEmailAccountByFilterRouteHandler(req, res, filter, masterFilter); + } +); router.get('/:id', isAuthenticated, getEmailAccountRouteHandler); router.put('/:id', isAuthenticated, checkPermissions('emailAccount', 'edit'), editEmailAccountRouteHandler); router.delete('/:id', isAuthenticated, checkPermissions('emailAccount', 'delete'), deleteEmailAccountRouteHandler); diff --git a/src/routes/management/emailtemplates.js b/src/routes/management/emailtemplates.js index ba05cc1..20964b9 100644 --- a/src/routes/management/emailtemplates.js +++ b/src/routes/management/emailtemplates.js @@ -3,6 +3,7 @@ import { isAuthenticated } from '../../keycloak.js'; import { checkPermissions } from '../../database/permissions.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; import { + deleteEmailTemplateByFilterRouteHandler, deleteEmailTemplateRouteHandler, editEmailTemplateRouteHandler, formatEmailTemplateRouteHandler, @@ -94,6 +95,24 @@ router.post('/', isAuthenticated, checkPermissions('emailTemplate', 'new'), newE router.post('/format', isAuthenticated, checkPermissions('emailTemplate', 'design'), formatEmailTemplateRouteHandler); router.post('/:id/intellisense', isAuthenticated, checkPermissions('emailTemplate', 'design'), intellisenseEmailTemplateRouteHandler); router.post('/:id/preview', isAuthenticated, checkPermissions('emailTemplate', 'design'), previewEmailTemplateRouteHandler); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('emailTemplate', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + filters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + filters, + true + ); + deleteEmailTemplateByFilterRouteHandler(req, res, filter, masterFilter); + } +); router.get('/:id', isAuthenticated, getEmailTemplateRouteHandler); router.put('/:id', isAuthenticated, checkPermissions('emailTemplate', 'edit'), editEmailTemplateRouteHandler); router.delete('/:id', isAuthenticated, checkPermissions('emailTemplate', 'delete'), deleteEmailTemplateRouteHandler); diff --git a/src/routes/management/filaments.js b/src/routes/management/filaments.js index 484e25b..5173613 100644 --- a/src/routes/management/filaments.js +++ b/src/routes/management/filaments.js @@ -40,6 +40,7 @@ import { editMultipleFilamentsRouteHandler, newFilamentRouteHandler, deleteFilamentRouteHandler, + deleteFilamentByFilterRouteHandler, getFilamentStatsRouteHandler, getFilamentHistoryRouteHandler, searchFilamentsRouteHandler, @@ -134,6 +135,25 @@ router.put('/:id', isAuthenticated, checkPermissions('filament', 'edit'), async editFilamentRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('filament', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFilamentByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFilamentRouteHandler(req, res); }); diff --git a/src/routes/management/filamentskus.js b/src/routes/management/filamentskus.js index 78c4b53..89f5c6f 100644 --- a/src/routes/management/filamentskus.js +++ b/src/routes/management/filamentskus.js @@ -37,6 +37,7 @@ import { editFilamentSkuRouteHandler, newFilamentSkuRouteHandler, deleteFilamentSkuRouteHandler, + deleteFilamentSkuByFilterRouteHandler, listFilamentSkusByPropertiesRouteHandler, getFilamentSkuStatsRouteHandler, getFilamentSkuHistoryRouteHandler, @@ -140,6 +141,25 @@ router.put('/:id', isAuthenticated, checkPermissions('filamentSku', 'edit'), asy editFilamentSkuRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('filamentSku', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFilamentSkuByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFilamentSkuRouteHandler(req, res); }); diff --git a/src/routes/management/files.js b/src/routes/management/files.js index 3abd2e2..016eb80 100644 --- a/src/routes/management/files.js +++ b/src/routes/management/files.js @@ -26,6 +26,7 @@ import { newFileRouteHandler, flushFileRouteHandler, deleteFileRouteHandler, + deleteFileByFilterRouteHandler, listFilesByPropertiesRouteHandler, getFileStatsRouteHandler, getFileHistoryRouteHandler, @@ -116,6 +117,25 @@ router.put('/:id', isAuthenticated, checkPermissions('file', 'edit'), async (req editFileRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('file', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFileByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFileRouteHandler(req, res); }); diff --git a/src/routes/management/hosts.js b/src/routes/management/hosts.js index 21888b0..12f80d2 100644 --- a/src/routes/management/hosts.js +++ b/src/routes/management/hosts.js @@ -23,6 +23,7 @@ import { editHostRouteHandler, newHostRouteHandler, deleteHostRouteHandler, + deleteHostByFilterRouteHandler, listHostsByPropertiesRouteHandler, getHostStatsRouteHandler, getHostHistoryRouteHandler, @@ -100,6 +101,25 @@ router.put('/:id', isAuthenticated, checkPermissions('host', 'edit'), async (req editHostRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('host', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteHostByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteHostRouteHandler(req, res); }); diff --git a/src/routes/management/materials.js b/src/routes/management/materials.js index 43b7a3a..8b3ef0b 100644 --- a/src/routes/management/materials.js +++ b/src/routes/management/materials.js @@ -14,6 +14,8 @@ import { getMaterialRouteHandler, editMaterialRouteHandler, newMaterialRouteHandler, + deleteMaterialRouteHandler, + deleteMaterialByFilterRouteHandler, getMaterialStatsRouteHandler, getMaterialHistoryRouteHandler, searchMaterialsRouteHandler, @@ -101,4 +103,27 @@ router.put('/:id', isAuthenticated, checkPermissions('material', 'edit'), async editMaterialRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('material', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteMaterialByFilterRouteHandler(req, res, filter, masterFilter); + } +); + +router.delete('/:id', isAuthenticated, checkPermissions('material', 'delete'), async (req, res) => { + deleteMaterialRouteHandler(req, res); +}); + export default router; diff --git a/src/routes/management/notetypes.js b/src/routes/management/notetypes.js index 96fb09e..6682d34 100644 --- a/src/routes/management/notetypes.js +++ b/src/routes/management/notetypes.js @@ -22,6 +22,7 @@ import { editNoteTypeRouteHandler, newNoteTypeRouteHandler, deleteNoteTypeRouteHandler, + deleteNoteTypeByFilterRouteHandler, listNoteTypesByPropertiesRouteHandler, getNoteTypeStatsRouteHandler, getNoteTypeHistoryRouteHandler, @@ -92,6 +93,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getNoteTypeNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('noteType', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteNoteTypeByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getNoteTypeRouteHandler(req, res); }); diff --git a/src/routes/management/parts.js b/src/routes/management/parts.js index 511fa00..18584af 100644 --- a/src/routes/management/parts.js +++ b/src/routes/management/parts.js @@ -37,6 +37,7 @@ import { editPartRouteHandler, newPartRouteHandler, deletePartRouteHandler, + deletePartByFilterRouteHandler, listPartsByPropertiesRouteHandler, getPartStatsRouteHandler, getPartHistoryRouteHandler, @@ -116,6 +117,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { ); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('part', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePartByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getPartRouteHandler(req, res); }); diff --git a/src/routes/management/partskus.js b/src/routes/management/partskus.js index 61b7800..de558ff 100644 --- a/src/routes/management/partskus.js +++ b/src/routes/management/partskus.js @@ -43,6 +43,7 @@ import { editPartSkuRouteHandler, newPartSkuRouteHandler, deletePartSkuRouteHandler, + deletePartSkuByFilterRouteHandler, listPartSkusByPropertiesRouteHandler, getPartSkuStatsRouteHandler, getPartSkuHistoryRouteHandler, @@ -131,6 +132,25 @@ router.put('/:id', isAuthenticated, checkPermissions('partSku', 'edit'), async ( editPartSkuRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('partSku', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePartSkuByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePartSkuRouteHandler(req, res); }); diff --git a/src/routes/management/permissionsetting.js b/src/routes/management/permissionsetting.js index 1423f16..2dadb9d 100644 --- a/src/routes/management/permissionsetting.js +++ b/src/routes/management/permissionsetting.js @@ -14,6 +14,7 @@ import { editPermissionSettingsRouteHandler, newPermissionSettingsRouteHandler, deletePermissionSettingsRouteHandler, + deletePermissionSettingsByFilterRouteHandler, listPermissionSettingsByPropertiesRouteHandler, getPermissionSettingsStatsRouteHandler, getPermissionSettingsHistoryRouteHandler, @@ -148,6 +149,25 @@ router.put( } ); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('permissionSetting', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePermissionSettingsByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete( '/:id', isAuthenticated, diff --git a/src/routes/management/productcategories.js b/src/routes/management/productcategories.js index 3a08bb6..9fbfe5b 100644 --- a/src/routes/management/productcategories.js +++ b/src/routes/management/productcategories.js @@ -4,6 +4,7 @@ import { checkPermissions } from '../../database/permissions.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; import { deleteProductCategoryRouteHandler, + deleteProductCategoryByFilterRouteHandler, editProductCategoryRouteHandler, getProductCategoryHistoryRouteHandler, getProductCategoryRouteHandler, @@ -96,6 +97,25 @@ router.put('/:id', isAuthenticated, checkPermissions('productCategory', 'edit'), editProductCategoryRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('productCategory', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteProductCategoryByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteProductCategoryRouteHandler(req, res); }); diff --git a/src/routes/management/products.js b/src/routes/management/products.js index bee8b1a..23195d0 100644 --- a/src/routes/management/products.js +++ b/src/routes/management/products.js @@ -41,6 +41,7 @@ import { editProductRouteHandler, newProductRouteHandler, deleteProductRouteHandler, + deleteProductByFilterRouteHandler, listProductsByPropertiesRouteHandler, getProductStatsRouteHandler, getProductHistoryRouteHandler, @@ -111,6 +112,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getProductNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('product', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteProductByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, async (req, res) => { getProductRouteHandler(req, res); }); diff --git a/src/routes/management/productskus.js b/src/routes/management/productskus.js index e0d56b9..99171ac 100644 --- a/src/routes/management/productskus.js +++ b/src/routes/management/productskus.js @@ -43,6 +43,7 @@ import { editProductSkuRouteHandler, newProductSkuRouteHandler, deleteProductSkuRouteHandler, + deleteProductSkuByFilterRouteHandler, listProductSkusByPropertiesRouteHandler, getProductSkuStatsRouteHandler, getProductSkuHistoryRouteHandler, @@ -136,6 +137,25 @@ router.put('/:id', isAuthenticated, checkPermissions('productSku', 'edit'), asyn editProductSkuRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('productSku', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteProductSkuByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteProductSkuRouteHandler(req, res); }); diff --git a/src/routes/management/stockauditlevels.js b/src/routes/management/stockauditlevels.js index d42ada8..3a418ae 100644 --- a/src/routes/management/stockauditlevels.js +++ b/src/routes/management/stockauditlevels.js @@ -15,6 +15,7 @@ import { editStockAuditLevelRouteHandler, newStockAuditLevelRouteHandler, deleteStockAuditLevelRouteHandler, + deleteStockAuditLevelByFilterRouteHandler, listStockAuditLevelsByPropertiesRouteHandler, getStockAuditLevelStatsRouteHandler, getStockAuditLevelHistoryRouteHandler, @@ -124,6 +125,25 @@ router.put( } ); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('stockAuditLevel', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteStockAuditLevelByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteStockAuditLevelRouteHandler(req, res); }); diff --git a/src/routes/management/taxrates.js b/src/routes/management/taxrates.js index 294b751..b6bdd82 100644 --- a/src/routes/management/taxrates.js +++ b/src/routes/management/taxrates.js @@ -34,6 +34,7 @@ import { editTaxRateRouteHandler, newTaxRateRouteHandler, deleteTaxRateRouteHandler, + deleteTaxRateByFilterRouteHandler, listTaxRatesByPropertiesRouteHandler, getTaxRateStatsRouteHandler, getTaxRateHistoryRouteHandler, @@ -112,6 +113,25 @@ router.put('/:id', isAuthenticated, checkPermissions('taxRate', 'edit'), async ( editTaxRateRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('taxRate', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteTaxRateByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteTaxRateRouteHandler(req, res); }); diff --git a/src/routes/management/usergroups.js b/src/routes/management/usergroups.js index ddcb7d0..52a799b 100644 --- a/src/routes/management/usergroups.js +++ b/src/routes/management/usergroups.js @@ -14,6 +14,7 @@ import { editUserGroupRouteHandler, newUserGroupRouteHandler, deleteUserGroupRouteHandler, + deleteUserGroupByFilterRouteHandler, listUserGroupsByPropertiesRouteHandler, getUserGroupStatsRouteHandler, getUserGroupHistoryRouteHandler, @@ -107,6 +108,25 @@ router.put('/:id', isAuthenticated, checkPermissions('userGroup', 'edit'), async editUserGroupRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('userGroup', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteUserGroupByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteUserGroupRouteHandler(req, res); }); diff --git a/src/routes/management/vendors.js b/src/routes/management/vendors.js index 9241323..6528fc7 100644 --- a/src/routes/management/vendors.js +++ b/src/routes/management/vendors.js @@ -22,6 +22,7 @@ import { editVendorRouteHandler, newVendorRouteHandler, deleteVendorRouteHandler, + deleteVendorByFilterRouteHandler, listVendorsByPropertiesRouteHandler, getVendorStatsRouteHandler, getVendorHistoryRouteHandler, @@ -100,6 +101,25 @@ router.put('/:id', isAuthenticated, checkPermissions('vendor', 'edit'), async (r editVendorRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('vendor', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteVendorByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteVendorRouteHandler(req, res); }); diff --git a/src/routes/production/filamentprofiles.js b/src/routes/production/filamentprofiles.js index 4a95342..1e79a41 100644 --- a/src/routes/production/filamentprofiles.js +++ b/src/routes/production/filamentprofiles.js @@ -4,6 +4,7 @@ import { checkPermissions } from '../../database/permissions.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; import { deleteFilamentProfileRouteHandler, + deleteFilamentProfileByFilterRouteHandler, editFilamentProfileRouteHandler, getFilamentProfileRouteHandler, listFilamentProfilesByPropertiesRouteHandler, @@ -106,6 +107,25 @@ router.put( } ); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('filamentProfile', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFilamentProfileByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFilamentProfileRouteHandler(req, res); }); diff --git a/src/routes/production/gcodefiles.js b/src/routes/production/gcodefiles.js index 6385747..5798452 100644 --- a/src/routes/production/gcodefiles.js +++ b/src/routes/production/gcodefiles.js @@ -28,7 +28,8 @@ import { searchGCodeFilesRouteHandler, getGCodeFilePropertyValuesRouteHandler, - getGCodeFileNeighborsRouteHandler + getGCodeFileNeighborsRouteHandler, + deleteGCodeFileByFilterRouteHandler } from '../../services/production/gcodefiles.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; @@ -89,6 +90,25 @@ router.get('/neighbors', isAuthenticated, async (req, res) => { getGCodeFileNeighborsRouteHandler(req, res, property, filter, search, getSort(sortProperty, listAllowedSorters), sortOrder, id); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('gcodeFile', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteGCodeFileByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, checkPermissions('gcodeFile', 'info'), async (req, res) => { getGCodeFileRouteHandler(req, res); }); diff --git a/src/routes/production/jobs.js b/src/routes/production/jobs.js index 471a0e6..3befe13 100644 --- a/src/routes/production/jobs.js +++ b/src/routes/production/jobs.js @@ -32,6 +32,7 @@ import { getJobRouteHandler, newJobRouteHandler, deleteJobRouteHandler, + deleteJobByFilterRouteHandler, editJobRouteHandler, getJobStatsRouteHandler, getJobHistoryRouteHandler, @@ -125,6 +126,25 @@ router.put('/:id', isAuthenticated, checkPermissions('job', 'edit'), async (req, editJobRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('job', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteJobByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteJobRouteHandler(req, res); }); diff --git a/src/routes/production/printerprofiles.js b/src/routes/production/printerprofiles.js index 2a40f89..0f63957 100644 --- a/src/routes/production/printerprofiles.js +++ b/src/routes/production/printerprofiles.js @@ -4,6 +4,7 @@ import { checkPermissions } from '../../database/permissions.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; import { deletePrinterProfileRouteHandler, + deletePrinterProfileByFilterRouteHandler, editPrinterProfileRouteHandler, getPrinterProfileRouteHandler, listPrinterProfilesByPropertiesRouteHandler, @@ -86,6 +87,25 @@ router.put('/:id', isAuthenticated, checkPermissions('printerProfile', 'edit'), editPrinterProfileRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('printerProfile', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePrinterProfileByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deletePrinterProfileRouteHandler(req, res); }); diff --git a/src/routes/production/printers.js b/src/routes/production/printers.js index 048c9b3..419c3e8 100644 --- a/src/routes/production/printers.js +++ b/src/routes/production/printers.js @@ -14,6 +14,7 @@ import { searchPrintersRouteHandler, getPrinterPropertyValuesRouteHandler, getPrinterNeighborsRouteHandler, + deletePrinterByFilterRouteHandler, } from '../../services/production/printers.js'; import { convertPropertiesString, getFilter, getSort } from '../../utils.js'; @@ -93,6 +94,25 @@ router.get('/stats', isAuthenticated, async (req, res) => { getPrinterStatsRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('printer', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deletePrinterByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.get('/:id', isAuthenticated, checkPermissions('printer', 'info'), async (req, res) => { getPrinterRouteHandler(req, res); }); diff --git a/src/routes/sales/clients.js b/src/routes/sales/clients.js index 1ac7357..a113aa7 100644 --- a/src/routes/sales/clients.js +++ b/src/routes/sales/clients.js @@ -31,6 +31,7 @@ import { editClientRouteHandler, newClientRouteHandler, deleteClientRouteHandler, + deleteClientByFilterRouteHandler, listClientsByPropertiesRouteHandler, getClientStatsRouteHandler, getClientHistoryRouteHandler, @@ -109,6 +110,25 @@ router.put('/:id', isAuthenticated, checkPermissions('client', 'edit'), async (r editClientRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('client', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteClientByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteClientRouteHandler(req, res); }); diff --git a/src/routes/sales/fulfillmentpolicies.js b/src/routes/sales/fulfillmentpolicies.js index 6dcfdc1..dca7423 100644 --- a/src/routes/sales/fulfillmentpolicies.js +++ b/src/routes/sales/fulfillmentpolicies.js @@ -8,6 +8,7 @@ import { editFulfillmentPolicyRouteHandler, newFulfillmentPolicyRouteHandler, deleteFulfillmentPolicyRouteHandler, + deleteFulfillmentPolicyByFilterRouteHandler, listFulfillmentPoliciesByPropertiesRouteHandler, getFulfillmentPolicyStatsRouteHandler, getFulfillmentPolicyHistoryRouteHandler, @@ -139,6 +140,25 @@ router.put( } ); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('fulfillmentPolicy', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteFulfillmentPolicyByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteFulfillmentPolicyRouteHandler(req, res); }); diff --git a/src/routes/sales/listings.js b/src/routes/sales/listings.js index d0a67cf..73ad60d 100644 --- a/src/routes/sales/listings.js +++ b/src/routes/sales/listings.js @@ -59,6 +59,7 @@ import { editListingRouteHandler, newListingRouteHandler, deleteListingRouteHandler, + deleteListingByFilterRouteHandler, listListingsByPropertiesRouteHandler, getListingStatsRouteHandler, getListingHistoryRouteHandler, @@ -167,6 +168,25 @@ router.put('/:id', isAuthenticated, checkPermissions('listing', 'edit'), async ( editListingRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('listing', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteListingByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteListingRouteHandler(req, res); }); diff --git a/src/routes/sales/listingvarients.js b/src/routes/sales/listingvarients.js index 1114654..5141181 100644 --- a/src/routes/sales/listingvarients.js +++ b/src/routes/sales/listingvarients.js @@ -46,6 +46,7 @@ import { editListingVarientRouteHandler, newListingVarientRouteHandler, deleteListingVarientRouteHandler, + deleteListingVarientByFilterRouteHandler, listListingVarientsByPropertiesRouteHandler, getListingVarientStatsRouteHandler, getListingVarientHistoryRouteHandler, @@ -184,6 +185,27 @@ router.put( } ); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('listingVarient', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true, + listingVarientModel + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true, + listingVarientModel + ); + deleteListingVarientByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteListingVarientRouteHandler(req, res); }); diff --git a/src/routes/sales/marketplaces.js b/src/routes/sales/marketplaces.js index 907e63e..57a3006 100644 --- a/src/routes/sales/marketplaces.js +++ b/src/routes/sales/marketplaces.js @@ -41,6 +41,7 @@ import { editMarketplaceRouteHandler, newMarketplaceRouteHandler, deleteMarketplaceRouteHandler, + deleteMarketplaceByFilterRouteHandler, listMarketplacesByPropertiesRouteHandler, getMarketplaceStatsRouteHandler, getMarketplaceHistoryRouteHandler, @@ -295,6 +296,25 @@ router.put('/:id', isAuthenticated, checkPermissions('marketplace', 'edit'), asy editMarketplaceRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('marketplace', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteMarketplaceByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteMarketplaceRouteHandler(req, res); }); diff --git a/src/routes/sales/returnpolicies.js b/src/routes/sales/returnpolicies.js index 3e70d30..14dffaf 100644 --- a/src/routes/sales/returnpolicies.js +++ b/src/routes/sales/returnpolicies.js @@ -8,6 +8,7 @@ import { editReturnPolicyRouteHandler, newReturnPolicyRouteHandler, deleteReturnPolicyRouteHandler, + deleteReturnPolicyByFilterRouteHandler, listReturnPoliciesByPropertiesRouteHandler, getReturnPolicyStatsRouteHandler, getReturnPolicyHistoryRouteHandler, @@ -137,6 +138,25 @@ router.put('/:id', isAuthenticated, checkPermissions('returnPolicy', 'edit'), as editReturnPolicyRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('returnPolicy', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteReturnPolicyByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteReturnPolicyRouteHandler(req, res); }); diff --git a/src/routes/sales/salesorders.js b/src/routes/sales/salesorders.js index 6fdbd2a..04ffce3 100644 --- a/src/routes/sales/salesorders.js +++ b/src/routes/sales/salesorders.js @@ -23,6 +23,7 @@ import { editMultipleSalesOrdersRouteHandler, newSalesOrderRouteHandler, deleteSalesOrderRouteHandler, + deleteSalesOrderByFilterRouteHandler, listSalesOrdersByPropertiesRouteHandler, getSalesOrderStatsRouteHandler, getSalesOrderHistoryRouteHandler, @@ -107,6 +108,25 @@ router.put('/:id', isAuthenticated, checkPermissions('salesOrder', 'edit'), asyn editSalesOrderRouteHandler(req, res); }); +router.delete( + '/delete', + isAuthenticated, + checkPermissions('salesOrder', 'delete'), + async (req, res) => { + const filter = await getFilter( + req.query.filter ? JSON.parse(req.query.filter) : {}, + listAllowedFilters, + true + ); + const masterFilter = await getFilter( + req.query.masterFilter ? JSON.parse(req.query.masterFilter) : {}, + listAllowedFilters, + true + ); + deleteSalesOrderByFilterRouteHandler(req, res, filter, masterFilter); + } +); + router.delete('/:id', isAuthenticated, async (req, res) => { deleteSalesOrderRouteHandler(req, res); }); diff --git a/src/services/finance/__tests__/invoices.test.js b/src/services/finance/__tests__/invoices.test.js index 2c00fcd..0bcebd3 100644 --- a/src/services/finance/__tests__/invoices.test.js +++ b/src/services/finance/__tests__/invoices.test.js @@ -10,6 +10,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/finance/__tests__/payments.test.js b/src/services/finance/__tests__/payments.test.js index a2041fb..328d338 100644 --- a/src/services/finance/__tests__/payments.test.js +++ b/src/services/finance/__tests__/payments.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/finance/__tests__/taxrecords.test.js b/src/services/finance/__tests__/taxrecords.test.js index e3dff06..a2aab39 100644 --- a/src/services/finance/__tests__/taxrecords.test.js +++ b/src/services/finance/__tests__/taxrecords.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/finance/invoices.js b/src/services/finance/invoices.js index 0ba7f40..64f5240 100644 --- a/src/services/finance/invoices.js +++ b/src/services/finance/invoices.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -322,6 +323,26 @@ export const newInvoiceRouteHandler = async (req, res) => { res.send(result); }; +export const deleteInvoiceByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: invoiceModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Invoice:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteInvoiceRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/finance/paymentpolicies.js b/src/services/finance/paymentpolicies.js index d2d7df7..d02b38e 100644 --- a/src/services/finance/paymentpolicies.js +++ b/src/services/finance/paymentpolicies.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -171,6 +172,26 @@ export const newPaymentPolicyRouteHandler = async (req, res) => { res.send(result); }; +export const deletePaymentPolicyByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: paymentPolicyModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered PaymentPolicy:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePaymentPolicyRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); const result = await deleteObject({ diff --git a/src/services/finance/payments.js b/src/services/finance/payments.js index 1cc78cd..39075a2 100644 --- a/src/services/finance/payments.js +++ b/src/services/finance/payments.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -240,6 +241,26 @@ export const newPaymentRouteHandler = async (req, res) => { res.send(result); }; +export const deletePaymentByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: paymentModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Payment:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePaymentRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/finance/taxrecords.js b/src/services/finance/taxrecords.js index c58b923..3aab039 100644 --- a/src/services/finance/taxrecords.js +++ b/src/services/finance/taxrecords.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -170,6 +171,26 @@ export const newTaxRecordRouteHandler = async (req, res) => { res.send(result); }; +export const deleteTaxRecordByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: taxRecordModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered TaxRecord:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteTaxRecordRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/__tests__/filamentstocks.test.js b/src/services/inventory/__tests__/filamentstocks.test.js index 3fdedf3..48b01f5 100644 --- a/src/services/inventory/__tests__/filamentstocks.test.js +++ b/src/services/inventory/__tests__/filamentstocks.test.js @@ -10,6 +10,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/__tests__/orderitems.test.js b/src/services/inventory/__tests__/orderitems.test.js index ae41d1d..ffe2056 100644 --- a/src/services/inventory/__tests__/orderitems.test.js +++ b/src/services/inventory/__tests__/orderitems.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/__tests__/partstocks.test.js b/src/services/inventory/__tests__/partstocks.test.js index 635144b..265f8cf 100644 --- a/src/services/inventory/__tests__/partstocks.test.js +++ b/src/services/inventory/__tests__/partstocks.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/__tests__/purchaseorders.test.js b/src/services/inventory/__tests__/purchaseorders.test.js index a3b83f2..3d8b33c 100644 --- a/src/services/inventory/__tests__/purchaseorders.test.js +++ b/src/services/inventory/__tests__/purchaseorders.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/__tests__/shipments.test.js b/src/services/inventory/__tests__/shipments.test.js index 06d3369..4fcae73 100644 --- a/src/services/inventory/__tests__/shipments.test.js +++ b/src/services/inventory/__tests__/shipments.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/__tests__/stockaudits.test.js b/src/services/inventory/__tests__/stockaudits.test.js index 9981007..db40906 100644 --- a/src/services/inventory/__tests__/stockaudits.test.js +++ b/src/services/inventory/__tests__/stockaudits.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/inventory/filamentstocks.js b/src/services/inventory/filamentstocks.js index 06593f4..12dc0c1 100644 --- a/src/services/inventory/filamentstocks.js +++ b/src/services/inventory/filamentstocks.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -229,6 +230,27 @@ export const newFilamentStockRouteHandler = async (req, res) => { res.send(result); }; +export const deleteFilamentStockByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: filamentStockModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + states: ['draft'], + }); + + if (result.error) { + logger.error('Failed to delete filtered FilamentStock:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFilamentStockRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/orderitems.js b/src/services/inventory/orderitems.js index 39981cb..27f8eba 100644 --- a/src/services/inventory/orderitems.js +++ b/src/services/inventory/orderitems.js @@ -5,6 +5,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -380,6 +381,26 @@ export const newOrderItemRouteHandler = async (req, res) => { res.send(result); }; +export const deleteOrderItemByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: orderItemModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered OrderItem:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteOrderItemRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/partstocks.js b/src/services/inventory/partstocks.js index fa0e09f..c585576 100644 --- a/src/services/inventory/partstocks.js +++ b/src/services/inventory/partstocks.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -218,6 +219,27 @@ export const newPartStockRouteHandler = async (req, res) => { res.send(result); }; +export const deletePartStockByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: partStockModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + states: ['draft'], + }); + + if (result.error) { + logger.error('Failed to delete filtered PartStock:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePartStockRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/productstocks.js b/src/services/inventory/productstocks.js index 8010cfb..d085f39 100644 --- a/src/services/inventory/productstocks.js +++ b/src/services/inventory/productstocks.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -290,6 +291,27 @@ export const newProductStockRouteHandler = async (req, res) => { res.send(result); }; +export const deleteProductStockByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: productStockModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + states: ['draft'], + }); + + if (result.error) { + logger.error('Failed to delete filtered ProductStock:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteProductStockRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/purchaseorders.js b/src/services/inventory/purchaseorders.js index ff923f2..2983e55 100644 --- a/src/services/inventory/purchaseorders.js +++ b/src/services/inventory/purchaseorders.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -213,6 +214,26 @@ export const newPurchaseOrderRouteHandler = async (req, res) => { res.send(result); }; +export const deletePurchaseOrderByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: purchaseOrderModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered PurchaseOrder:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePurchaseOrderRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/shipments.js b/src/services/inventory/shipments.js index 049710d..c0afbcf 100644 --- a/src/services/inventory/shipments.js +++ b/src/services/inventory/shipments.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -219,6 +220,26 @@ export const newShipmentRouteHandler = async (req, res) => { res.send(result); }; +export const deleteShipmentByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: shipmentModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Shipment:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteShipmentRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/stockaudits.js b/src/services/inventory/stockaudits.js index b43c38c..c6fec5f 100644 --- a/src/services/inventory/stockaudits.js +++ b/src/services/inventory/stockaudits.js @@ -11,6 +11,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -445,6 +446,27 @@ export const newStockAuditRouteHandler = async (req, res) => { res.send(result); }; +export const deleteStockAuditByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: stockAuditModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + states: ['draft'], + }); + + if (result.error) { + logger.error('Failed to delete filtered StockAudit:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteStockAuditRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/stocklocations.js b/src/services/inventory/stocklocations.js index 12ccf72..174ec1a 100644 --- a/src/services/inventory/stocklocations.js +++ b/src/services/inventory/stocklocations.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -182,6 +183,26 @@ export const newStockLocationRouteHandler = async (req, res) => { res.send(result); }; +export const deleteStockLocationByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: stockLocationModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered StockLocation:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteStockLocationRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/inventory/stocktransfers.js b/src/services/inventory/stocktransfers.js index aec2962..493ca19 100644 --- a/src/services/inventory/stocktransfers.js +++ b/src/services/inventory/stocktransfers.js @@ -9,6 +9,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -432,6 +433,27 @@ export const newStockTransferRouteHandler = async (req, res) => { res.send(result); }; +export const deleteStockTransferByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: stockTransferModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + states: ['draft'], + }); + + if (result.error) { + logger.error('Failed to delete filtered StockTransfer:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteStockTransferRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/__tests__/courier.test.js b/src/services/management/__tests__/courier.test.js index 9db8ae1..0171829 100644 --- a/src/services/management/__tests__/courier.test.js +++ b/src/services/management/__tests__/courier.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/courierservice.test.js b/src/services/management/__tests__/courierservice.test.js index 946d8f8..7b8ff59 100644 --- a/src/services/management/__tests__/courierservice.test.js +++ b/src/services/management/__tests__/courierservice.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/documentprinters.test.js b/src/services/management/__tests__/documentprinters.test.js index d320da8..cf078df 100644 --- a/src/services/management/__tests__/documentprinters.test.js +++ b/src/services/management/__tests__/documentprinters.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/documentsizes.test.js b/src/services/management/__tests__/documentsizes.test.js index 4fecc78..68c6ea7 100644 --- a/src/services/management/__tests__/documentsizes.test.js +++ b/src/services/management/__tests__/documentsizes.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/documenttemplates.test.js b/src/services/management/__tests__/documenttemplates.test.js index 0984bc7..a4e475b 100644 --- a/src/services/management/__tests__/documenttemplates.test.js +++ b/src/services/management/__tests__/documenttemplates.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/emailaccounts.test.js b/src/services/management/__tests__/emailaccounts.test.js index dcdaf27..b6b5cfb 100644 --- a/src/services/management/__tests__/emailaccounts.test.js +++ b/src/services/management/__tests__/emailaccounts.test.js @@ -6,6 +6,7 @@ jest.unstable_mockModule('../../../database/schemas/management/emailaccount.sche })); jest.unstable_mockModule('../../../database/database.js', () => ({ deleteObject: jest.fn(), + deleteObjects: jest.fn(), editObject: jest.fn(), getObject: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/emailtemplates.test.js b/src/services/management/__tests__/emailtemplates.test.js index 5e24c64..3cda456 100644 --- a/src/services/management/__tests__/emailtemplates.test.js +++ b/src/services/management/__tests__/emailtemplates.test.js @@ -5,6 +5,7 @@ jest.unstable_mockModule('../../../database/schemas/management/emailtemplate.sch })); jest.unstable_mockModule('../../../database/database.js', () => ({ deleteObject: jest.fn(), + deleteObjects: jest.fn(), editObject: jest.fn(), getObject: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/filaments.test.js b/src/services/management/__tests__/filaments.test.js index 4f6ce23..4717c83 100644 --- a/src/services/management/__tests__/filaments.test.js +++ b/src/services/management/__tests__/filaments.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/files.test.js b/src/services/management/__tests__/files.test.js index 21dd55d..9231dcd 100644 --- a/src/services/management/__tests__/files.test.js +++ b/src/services/management/__tests__/files.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), flushFile: jest.fn(), getModelStats: jest.fn(), diff --git a/src/services/management/__tests__/hosts.test.js b/src/services/management/__tests__/hosts.test.js index 395f0d7..5d3cf5c 100644 --- a/src/services/management/__tests__/hosts.test.js +++ b/src/services/management/__tests__/hosts.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/materials.test.js b/src/services/management/__tests__/materials.test.js index 8ac7f88..746f6df 100644 --- a/src/services/management/__tests__/materials.test.js +++ b/src/services/management/__tests__/materials.test.js @@ -8,6 +8,8 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ getObject: jest.fn(), editObject: jest.fn(), newObject: jest.fn(), + deleteObject: jest.fn(), + deleteObjects: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), getObjectNeighbors: jest.fn(), @@ -33,9 +35,13 @@ const { listMaterialsRouteHandler, getMaterialRouteHandler, newMaterialRouteHandler, + deleteMaterialRouteHandler, + deleteMaterialByFilterRouteHandler, } = await import('../materials.js'); -const { listObjects, getObject, newObject } = await import('../../../database/database.js'); +const { listObjects, getObject, deleteObject, deleteObjects } = await import( + '../../../database/database.js' +); const { materialModel } = await import('../../../database/schemas/management/material.schema.js'); describe('Material Service Route Handlers', () => { @@ -79,5 +85,49 @@ describe('Material Service Route Handlers', () => { expect(res.send).toHaveBeenCalledWith(mockMaterial); }); }); + + describe('deleteMaterialRouteHandler', () => { + it('should delete a material by ID', async () => { + req.params.id = '507f1f77bcf86cd799439011'; + const deletedMaterial = { _id: req.params.id, name: 'PLA' }; + deleteObject.mockResolvedValue(deletedMaterial); + + await deleteMaterialRouteHandler(req, res); + + expect(deleteObject).toHaveBeenCalledWith( + expect.objectContaining({ + model: materialModel, + user: req.user, + }) + ); + expect(res.send).toHaveBeenCalledWith(deletedMaterial); + }); + }); + + describe('deleteMaterialByFilterRouteHandler', () => { + it('should delete materials matching the merged filters', async () => { + const result = { + matchedCount: 2, + deletedCount: 2, + failedCount: 0, + errors: [], + }; + deleteObjects.mockResolvedValue(result); + + await deleteMaterialByFilterRouteHandler( + req, + res, + { name: 'PLA' }, + { tags: 'stock' } + ); + + expect(deleteObjects).toHaveBeenCalledWith({ + model: materialModel, + filter: { tags: 'stock', name: 'PLA' }, + user: req.user, + }); + expect(res.send).toHaveBeenCalledWith(result); + }); + }); }); diff --git a/src/services/management/__tests__/notetypes.test.js b/src/services/management/__tests__/notetypes.test.js index cf68173..e6a2df8 100644 --- a/src/services/management/__tests__/notetypes.test.js +++ b/src/services/management/__tests__/notetypes.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/parts.test.js b/src/services/management/__tests__/parts.test.js index 9870f74..48c1018 100644 --- a/src/services/management/__tests__/parts.test.js +++ b/src/services/management/__tests__/parts.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/permissionsetting.test.js b/src/services/management/__tests__/permissionsetting.test.js index 907ea33..21d0090 100644 --- a/src/services/management/__tests__/permissionsetting.test.js +++ b/src/services/management/__tests__/permissionsetting.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/products.test.js b/src/services/management/__tests__/products.test.js index 09608d7..02d6cf2 100644 --- a/src/services/management/__tests__/products.test.js +++ b/src/services/management/__tests__/products.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/stockauditlevels.test.js b/src/services/management/__tests__/stockauditlevels.test.js index dedf72e..74a0551 100644 --- a/src/services/management/__tests__/stockauditlevels.test.js +++ b/src/services/management/__tests__/stockauditlevels.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/taxrates.test.js b/src/services/management/__tests__/taxrates.test.js index ae85760..a409ca3 100644 --- a/src/services/management/__tests__/taxrates.test.js +++ b/src/services/management/__tests__/taxrates.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/usergroups.test.js b/src/services/management/__tests__/usergroups.test.js index 3e84651..fdaa5c3 100644 --- a/src/services/management/__tests__/usergroups.test.js +++ b/src/services/management/__tests__/usergroups.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/__tests__/vendors.test.js b/src/services/management/__tests__/vendors.test.js index 13f508a..3c9cc15 100644 --- a/src/services/management/__tests__/vendors.test.js +++ b/src/services/management/__tests__/vendors.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/management/apppasswords.js b/src/services/management/apppasswords.js index cf8e9b9..fae24d6 100644 --- a/src/services/management/apppasswords.js +++ b/src/services/management/apppasswords.js @@ -11,6 +11,7 @@ import { editObject, newObject, deleteObject, + deleteObjects, getModelStats, getModelHistory, searchObjects, @@ -178,6 +179,26 @@ export const newAppPasswordRouteHandler = async (req, res) => { res.send(result); }; +export const deleteAppPasswordByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: appPasswordModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered AppPassword:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteAppPasswordRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/courier.js b/src/services/management/courier.js index 0531264..d0ad968 100644 --- a/src/services/management/courier.js +++ b/src/services/management/courier.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -171,6 +172,26 @@ export const newCourierRouteHandler = async (req, res) => { res.send(result); }; +export const deleteCourierByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: courierModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Courier:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteCourierRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/courierservice.js b/src/services/management/courierservice.js index 61dc8b6..2ae2c76 100644 --- a/src/services/management/courierservice.js +++ b/src/services/management/courierservice.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -193,6 +194,26 @@ export const newCourierServiceRouteHandler = async (req, res) => { res.send(result); }; +export const deleteCourierServiceByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: courierServiceModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered CourierService:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteCourierServiceRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/documentprinters.js b/src/services/management/documentprinters.js index 7fe5509..e40f1ab 100644 --- a/src/services/management/documentprinters.js +++ b/src/services/management/documentprinters.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -182,6 +183,26 @@ export const newDocumentPrinterRouteHandler = async (req, res) => { res.send(result); }; +export const deleteDocumentPrinterByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: documentPrinterModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered DocumentPrinter:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteDocumentPrinterRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/documentsizes.js b/src/services/management/documentsizes.js index d0bda34..101eb56 100644 --- a/src/services/management/documentsizes.js +++ b/src/services/management/documentsizes.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -176,6 +177,26 @@ export const newDocumentSizeRouteHandler = async (req, res) => { res.send(result); }; +export const deleteDocumentSizeByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: documentSizeModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered DocumentSize:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteDocumentSizeRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/documenttemplates.js b/src/services/management/documenttemplates.js index 0dd30da..5aef997 100644 --- a/src/services/management/documenttemplates.js +++ b/src/services/management/documenttemplates.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -239,6 +240,26 @@ export const newDocumentTemplateRouteHandler = async (req, res) => { res.send(result); }; +export const deleteDocumentTemplateByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: documentTemplateModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered DocumentTemplate:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteDocumentTemplateRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/emailaccounts.js b/src/services/management/emailaccounts.js index 667c639..a3034ce 100644 --- a/src/services/management/emailaccounts.js +++ b/src/services/management/emailaccounts.js @@ -9,6 +9,7 @@ import { editObject, newObject, deleteObject, + deleteObjects, getModelStats, getModelHistory, searchObjects, @@ -182,6 +183,27 @@ export const newEmailAccountRouteHandler = async (req, res) => { res.send(result); }; +export const deleteEmailAccountByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: emailAccountModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + checkUnused: true, + }); + + if (result.error) { + logger.error('Failed to delete filtered EmailAccount:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteEmailAccountRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/emailtemplates.js b/src/services/management/emailtemplates.js index ddbc262..b0c056d 100644 --- a/src/services/management/emailtemplates.js +++ b/src/services/management/emailtemplates.js @@ -9,6 +9,7 @@ import { editObject, newObject, deleteObject, + deleteObjects, getModelStats, getModelHistory, searchObjects, @@ -222,6 +223,27 @@ export const newEmailTemplateRouteHandler = async (req, res) => { res.send(result); }; +export const deleteEmailTemplateByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: emailTemplateModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + checkUnused: true, + }); + + if (result.error) { + logger.error('Failed to delete filtered EmailTemplate:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteEmailTemplateRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/filaments.js b/src/services/management/filaments.js index 0d95e48..aeb8b73 100644 --- a/src/services/management/filaments.js +++ b/src/services/management/filaments.js @@ -10,6 +10,7 @@ import { editObjects, newObject, deleteObject, + deleteObjects, getModelStats, getModelHistory, searchObjects, @@ -227,6 +228,27 @@ export const newFilamentRouteHandler = async (req, res) => { res.send(result); }; +export const deleteFilamentByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: filamentModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + checkUnused: true, + }); + + if (result.error) { + logger.error('Failed to delete filtered Filament:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFilamentRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/filamentskus.js b/src/services/management/filamentskus.js index eaf9b24..0bfa496 100644 --- a/src/services/management/filamentskus.js +++ b/src/services/management/filamentskus.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -181,6 +182,26 @@ export const newFilamentSkuRouteHandler = async (req, res) => { res.send(result); }; +export const deleteFilamentSkuByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: filamentSkuModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered FilamentSku:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFilamentSkuRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/files.js b/src/services/management/files.js index 782307f..7ba5e1a 100644 --- a/src/services/management/files.js +++ b/src/services/management/files.js @@ -7,6 +7,7 @@ import fs from 'fs'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -260,6 +261,38 @@ export const newFileRouteHandler = async (req, res) => { } }; +export const deleteFileByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const mergedFilter = { ...masterFilter, ...filter }; + const files = await fileModel.find(mergedFilter); + + for (const file of files) { + if (!file.cephBucket || !file.cephKey) continue; + try { + await deleteCephFile(file.cephBucket, file.cephKey); + } catch (error) { + logger.warn(`Failed to delete file from Ceph: ${error.message}`); + } + } + + const result = await deleteObjects({ + model: fileModel, + filter: mergedFilter, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered File:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFileRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/hosts.js b/src/services/management/hosts.js index 4b378a8..0ab1533 100644 --- a/src/services/management/hosts.js +++ b/src/services/management/hosts.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -167,6 +168,26 @@ export const newHostRouteHandler = async (req, res) => { res.send(result); }; +export const deleteHostByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: hostModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Host:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteHostRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/materials.js b/src/services/management/materials.js index 85f6729..88d6c0d 100644 --- a/src/services/management/materials.js +++ b/src/services/management/materials.js @@ -8,6 +8,8 @@ import { listObjectsByProperties, editObject, newObject, + deleteObject, + deleteObjects, getModelStats, getModelHistory, searchObjects, @@ -166,6 +168,43 @@ export const newMaterialRouteHandler = async (req, res) => { res.send(result); }; +export const deleteMaterialByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: materialModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Material:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + +export const deleteMaterialRouteHandler = async (req, res) => { + const id = new mongoose.Types.ObjectId(req.params.id); + const result = await deleteObject({ + model: materialModel, + id, + user: req.user, + }); + + if (result.error) { + logger.error('No material deleted:', result.error); + return res.status(result.code).send(result); + } + + logger.debug(`Deleted material with ID: ${result._id}`); + res.send(result); +}; + export const getMaterialStatsRouteHandler = async (req, res) => { const result = await getModelStats({ model: materialModel }); if (result?.error) { diff --git a/src/services/management/notetypes.js b/src/services/management/notetypes.js index f59ba4f..f874c85 100644 --- a/src/services/management/notetypes.js +++ b/src/services/management/notetypes.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -164,6 +165,26 @@ export const newNoteTypeRouteHandler = async (req, res) => { res.send(result); }; +export const deleteNoteTypeByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: noteTypeModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered NoteType:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteNoteTypeRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/parts.js b/src/services/management/parts.js index 429c97b..33778a0 100644 --- a/src/services/management/parts.js +++ b/src/services/management/parts.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -183,6 +184,26 @@ export const newPartRouteHandler = async (req, res) => { res.send(result); }; +export const deletePartByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: partModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Part:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePartRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/partskus.js b/src/services/management/partskus.js index 30ac0e4..2b95383 100644 --- a/src/services/management/partskus.js +++ b/src/services/management/partskus.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -199,6 +200,26 @@ export const newPartSkuRouteHandler = async (req, res) => { res.send(result); }; +export const deletePartSkuByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: partSkuModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered PartSku:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePartSkuRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/permissionsetting.js b/src/services/management/permissionsetting.js index 524d6f4..9583cd1 100644 --- a/src/services/management/permissionsetting.js +++ b/src/services/management/permissionsetting.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -163,6 +164,26 @@ export const newPermissionSettingsRouteHandler = async (req, res) => { res.send(result); }; +export const deletePermissionSettingsByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: permissionSettingModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered PermissionSettings:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePermissionSettingsRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/productcategories.js b/src/services/management/productcategories.js index 6eb68be..f638211 100644 --- a/src/services/management/productcategories.js +++ b/src/services/management/productcategories.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, editObject, getModelHistory, getModelStats, @@ -169,6 +170,26 @@ export const newProductCategoryRouteHandler = async (req, res) => { res.send(result); }; +export const deleteProductCategoryByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: productCategoryModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered ProductCategory:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteProductCategoryRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/products.js b/src/services/management/products.js index d574bc1..d0549c1 100644 --- a/src/services/management/products.js +++ b/src/services/management/products.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -189,6 +190,26 @@ export const newProductRouteHandler = async (req, res) => { res.send(result); }; +export const deleteProductByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: productModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Product:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteProductRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/productskus.js b/src/services/management/productskus.js index 7c0d3cc..3c20cfd 100644 --- a/src/services/management/productskus.js +++ b/src/services/management/productskus.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -204,6 +205,26 @@ export const newProductSkuRouteHandler = async (req, res) => { res.send(result); }; +export const deleteProductSkuByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: productSkuModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered ProductSku:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteProductSkuRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/stockauditlevels.js b/src/services/management/stockauditlevels.js index 42e4d30..564828f 100644 --- a/src/services/management/stockauditlevels.js +++ b/src/services/management/stockauditlevels.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -169,6 +170,26 @@ export const newStockAuditLevelRouteHandler = async (req, res) => { res.send(result); }; +export const deleteStockAuditLevelByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: stockAuditLevelModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered StockAuditLevel:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteStockAuditLevelRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/taxrates.js b/src/services/management/taxrates.js index 1257392..fa1af0e 100644 --- a/src/services/management/taxrates.js +++ b/src/services/management/taxrates.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -196,6 +197,26 @@ export const newTaxRateRouteHandler = async (req, res) => { res.send(result); }; +export const deleteTaxRateByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: taxRateModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered TaxRate:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteTaxRateRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/usergroups.js b/src/services/management/usergroups.js index dd63a92..a943f17 100644 --- a/src/services/management/usergroups.js +++ b/src/services/management/usergroups.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -172,6 +173,26 @@ export const newUserGroupRouteHandler = async (req, res) => { res.send(result); }; +export const deleteUserGroupByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: userGroupModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered UserGroup:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteUserGroupRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/management/vendors.js b/src/services/management/vendors.js index cf3ed3c..77249ef 100644 --- a/src/services/management/vendors.js +++ b/src/services/management/vendors.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -174,6 +175,26 @@ export const newVendorRouteHandler = async (req, res) => { res.send(result); }; +export const deleteVendorByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: vendorModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Vendor:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteVendorRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/production/__tests__/filamentprofiles.test.js b/src/services/production/__tests__/filamentprofiles.test.js index 0d1a6e8..d996186 100644 --- a/src/services/production/__tests__/filamentprofiles.test.js +++ b/src/services/production/__tests__/filamentprofiles.test.js @@ -2,6 +2,7 @@ import { jest } from '@jest/globals'; jest.unstable_mockModule('../../../database/database.js', () => ({ deleteObject: jest.fn(), + deleteObjects: jest.fn(), editObject: jest.fn(), getObject: jest.fn(), listObjects: jest.fn(), diff --git a/src/services/production/__tests__/gcodefiles.test.js b/src/services/production/__tests__/gcodefiles.test.js index bc6d290..76e2375 100644 --- a/src/services/production/__tests__/gcodefiles.test.js +++ b/src/services/production/__tests__/gcodefiles.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getObjectNeighbors: jest.fn(), })); diff --git a/src/services/production/__tests__/jobs.test.js b/src/services/production/__tests__/jobs.test.js index 156cdb2..98cb5e7 100644 --- a/src/services/production/__tests__/jobs.test.js +++ b/src/services/production/__tests__/jobs.test.js @@ -9,6 +9,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ newObject: jest.fn(), editObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/production/__tests__/printerprofiles.test.js b/src/services/production/__tests__/printerprofiles.test.js index b73e566..23d5865 100644 --- a/src/services/production/__tests__/printerprofiles.test.js +++ b/src/services/production/__tests__/printerprofiles.test.js @@ -2,6 +2,7 @@ import { jest } from '@jest/globals'; jest.unstable_mockModule('../../../database/database.js', () => ({ deleteObject: jest.fn(), + deleteObjects: jest.fn(), editObject: jest.fn(), getObject: jest.fn(), listObjects: jest.fn(), diff --git a/src/services/production/__tests__/printers.test.js b/src/services/production/__tests__/printers.test.js index 9df5429..b816035 100644 --- a/src/services/production/__tests__/printers.test.js +++ b/src/services/production/__tests__/printers.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/production/filamentprofiles.js b/src/services/production/filamentprofiles.js index 6f8d109..67496d1 100644 --- a/src/services/production/filamentprofiles.js +++ b/src/services/production/filamentprofiles.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, editObject, getObject, listObjects, @@ -306,6 +307,26 @@ export const newFilamentProfileRouteHandler = async (req, res) => { res.send(result); }; +export const deleteFilamentProfileByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: filamentProfileModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered FilamentProfile:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFilamentProfileRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); const result = await deleteObject({ diff --git a/src/services/production/gcodefiles.js b/src/services/production/gcodefiles.js index dc770e8..94c6964 100644 --- a/src/services/production/gcodefiles.js +++ b/src/services/production/gcodefiles.js @@ -3,6 +3,7 @@ import { gcodeFileModel } from '../../database/schemas/production/gcodefile.sche import log4js from 'log4js'; import { deleteObject, + deleteObjects, editObject, getObject, listObjects, @@ -189,6 +190,26 @@ export const newGCodeFileRouteHandler = async (req, res) => { res.send(result); }; +export const deleteGCodeFileByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: gcodeFileModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered GCodeFile:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteGCodeFileRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/production/jobs.js b/src/services/production/jobs.js index ccd2154..beb2067 100644 --- a/src/services/production/jobs.js +++ b/src/services/production/jobs.js @@ -4,6 +4,7 @@ import { jobModel } from '../../database/schemas/production/job.schema.js'; import log4js from 'log4js'; import { deleteObject, + deleteObjects, getObject, listObjects, listObjectsByProperties, @@ -183,6 +184,26 @@ export const editJobRouteHandler = async (req, res) => { res.send(result); }; +export const deleteJobByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: jobModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Job:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteJobRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/production/printerprofiles.js b/src/services/production/printerprofiles.js index 9447835..5836725 100644 --- a/src/services/production/printerprofiles.js +++ b/src/services/production/printerprofiles.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, editObject, getObject, listObjects, @@ -194,6 +195,26 @@ export const newPrinterProfileRouteHandler = async (req, res) => { res.send(result); }; +export const deletePrinterProfileByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: printerProfileModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered PrinterProfile:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePrinterProfileRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); const result = await deleteObject({ diff --git a/src/services/production/printers.js b/src/services/production/printers.js index 4f22ec8..47c9ee0 100644 --- a/src/services/production/printers.js +++ b/src/services/production/printers.js @@ -3,6 +3,7 @@ import { printerModel } from '../../database/schemas/production/printer.schema.j import log4js from 'log4js'; import { deleteObject, + deleteObjects, editObject, getObject, listObjects, @@ -183,6 +184,26 @@ export const newPrinterRouteHandler = async (req, res) => { res.send(result); }; +export const deletePrinterByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: printerModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Printer:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deletePrinterRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/sales/__tests__/clients.test.js b/src/services/sales/__tests__/clients.test.js index ab6e178..d9d8981 100644 --- a/src/services/sales/__tests__/clients.test.js +++ b/src/services/sales/__tests__/clients.test.js @@ -8,6 +8,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObject: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/sales/__tests__/listings.test.js b/src/services/sales/__tests__/listings.test.js index e568635..88dcda3 100644 --- a/src/services/sales/__tests__/listings.test.js +++ b/src/services/sales/__tests__/listings.test.js @@ -12,6 +12,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/sales/__tests__/salesorders.test.js b/src/services/sales/__tests__/salesorders.test.js index 94c3863..81b9a67 100644 --- a/src/services/sales/__tests__/salesorders.test.js +++ b/src/services/sales/__tests__/salesorders.test.js @@ -10,6 +10,7 @@ jest.unstable_mockModule('../../../database/database.js', () => ({ editObjects: jest.fn(), newObject: jest.fn(), deleteObject: jest.fn(), + deleteObjects: jest.fn(), listObjectsByProperties: jest.fn(), getModelStats: jest.fn(), getModelHistory: jest.fn(), diff --git a/src/services/sales/clients.js b/src/services/sales/clients.js index af742ab..08a2d4b 100644 --- a/src/services/sales/clients.js +++ b/src/services/sales/clients.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -174,6 +175,26 @@ export const newClientRouteHandler = async (req, res) => { res.send(result); }; +export const deleteClientByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: clientModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Client:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteClientRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/sales/fulfillmentpolicies.js b/src/services/sales/fulfillmentpolicies.js index e36586f..e4892fb 100644 --- a/src/services/sales/fulfillmentpolicies.js +++ b/src/services/sales/fulfillmentpolicies.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -177,6 +178,26 @@ export const newFulfillmentPolicyRouteHandler = async (req, res) => { res.send(result); }; +export const deleteFulfillmentPolicyByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: fulfillmentPolicyModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered FulfillmentPolicy:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteFulfillmentPolicyRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); const result = await deleteObject({ diff --git a/src/services/sales/listings.js b/src/services/sales/listings.js index 1079c0c..4774822 100644 --- a/src/services/sales/listings.js +++ b/src/services/sales/listings.js @@ -6,6 +6,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -274,6 +275,58 @@ export const newListingRouteHandler = async (req, res) => { res.send(result); }; +export const deleteListingByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const mergedFilter = { ...masterFilter, ...filter }; + const listings = await listingModel.find(mergedFilter); + + for (const listing of listings) { + const varients = await listingVarientModel.find({ + listing: listing._id, + }); + for (const varient of varients) { + const deleteResult = await deleteObject({ + model: listingVarientModel, + id: varient._id, + user: req.user, + }); + if (deleteResult?.error) { + logger.warn( + `Failed to delete listing varient ${varient._id}: ${deleteResult.error}` + ); + } + } + } + + const result = await deleteObjects({ + model: listingModel, + filter: mergedFilter, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Listing:', result.error); + return res.status(result.code || 500).send(result); + } + + const failedIds = new Set(result.errors.map((error) => String(error.id))); + for (const listing of listings) { + if (failedIds.has(String(listing._id))) continue; + const marketplaceId = listing.marketplace?._id || listing.marketplace; + if (marketplaceId) { + pushToMarketplace(marketplaceId, listing, req.user, { + isDelete: true, + }); + } + } + + res.send(result); +}; + export const deleteListingRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/sales/listingvarients.js b/src/services/sales/listingvarients.js index fda69dc..c5f0038 100644 --- a/src/services/sales/listingvarients.js +++ b/src/services/sales/listingvarients.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -236,6 +237,26 @@ export const newListingVarientRouteHandler = async (req, res) => { res.send(result); }; +export const deleteListingVarientByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: listingVarientModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered ListingVarient:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteListingVarientRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/sales/marketplaces.js b/src/services/sales/marketplaces.js index 4ad39a1..1838ae7 100644 --- a/src/services/sales/marketplaces.js +++ b/src/services/sales/marketplaces.js @@ -5,6 +5,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -183,6 +184,26 @@ export const newMarketplaceRouteHandler = async (req, res) => { res.send(result); }; +export const deleteMarketplaceByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: marketplaceModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered Marketplace:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteMarketplaceRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); diff --git a/src/services/sales/returnpolicies.js b/src/services/sales/returnpolicies.js index ccc6171..0183256 100644 --- a/src/services/sales/returnpolicies.js +++ b/src/services/sales/returnpolicies.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -178,6 +179,26 @@ export const newReturnPolicyRouteHandler = async (req, res) => { res.send(result); }; +export const deleteReturnPolicyByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: returnPolicyModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered ReturnPolicy:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteReturnPolicyRouteHandler = async (req, res) => { const id = new mongoose.Types.ObjectId(req.params.id); const result = await deleteObject({ diff --git a/src/services/sales/salesorders.js b/src/services/sales/salesorders.js index 8a3e2bf..eb7adb4 100644 --- a/src/services/sales/salesorders.js +++ b/src/services/sales/salesorders.js @@ -4,6 +4,7 @@ import log4js from 'log4js'; import mongoose from 'mongoose'; import { deleteObject, + deleteObjects, listObjects, getObject, editObject, @@ -216,6 +217,26 @@ export const newSalesOrderRouteHandler = async (req, res) => { res.send(result); }; +export const deleteSalesOrderByFilterRouteHandler = async ( + req, + res, + filter = {}, + masterFilter = {} +) => { + const result = await deleteObjects({ + model: salesOrderModel, + filter: { ...masterFilter, ...filter }, + user: req.user, + }); + + if (result.error) { + logger.error('Failed to delete filtered SalesOrder:', result.error); + return res.status(result.code || 500).send(result); + } + + res.send(result); +}; + export const deleteSalesOrderRouteHandler = async (req, res) => { // Get ID from params const id = new mongoose.Types.ObjectId(req.params.id);