Tom Butcher c679066504
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good
Add bulk delete functionality for various entities with filter support
This commit introduces a new `deleteObjects` function in the database module, allowing for bulk deletion of objects based on specified filters and states. Additionally, new route handlers for deleting invoices, payment policies, payments, tax records, filament stocks, order items, part stocks, product stocks, purchase orders, shipments, stock audits, stock locations, stock transfers, app passwords, couriers, courier services, document printers, document sizes, document templates, email accounts, email templates, filaments, filament SKUs, files, hosts, materials, note types, parts, part SKUs, permission settings, product categories, products, and vendor entities are added. Each route supports deletion based on filters, enhancing the application's data management capabilities.
2026-09-13 17:12:59 +01:00

272 lines
6.0 KiB
JavaScript

import config from '../../config.js';
import { vendorModel } from '../../database/schemas/management/vendor.schema.js';
import log4js from 'log4js';
import mongoose from 'mongoose';
import {
deleteObject,
deleteObjects,
listObjects,
getObject,
editObject,
newObject,
listObjectsByProperties,
getModelStats,
getModelHistory,
searchObjects,
getPropertyValues,
getObjectNeighbors,
} from '../../database/database.js';
const logger = log4js.getLogger('Vendors');
logger.level = config.server.logLevel;
export const listVendorsRouteHandler = async (
req,
res,
page = 1,
limit = 25,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend'
) => {
const result = await listObjects({
model: vendorModel,
page,
limit,
property,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error listing vendors.');
res.status(result.code).send(result);
return;
}
logger.debug(`List of vendors (Page ${page}, Limit ${limit}). Count: ${result.length}.`);
res.send(result);
};
export const listVendorsByPropertiesRouteHandler = async (
req,
res,
properties = '',
filter = {},
masterFilter = {}
) => {
const result = await listObjectsByProperties({
model: vendorModel,
properties,
filter,
masterFilter,
});
if (result?.error) {
logger.error('Error listing vendors.');
res.status(result.code).send(result);
return;
}
logger.debug(`List of vendors. Count: ${result.length}`);
res.send(result);
};
export const getVendorPropertyValuesRouteHandler = async (
req,
res,
property,
filter,
masterFilter
) => {
const result = await getPropertyValues({
model: vendorModel,
property,
filter: { ...filter, ...masterFilter },
});
res.send(result);
};
export const searchVendorsRouteHandler = async (req, res, search) => {
const result = await searchObjects({
model: vendorModel,
search,
});
res.send(result);
};
export const getVendorRouteHandler = async (req, res) => {
const id = req.params.id;
const result = await getObject({
model: vendorModel,
id,
});
if (result?.error) {
logger.warn(`Vendor not found with supplied id.`);
return res.status(result.code).send(result);
}
logger.debug(`Retreived vendor with ID: ${id}`);
res.send(result);
};
export const editVendorRouteHandler = async (req, res) => {
// Get ID from params
const id = new mongoose.Types.ObjectId(req.params.id);
logger.trace(`Vendor with ID: ${id}`);
const updateData = {
updatedAt: new Date(),
contact: req.body.contact,
country: req.body.country,
name: req.body.name,
website: req.body.website,
phone: req.body.phone,
email: req.body.email,
address: req.body.address,
active: req.body.active,
};
// Create audit log before updating
const result = await editObject({
model: vendorModel,
id,
updateData,
user: req.user,
});
if (result.error) {
logger.error('Error editing vendor:', result.error);
res.status(result).send(result);
return;
}
logger.debug(`Edited vendor with ID: ${id}`);
res.send(result);
};
export const newVendorRouteHandler = async (req, res) => {
const newData = {
updatedAt: new Date(),
contact: req.body.contact,
country: req.body.country,
name: req.body.name,
website: req.body.website,
phone: req.body.phone,
email: req.body.email,
address: req.body.address,
active: req.body.active,
};
const result = await newObject({
model: vendorModel,
newData,
user: req.user,
});
if (result.error) {
logger.error('No vendor created:', result.error);
return res.status(result.code).send(result);
}
logger.debug(`New vendor with ID: ${result._id}`);
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);
logger.trace(`Vendor with ID: ${id}`);
const result = await deleteObject({
model: vendorModel,
id,
user: req.user,
});
if (result.error) {
logger.error('No vendor deleted:', result.error);
return res.status(result.code).send(result);
}
logger.debug(`Deleted vendor with ID: ${result._id}`);
res.send(result);
};
export const getVendorStatsRouteHandler = async (req, res) => {
const result = await getModelStats({ model: vendorModel });
if (result?.error) {
logger.error('Error fetching vendor stats:', result.error);
return res.status(result.code).send(result);
}
logger.trace('Vendor stats:', result);
res.send(result);
};
export const getVendorHistoryRouteHandler = async (req, res) => {
const from = req.query.from;
const to = req.query.to;
const result = await getModelHistory({ model: vendorModel, from, to });
if (result?.error) {
logger.error('Error fetching vendor history:', result.error);
return res.status(result.code).send(result);
}
logger.trace('Vendor history:', result);
res.send(result);
};
export const getVendorNeighborsRouteHandler = async (
req,
res,
property = '',
filter = {},
search = '',
sort = '',
order = 'ascend',
id
) => {
if (!id) {
return res.status(400).send({ error: 'Missing id parameter', code: 400 });
}
const result = await getObjectNeighbors({
model: vendorModel,
id,
filter,
search,
sort,
order,
});
if (result?.error) {
logger.error('Error fetching vendor neighbors.');
return res.status(result.code).send(result);
}
logger.debug(`Retrieved vendor neighbors for ID: ${id}`);
res.send(result);
};