From 51f4ea2bffb75d8529c17ab002e3d491221fe212 Mon Sep 17 00:00:00 2001 From: Fachba Date: Mon, 27 Apr 2026 17:22:21 +0700 Subject: [PATCH] feat: enhance sparepart database queries and sparepart number validation --- config/index.js | 4 ++++ db/sparepart.db.js | 13 ++++++------- services/sparepart.service.js | 11 ++++++----- validate/device.schema.js | 8 ++++---- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/config/index.js b/config/index.js index 3e2b88f..3e66129 100644 --- a/config/index.js +++ b/config/index.js @@ -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) { diff --git a/db/sparepart.db.js b/db/sparepart.db.js index 994048d..2861a87 100644 --- a/db/sparepart.db.js +++ b/db/sparepart.db.js @@ -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); diff --git a/services/sparepart.service.js b/services/sparepart.service.js index ff11de0..d9798a4 100644 --- a/services/sparepart.service.js +++ b/services/sparepart.service.js @@ -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) diff --git a/validate/device.schema.js b/validate/device.schema.js index e5e3369..a17b47d 100644 --- a/validate/device.schema.js +++ b/validate/device.schema.js @@ -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); -- 2.49.1