From 8df36bd3e22156b8989e61227810154facc68946 Mon Sep 17 00:00:00 2001 From: supphakitd <67319010028@technictrang.ac.th> Date: Mon, 1 Dec 2025 18:27:07 +0700 Subject: [PATCH] *: added projectEdit and tweaking projectSearch added useredit param into projectSearchController.js, also use switch case instead of if-else. projectEdit is still not working yet Signed-off-by: supphakitd <67319010028@technictrang.ac.th> --- .../src/controllers/projectEditController.js | 128 ++++++++++++++++++ .../controllers/projectSearchController.js | 50 ++++--- exthernal-ttc-api/src/routes/route.js | 5 + .../src/services/projectEditService.js | 34 +++++ 4 files changed, 191 insertions(+), 26 deletions(-) create mode 100644 exthernal-ttc-api/src/controllers/projectEditController.js create mode 100644 exthernal-ttc-api/src/services/projectEditService.js diff --git a/exthernal-ttc-api/src/controllers/projectEditController.js b/exthernal-ttc-api/src/controllers/projectEditController.js new file mode 100644 index 0000000..336a66b --- /dev/null +++ b/exthernal-ttc-api/src/controllers/projectEditController.js @@ -0,0 +1,128 @@ +import { ProjectEditService } from '../services/projectEditService.js' +import { sendError } from '../utils/response.js' +import { GeneralService } from '../share/generalservice.js'; +import { trim_all_array } from '../utils/trim.js' +import { verifyToken, generateToken } from '../utils/token.js' +import { Interface } from '../interfaces/Interface.js'; +import fs from 'fs'; +import path from 'path'; +import { getDTM } from '../utils/date.js'; + + +export class projectEdit { + + constructor() { + this.generalService = new GeneralService(); + this.Interface = new Interface(); + this.projectEditService = new ProjectEditService(); + } + + async onNavigate(req, res) { + this.generalService.devhint(1, 'projectAdd.js', 'onNavigate() start'); + + let organization = req.body.organization; + const prommis = await this.onProjectEdit(req, res, organization); + return prommis; + } + + async onProjectEdit(req, res, database) { + let idx = -1 + let aryResult = [] + let latSeq = [] + try { + let token = req.headers.authorization?.split(' ')[1]; + const decoded = verifyToken(token); + + const requestData = req.body; + let name = requestData.prjnam; + + database = decoded.organization || 'dbo'; + + aryResult = await this.projectEditService.getProjectEdit(database, name); + latSeq = await this.projectEditService.getLatestProjectSeq(database); + + } catch (error) { + idx = 1; + console.error(error); + } finally { + if (idx === 1) return sendError('เกิดข้อผิดพลาดไม่คาดคิดเกิดขึ้น', 'Unexpected error'); + + if (aryResult == 0) { + const currentSeq = (latSeq && latSeq[0] && latSeq[0].prjseq) ? latSeq[0].prjseq : 0; + let prommis = await this.makeArySave(req, currentSeq); + return prommis + } else { + if (req.files) { + req.files.forEach(f => { + if (fs.existsSync(f.path)) fs.unlinkSync(f.path); + }); + } + return sendError('คีย์หลักซ้ำในระบบ', 'Duplicate Primary Key'); + } + } + } + + async makeArySave(req, latseq) { + const requestData = req.body; + const nextSeq = latseq + 1; + + let prjwntbdg = requestData.prjwntbdg; + if (!prjwntbdg || prjwntbdg === '' || prjwntbdg === 'undefined' || prjwntbdg === 'null') { + prjwntbdg = '0.00'; + } + + let prjusrseq = requestData.prjusrseq; + if (!prjusrseq || prjusrseq === '' || prjusrseq === 'undefined' || prjusrseq === 'null') { + prjusrseq = null; + } + + const typ = requestData.typ; + + let arysave = { + methods: 'post', + prjseq: nextSeq, + prjnam: requestData.prjnam, + prjusrseq: prjusrseq, + prjwntbdg: prjwntbdg, + prjacpbdg: '0.00', + prjbdgcod: '', + prjcomstt: requestData.prjcomstt || 'UAC', + prjacpdtm: getDTM(), + } + + let savedFileNames = []; + if (req.files && req.files.length > 0) { + if (typ === 'prj') { + const targetDir = `uploads/projects/${nextSeq}`; + + try { + if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + } + + req.files.forEach(file => { + const targetPath = path.join(targetDir, file.filename); + fs.renameSync(file.path, targetPath); + savedFileNames.push(file.filename); + }); + + arysave.prjdoc = savedFileNames.join(','); + + } catch (err) { + console.error('Error moving files:', err); + return sendError('ไม่สามารถบันทึกไฟล์ลงโฟลเดอร์โครงการได้'); + } + } else { + arysave.prjdoc = req.files.map(f => f.filename).join(','); + } + } + + if (!arysave.prjusrseq) { + const token = req.headers.authorization?.split(' ')[1]; + const decoded = verifyToken(token); + if (decoded) arysave.prjusrseq = decoded.id; + } + + return this.Interface.saveInterface('prjmst', arysave, req); + } +} \ No newline at end of file diff --git a/exthernal-ttc-api/src/controllers/projectSearchController.js b/exthernal-ttc-api/src/controllers/projectSearchController.js index 25f1ac2..fb4974f 100644 --- a/exthernal-ttc-api/src/controllers/projectSearchController.js +++ b/exthernal-ttc-api/src/controllers/projectSearchController.js @@ -23,18 +23,20 @@ export class projectSearch { let idx = -1 let aryResult = [] let condition = {} + let column = "" try { let token = req.headers.authorization?.split(' ')[1]; const decoded = verifyToken(token); // ใช้ Organization จาก Token ถ้ามี - database = decoded.organization || database - + database = decoded.organization || database + let columnParams = req.query.column - - - if (columnParams == 'user') { - let column = `prjseq, prjnam, prjwntbdg, prjcomstt, prjacpdtm, + condition['prjseq'] = req.body.request.prjseq; + + switch (columnParams) { + case "user": + column = `prjseq, prjnam, prjwntbdg, prjcomstt, prjacpdtm, ( SELECT trnacpdtm FROM ${database}.trnmst t @@ -42,24 +44,21 @@ export class projectSearch { ORDER BY trnacpdtm DESC LIMIT 1 ) as trnacpdtm` - condition['prjusrseq'] = req.body.request.prjusrseq || decoded.id - // เรียก Service ตัวเดิม (Simple) - aryResult = await this.projectSearchService.getProjectSearch(database, column, condition); + aryResult = await this.projectSearchService.getProjectSearch(database, column, condition); + break; - } else if (columnParams == 'edit') { - let column = `prjseq, prjnam, prjwntbdg, prjcomstt` - condition['prjseq'] = req.body.request.prjseq - - // เรียก Service ตัวเดิม (Simple) - aryResult = await this.projectSearchService.getProjectSearch(database, column, condition); + case "edit": + column = `prjseq, prjnam, prjwntbdg, prjcomstt` + aryResult = await this.projectSearchService.getProjectSearch(database, column, condition); + break; - } else if (columnParams == 'result' || columnParams == undefined || columnParams == '') { - - // กำหนดเงื่อนไข (ถ้ามีส่งมา) - condition['prjseq'] = req.body.request.prjseq; - - // สร้าง Column String ที่มี Subquery ดึงงบจาก trnmst - let column = ` + case "useredit": + column = `prjseq, prjnam, prjwntbdg, prjdoc` + aryResult = await this.projectSearchService.getProjectSearch(database, column, condition); + break; + + default: + column = ` prjseq, prjnam, usrthinam as prjusrnam, @@ -83,15 +82,14 @@ export class projectSearch { prjcomstt, prjacpdtm `; - - // ใช้ Service ตัวใหม่ (Detail Search / Join) - aryResult = await this.projectSearchService.getProjectDetailSearch(database, column, condition); + aryResult = await this.projectSearchService.getProjectDetailSearch(database, column, condition); + break; } } catch (error) { console.error(error); idx = 1; - } finally { + } finally { if (idx === 1) return sendError('เกิดข้อผิดพลาดไม่คาดคิดเกิดขึ้น', 'Unexpected error'); if (!aryResult || aryResult.length === 0) return sendError('ไม่พบการมีอยู่ของข้อมูล', 'Cannot Find Any Data'); return aryResult diff --git a/exthernal-ttc-api/src/routes/route.js b/exthernal-ttc-api/src/routes/route.js index 5f045c9..dc4192d 100644 --- a/exthernal-ttc-api/src/routes/route.js +++ b/exthernal-ttc-api/src/routes/route.js @@ -39,6 +39,11 @@ router.post('/projectadd', uploadMiddleware, async (req, res) => { if (result) return res.json(result) }) +router.post('/projectedit', uploadMiddleware, async (req, res) => { + const result = await controller_projectAdd_post.onNavigate(req, res) + if (result) return res.json(result) +}) + router.get('/projectdownload', async (req, res) => { // ไม่ต้อง return res.json() เพราะ Controller จัดการ Stream แล้ว await controller_projectDownload_get.onNavigate(req, res) diff --git a/exthernal-ttc-api/src/services/projectEditService.js b/exthernal-ttc-api/src/services/projectEditService.js new file mode 100644 index 0000000..dc73020 --- /dev/null +++ b/exthernal-ttc-api/src/services/projectEditService.js @@ -0,0 +1,34 @@ +import { GeneralService } from '../share/generalservice.js' + +export class ProjectEditService { + + constructor() { + this.generalService = new GeneralService() + } + + async getProjectEdit(database, name) { + const sql = ` + SELECT + prjseq, + prjnam + FROM ${database}.prjmst + WHERE prjnam = $1 + ` + const params = [name] + const result = await this.generalService.executeQueryParam(database, sql, params); + return result + } + + async getLatestProjectSeq(database) { + const sql = ` + SELECT + prjseq + FROM ${database}.prjmst + WHERE prjseq=(SELECT max(prjseq) FROM ${database}.prjmst) + ` + + const params = [] + const result = await this.generalService.executeQueryParam(database, sql, params); + return result + } +} \ No newline at end of file