feat: enhance sparepart database queries and sparepart number validation

This commit is contained in:
2026-04-27 17:22:21 +07:00
parent b7fa4b3d07
commit 51f4ea2bff
4 changed files with 20 additions and 16 deletions

View File

@@ -203,6 +203,10 @@ function buildDynamicUpdate(table, data, where) {
setParts.push(`${key} = $${index++}`);
values.push(value);
}
else if (key !== undefined && key !== null) {
setParts.push(`${key} = $${index++}`);
values.push(value);
}
}
if (setParts.length === 0) {

View File

@@ -54,9 +54,8 @@ const getAllSparepartDb = async (searchParams = {}) => {
COALESCE(a.sparepart_code, '') + ' - ' + COALESCE(a.sparepart_name, '') AS sparepart_code_name
FROM m_sparepart a
WHERE a.deleted_at IS NULL
${
whereConditions.length > 0 ? `AND ${whereConditions.join(" AND ")}` : ""
}
${whereConditions.length > 0 ? `AND ${whereConditions.join(" AND ")}` : ""
}
${whereOrConditions ? whereOrConditions : ""}
ORDER BY a.sparepart_id ASC
${searchParams.limit ? `OFFSET $2 * $1 ROWS FETCH NEXT $1 ROWS ONLY` : ""}
@@ -84,15 +83,15 @@ const getSparepartByIdDb = async (id) => {
return result.recordset;
};
const checkSparepartNameExistsDb = async (sparePartName, excludeId = null) => {
const checkSparepartNameExistsDb = async (sparePartName, sparePartNumber, excludeId = null) => {
let queryText = `
SELECT sparepart_id
FROM m_sparepart
WHERE sparepart_name = $1 AND deleted_at IS NULL
WHERE sparepart_name = $1 AND sparepart_number = $2 AND deleted_at IS NULL
`;
let values = [sparePartName];
let values = [sparePartName, sparePartNumber];
if (excludeId) {
queryText += ` AND sparepart_id != $2`;
queryText += ` AND sparepart_id != $3`;
values.push(excludeId);
}
const result = await pool.query(queryText, values);

View File

@@ -13,7 +13,7 @@ class SparepartService {
static async getAllSparepart(param) {
try {
const results = await getAllSparepartDb(param);
results.data.map((item) => {});
results.data.map((item) => { });
return results;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
@@ -39,8 +39,8 @@ class SparepartService {
static async createSparepart(data) {
try {
if (!data || typeof data !== "object") data = {};
if (data.sparepart_name) {
const exists = await checkSparepartNameExistsDb(data.sparepart_name);
if (data.sparepart_name && data.sparepart_number) {
const exists = await checkSparepartNameExistsDb(data.sparepart_name, data.sparepart_number);
if (exists)
throw new ErrorHandler(400, "Sparepart name already exists");
}
@@ -48,7 +48,7 @@ class SparepartService {
if (data.sparepart_yearly) {
data.sparepart_yearly = JSON.stringify(data.sparepart_yearly);
}
const created = await createSparepartDb(data);
if (!created) throw new ErrorHandler(500, "Failed to create Sparepart");
return created;
@@ -63,10 +63,11 @@ class SparepartService {
if (!existing) throw new ErrorHandler(404, "Sparepart not found");
if (
data.sparepart_name &&
data.sparepart_name !== existing.sparepart_name
data.sparepart_name !== existing.sparepart_name && data.sparepart_number && data.sparepart_number !== existing.sparepart_number
) {
const exists = await checkSparepartNameExistsDb(
data.sparepart_name,
data.sparepart_number,
id
);
if (exists)

View File

@@ -17,8 +17,8 @@ const insertDeviceSchema = Joi.object({
'string.ip': 'IP address must be a valid IPv4 or IPv6 address'
}),
listen_channel: Joi.string().max(100).required(),
listen_channel_reminder: Joi.string().max(100).optional(),
reminder_at: Joi.date().iso().allow(null).optional()
listen_channel_reminder: Joi.string().max(100).allow('', null),
reminder_at: Joi.date().iso().allow('', null),
});
const updateDeviceSchema = Joi.object({
@@ -33,8 +33,8 @@ const updateDeviceSchema = Joi.object({
'string.ip': 'IP address must be a valid IPv4 or IPv6 address'
}),
listen_channel: Joi.string().max(100),
listen_channel_reminder: Joi.string().max(100).optional(),
reminder_at: Joi.date().iso().allow(null).optional()
listen_channel_reminder: Joi.string().max(100).allow('', null),
reminder_at: Joi.date().iso().allow('', null),
}).min(1);