feat: enhance sparepart database queries and sparepart number validation #46

Merged
bragaz_rexita merged 1 commits from wisdom into main 2026-04-27 11:21:10 +00:00
4 changed files with 20 additions and 16 deletions
Showing only changes of commit 51f4ea2bff - Show all commits

View File

@@ -203,6 +203,10 @@ function buildDynamicUpdate(table, data, where) {
setParts.push(`${key} = $${index++}`); setParts.push(`${key} = $${index++}`);
values.push(value); values.push(value);
} }
else if (key !== undefined && key !== null) {
setParts.push(`${key} = $${index++}`);
values.push(value);
}
} }
if (setParts.length === 0) { 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 COALESCE(a.sparepart_code, '') + ' - ' + COALESCE(a.sparepart_name, '') AS sparepart_code_name
FROM m_sparepart a FROM m_sparepart a
WHERE a.deleted_at IS NULL WHERE a.deleted_at IS NULL
${ ${whereConditions.length > 0 ? `AND ${whereConditions.join(" AND ")}` : ""
whereConditions.length > 0 ? `AND ${whereConditions.join(" AND ")}` : "" }
}
${whereOrConditions ? whereOrConditions : ""} ${whereOrConditions ? whereOrConditions : ""}
ORDER BY a.sparepart_id ASC ORDER BY a.sparepart_id ASC
${searchParams.limit ? `OFFSET $2 * $1 ROWS FETCH NEXT $1 ROWS ONLY` : ""} ${searchParams.limit ? `OFFSET $2 * $1 ROWS FETCH NEXT $1 ROWS ONLY` : ""}
@@ -84,15 +83,15 @@ const getSparepartByIdDb = async (id) => {
return result.recordset; return result.recordset;
}; };
const checkSparepartNameExistsDb = async (sparePartName, excludeId = null) => { const checkSparepartNameExistsDb = async (sparePartName, sparePartNumber, excludeId = null) => {
let queryText = ` let queryText = `
SELECT sparepart_id SELECT sparepart_id
FROM m_sparepart 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) { if (excludeId) {
queryText += ` AND sparepart_id != $2`; queryText += ` AND sparepart_id != $3`;
values.push(excludeId); values.push(excludeId);
} }
const result = await pool.query(queryText, values); const result = await pool.query(queryText, values);

View File

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

View File

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