150 lines
4.5 KiB
JavaScript
150 lines
4.5 KiB
JavaScript
import config from '../../config.js';
|
|
import { materialModel } from '../../database/schemas/management/material.schema.js';
|
|
import log4js from 'log4js';
|
|
import mongoose from 'mongoose';
|
|
import { getModelStats, getModelHistory } from '../../database/database.js';
|
|
const logger = log4js.getLogger('Materials');
|
|
logger.level = config.server.logLevel;
|
|
|
|
export const listMaterialsRouteHandler = async (
|
|
req,
|
|
res,
|
|
page = 1,
|
|
limit = 25,
|
|
property = '',
|
|
filter = {}
|
|
) => {
|
|
try {
|
|
// Calculate the skip value based on the page number and limit
|
|
const skip = (page - 1) * limit;
|
|
|
|
let material;
|
|
let aggregateCommand = [];
|
|
|
|
if (filter != {}) {
|
|
// use filtering if present
|
|
aggregateCommand.push({ $match: filter });
|
|
}
|
|
|
|
if (property != '') {
|
|
aggregateCommand.push({ $group: { _id: `$${property}` } }); // group all same properties
|
|
aggregateCommand.push({ $project: { _id: 0, [property]: '$_id' } }); // rename _id to the property name
|
|
} else {
|
|
aggregateCommand.push({ $project: { image: 0, url: 0 } });
|
|
}
|
|
|
|
aggregateCommand.push({ $skip: skip });
|
|
aggregateCommand.push({ $limit: Number(limit) });
|
|
|
|
material = await materialModel.aggregate(aggregateCommand);
|
|
|
|
logger.trace(
|
|
`List of materials (Page ${page}, Limit ${limit}, Property ${property}):`,
|
|
material
|
|
);
|
|
res.send(material);
|
|
} catch (error) {
|
|
logger.error('Error listing materials:', error);
|
|
res.status(500).send({ error: error });
|
|
}
|
|
};
|
|
|
|
export const getMaterialRouteHandler = async (req, res) => {
|
|
try {
|
|
// Get ID from params
|
|
const id = new mongoose.Types.ObjectId(req.params.id);
|
|
// Fetch the material with the given remote address
|
|
const material = await materialModel.findOne({
|
|
_id: id,
|
|
});
|
|
|
|
if (!material) {
|
|
logger.warn(`Material not found with supplied id.`);
|
|
return res.status(404).send({ error: 'Print job not found.' });
|
|
}
|
|
|
|
logger.trace(`Material with ID: ${id}:`, material);
|
|
res.send(material);
|
|
} catch (error) {
|
|
logger.error('Error fetching Material:', error);
|
|
res.status(500).send({ error: error.message });
|
|
}
|
|
};
|
|
|
|
export const editMaterialRouteHandler = async (req, res) => {
|
|
try {
|
|
// Get ID from params
|
|
const id = new mongoose.Types.ObjectId(req.params.id);
|
|
// Fetch the material with the given remote address
|
|
const material = await materialModel.findOne({ _id: id });
|
|
|
|
if (!material) {
|
|
// Error handling
|
|
logger.warn(`Material not found with supplied id.`);
|
|
return res.status(404).send({ error: 'Print job not found.' });
|
|
}
|
|
|
|
logger.trace(`Material with ID: ${id}:`, material);
|
|
|
|
try {
|
|
const updateData = req.body;
|
|
|
|
const result = await materialModel.updateOne({ _id: id }, { $set: updateData });
|
|
if (result.nModified === 0) {
|
|
logger.error('No Material updated.');
|
|
res.status(500).send({ error: 'No materials updated.' });
|
|
}
|
|
} catch (updateError) {
|
|
logger.error('Error updating material:', updateError);
|
|
res.status(500).send({ error: updateError.message });
|
|
}
|
|
res.send('OK');
|
|
} catch (fetchError) {
|
|
logger.error('Error fetching material:', fetchError);
|
|
res.status(500).send({ error: fetchError.message });
|
|
}
|
|
};
|
|
|
|
export const newMaterialRouteHandler = async (req, res) => {
|
|
try {
|
|
let { ...newMaterial } = req.body;
|
|
newMaterial = {
|
|
...newMaterial,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
};
|
|
|
|
const result = await materialModel.create(newMaterial);
|
|
if (result.nCreated === 0) {
|
|
logger.error('No material created.');
|
|
res.status(500).send({ error: 'No material created.' });
|
|
}
|
|
res.status(200).send({ status: 'ok' });
|
|
} catch (updateError) {
|
|
logger.error('Error updating material:', updateError);
|
|
res.status(500).send({ error: updateError.message });
|
|
}
|
|
};
|
|
|
|
export const getMaterialStatsRouteHandler = async (req, res) => {
|
|
const result = await getModelStats({ model: materialModel });
|
|
if (result?.error) {
|
|
logger.error('Error fetching material stats:', result.error);
|
|
return res.status(result.code).send(result);
|
|
}
|
|
logger.trace('Material stats:', result);
|
|
res.send(result);
|
|
};
|
|
|
|
export const getMaterialHistoryRouteHandler = async (req, res) => {
|
|
const from = req.query.from;
|
|
const to = req.query.to;
|
|
const result = await getModelHistory({ model: materialModel, from, to });
|
|
if (result?.error) {
|
|
logger.error('Error fetching material history:', result.error);
|
|
return res.status(result.code).send(result);
|
|
}
|
|
logger.trace('Material history:', result);
|
|
res.send(result);
|
|
};
|