From 9b8cb9d752ba28f505a9d3364689ac9ece626543 Mon Sep 17 00:00:00 2001 From: Muhammad Afif Date: Mon, 13 Oct 2025 11:52:09 +0700 Subject: [PATCH] repair: shift db & roles --- db/roles.db.js | 89 ++++++++++++++------------------------- db/shift.db.js | 63 +++++++++++---------------- services/roles.service.js | 4 +- services/shift.service.js | 4 +- utils/time.js | 11 ----- 5 files changed, 60 insertions(+), 111 deletions(-) delete mode 100644 utils/time.js diff --git a/db/roles.db.js b/db/roles.db.js index f6bd051..56c42c5 100644 --- a/db/roles.db.js +++ b/db/roles.db.js @@ -1,96 +1,71 @@ const pool = require("../config"); -// Get all roles const getAllRolesDb = async (searchParams = {}) => { let queryParams = []; - // Pagination + // Handle pagination if (searchParams.limit) { const page = Number(searchParams.page ?? 1) - 1; queryParams = [Number(searchParams.limit ?? 10), page]; } - // Filtering + const { whereOrConditions, whereParamOr } = pool.buildStringOrIlike( + ["a.role_name", "a.role_level", "a.role_description"], + searchParams.criteria, + queryParams + ); + if (whereParamOr) queryParams = whereParamOr; + const { whereConditions, whereParamAnd } = pool.buildFilterQuery( [ - { column: "r.role_name", param: searchParams.role_name, type: "string" }, - { - column: "r.role_level", - param: searchParams.role_level, - type: "number", - }, + { column: "a.role_name", param: searchParams.role_name, type: "string" }, + { column: "a.role_level", param: searchParams.start_time, type: "string" }, + { column: "a.role_description", param: searchParams.role_description, type: "string" }, ], queryParams ); - - queryParams = whereParamAnd ? whereParamAnd : queryParams; + if (whereParamAnd) queryParams = whereParamAnd; const queryText = ` SELECT - COUNT(*) OVER() AS total_data, - r.role_id, - r.role_name, - r.role_description, - r.role_level, - r.created_at, - r.updated_at, - r.updated_by, - r.deleted_at, - r.deleted_by, - r.created_by - FROM m_roles r - WHERE r.deleted_at IS NULL - ${whereConditions.length > 0 ? `AND ${whereConditions.join(" AND ")}` : ""} - ORDER BY r.role_id ASC - ${searchParams.limit ? `OFFSET $2 ROWS FETCH NEXT $1 ROWS ONLY` : ""}; + COUNT(*) OVER() AS total_data, + a.* + FROM m_roles a + WHERE a.deleted_at IS NULL + ${whereConditions.length > 0 ? ` AND ${whereConditions.join(" AND ")}` : ""} + ${whereOrConditions ? ` ${whereOrConditions}` : ""} + ORDER BY a.role_id ASC + ${searchParams.limit ? `OFFSET $2 ROWS FETCH NEXT $1 ROWS ONLY` : ""} `; const result = await pool.query(queryText, queryParams); - const total = - result?.recordset.length > 0 + result?.recordset?.length > 0 ? parseInt(result.recordset[0].total_data, 10) : 0; return { data: result.recordset, total }; }; -// Get role by ID const getRolesByIdDb = async (id) => { const queryText = ` SELECT - r.role_id, - r.role_name, - r.role_description, - r.role_level, - r.created_at, - r.updated_at, - r.updated_by, - r.deleted_at, - r.deleted_by, - r.created_by - FROM m_roles r - WHERE r.role_id = $1 AND r.deleted_at IS NULL + a.* + FROM m_roles a + WHERE a.role_id = $1 AND a.deleted_at IS NULL `; const result = await pool.query(queryText, [id]); - return result.recordset; + return result.recordset?.[0] || null; }; -// Create role -const createRolesDB = async (data) => { - const store = { ...data }; - - const { query: queryText, values } = pool.buildDynamicInsert( - "m_roles", - store - ); +const insertRolesDb = async (store) => { + const { query: queryText, values } = pool.buildDynamicInsert("m_roles", store); const result = await pool.query(queryText, values); + const insertedId = result.recordset?.[0]?.inserted_id; - const insertedId = result.recordset[0]?.inserted_id; return insertedId ? await getRolesByIdDb(insertedId) : null; }; -// Update role const updateRolesDb = async (id, data) => { const store = { ...data }; const whereData = { role_id: id }; @@ -100,17 +75,15 @@ const updateRolesDb = async (id, data) => { store, whereData ); - await pool.query(`${queryText} AND deleted_at IS NULL`, values); + await pool.query(`${queryText} AND deleted_at IS NULL`, values); return getRolesByIdDb(id); }; -// Soft delete role const deleteRolesDb = async (id, deletedBy) => { const queryText = ` UPDATE m_roles - SET deleted_at = CURRENT_TIMESTAMP, - deleted_by = $1 + SET deleted_at = CURRENT_TIMESTAMP, deleted_by = $1 WHERE role_id = $2 AND deleted_at IS NULL `; await pool.query(queryText, [deletedBy, id]); @@ -120,7 +93,7 @@ const deleteRolesDb = async (id, deletedBy) => { module.exports = { getAllRolesDb, getRolesByIdDb, - createRolesDB, + insertRolesDb, updateRolesDb, deleteRolesDb, }; diff --git a/db/shift.db.js b/db/shift.db.js index fd62f5c..74b0091 100644 --- a/db/shift.db.js +++ b/db/shift.db.js @@ -1,83 +1,71 @@ const pool = require("../config"); -// Get all roles const getAllShiftDb = async (searchParams = {}) => { let queryParams = []; - // Pagination + // Handle pagination if (searchParams.limit) { const page = Number(searchParams.page ?? 1) - 1; queryParams = [Number(searchParams.limit ?? 10), page]; } - // Filtering + const { whereOrConditions, whereParamOr } = pool.buildStringOrIlike( + ["a.shift_name", "a.start_time", "a.end_time"], + searchParams.criteria, + queryParams + ); + if (whereParamOr) queryParams = whereParamOr; + const { whereConditions, whereParamAnd } = pool.buildFilterQuery( [ - { column: "a.shift_name", param: searchParams.shift_name, type: "string" }, - { - column: "a.start_time", - param: searchParams.start_time, - type: "time", - }, - { - column: "a.end_time", - param: searchParams.end_time, - type: "time", - }, + { column: "a.shift_name", param: searchParams.name, type: "string" }, + { column: "a.start_time", param: searchParams.start_time, type: "time" }, + { column: "a.end_time", param: searchParams.end_time, type: "time" }, ], queryParams ); - - queryParams = whereParamAnd ? whereParamAnd : queryParams; + if (whereParamAnd) queryParams = whereParamAnd; const queryText = ` SELECT - COUNT(*) OVER() AS total_data, + COUNT(*) OVER() AS total_data, a.* FROM m_shift 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.shift_id ASC - ${searchParams.limit ? `OFFSET $2 ROWS FETCH NEXT $1 ROWS ONLY` : ""}; + ${searchParams.limit ? `OFFSET $2 ROWS FETCH NEXT $1 ROWS ONLY` : ""} `; const result = await pool.query(queryText, queryParams); - const total = - result?.recordset.length > 0 + result?.recordset?.length > 0 ? parseInt(result.recordset[0].total_data, 10) : 0; return { data: result.recordset, total }; }; -// Get role by ID const getShiftByIdDb = async (id) => { const queryText = ` SELECT - a.* + a.* FROM m_shift a WHERE a.shift_id = $1 AND a.deleted_at IS NULL `; const result = await pool.query(queryText, [id]); - return result.recordset; + return result.recordset?.[0] || null; }; -// Create role -const createShiftDB = async (data) => { - const store = { ...data }; - - const { query: queryText, values } = pool.buildDynamicInsert( - "m_shift", - store - ); +const insertShiftDb = async (store) => { + const { query: queryText, values } = pool.buildDynamicInsert("m_shift", store); const result = await pool.query(queryText, values); + const insertedId = result.recordset?.[0]?.inserted_id; - const insertedId = result.recordset[0]?.inserted_id; return insertedId ? await getShiftByIdDb(insertedId) : null; }; -// Update role const updateShiftDb = async (id, data) => { const store = { ...data }; const whereData = { shift_id: id }; @@ -87,16 +75,15 @@ const updateShiftDb = async (id, data) => { store, whereData ); - await pool.query(`${queryText} AND deleted_at IS NULL`, values); + await pool.query(`${queryText} AND deleted_at IS NULL`, values); return getShiftByIdDb(id); }; const deleteShiftDb = async (id, deletedBy) => { const queryText = ` UPDATE m_shift - SET deleted_at = CURRENT_TIMESTAMP, - deleted_by = $1 + SET deleted_at = CURRENT_TIMESTAMP, deleted_by = $1 WHERE shift_id = $2 AND deleted_at IS NULL `; await pool.query(queryText, [deletedBy, id]); @@ -106,7 +93,7 @@ const deleteShiftDb = async (id, deletedBy) => { module.exports = { getAllShiftDb, getShiftByIdDb, - createShiftDB, + insertShiftDb, updateShiftDb, deleteShiftDb, }; diff --git a/services/roles.service.js b/services/roles.service.js index db73834..863ae80 100644 --- a/services/roles.service.js +++ b/services/roles.service.js @@ -1,7 +1,7 @@ const { getAllRolesDb, getRolesByIdDb, - createRolesDB, + insertRolesDb, updateRolesDb, deleteRolesDb } = require('../db/roles.db'); @@ -40,7 +40,7 @@ class RolesService { try { if (!data || typeof data !== 'object') data = {}; - const result = await createRolesDB(data); + const result = await insertRolesDb(data); return result; } catch (error) { diff --git a/services/shift.service.js b/services/shift.service.js index 93439d2..8706771 100644 --- a/services/shift.service.js +++ b/services/shift.service.js @@ -1,7 +1,7 @@ const { getAllShiftDb, getShiftByIdDb, - createShiftDB, + insertShiftDb, updateShiftDb, deleteShiftDb } = require('../db/shift.db'); @@ -40,7 +40,7 @@ class ShiftService { try { if (!data || typeof data !== 'object') data = {}; - const result = await createShiftDB(data); + const result = await insertShiftDb(data); return result; } catch (error) { diff --git a/utils/time.js b/utils/time.js deleted file mode 100644 index 9a982d7..0000000 --- a/utils/time.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - formattedTime: (timestamp) => { - let date = new Date(timestamp); - let hours = date.getHours().toString().padStart(2, "0"); - let minutes = date.getMinutes().toString().padStart(2, "0"); - let seconds = date.getSeconds().toString().padStart(2, "0"); - let formattedTime = `${hours}:${minutes}:${seconds}`; - return formattedTime; - }, - }; - \ No newline at end of file