diff --git a/exthernal-login-api/.env b/exthernal-login-api/.env index 3773fe5..d5df980 100644 --- a/exthernal-login-api/.env +++ b/exthernal-login-api/.env @@ -13,7 +13,7 @@ SMTP_USER=lalisakuty@gmail.com SMTP_PASS=lurl pckw qugk tzob # REDIS -REDIS_HOST=localhost +REDIS_HOST=10.9.0.0 REDIS_PORT=6379 OTP_TTL_SECONDS=300 diff --git a/exthernal-ttc-api/src/controllers/projectAddController.js b/exthernal-ttc-api/src/controllers/projectAddController.js index c805795..164c698 100644 --- a/exthernal-ttc-api/src/controllers/projectAddController.js +++ b/exthernal-ttc-api/src/controllers/projectAddController.js @@ -30,20 +30,28 @@ export class projectAdd { let token = req.headers.authorization?.split(' ')[1]; const decoded = verifyToken(token); - let name = req.body.request.prjnam; - database = decoded.organization; + // ✅ รองรับทั้ง JSON { request: {...} } และ Form-Data (Flat body) + const requestData = req.body.request ? req.body.request : req.body; + + let name = requestData.prjnam; + + // Override Database จาก Token ตาม Pattern เดิม + database = decoded.organization || 'dbo'; aryResult = await this.projectAddService.getProjectAdd(database, name); latSeq = await this.projectAddService.getLatestProjectSeq(database); // this.generalService.devhint(1, 'budgetSearch.js', 'Login success'); } catch (error) { idx = 1; + console.error(error); // เพิ่ม log error เพื่อ debug } finally { if (idx === 1) return sendError('เกิดข้อผิดพลาดไม่คาดคิดเกิดขึ้น', 'Unexpected error'); // if (!aryResult) return sendError('ไม่พบการมีอยู่ของข้อมูล', 'Cannot Find Any Data'); if (aryResult == 0) { - let prommis = await this.makeArySave(req, latSeq[0].prjseq); + // ส่ง latSeq เข้าไป (ต้อง handle กรณี null ถ้า table ว่าง) + const currentSeq = (latSeq && latSeq[0] && latSeq[0].prjseq) ? latSeq[0].prjseq : 0; + let prommis = await this.makeArySave(req, currentSeq); return prommis } else { return sendError('คีย์หลักซ้ำในระบบ', 'Duplicate Primary Key'); @@ -53,17 +61,38 @@ export class projectAdd { async makeArySave(req, latseq) { + // Extract Data ให้รองรับทั้ง 2 แบบ + const requestData = req.body.request ? req.body.request : req.body; + + // ✅ แก้ไข: Sanitise Input ป้องกัน Error numeric: "" + // ถ้าเป็นค่าว่าง ให้แปลงเป็น null หรือ 0.00 ตามประเภทข้อมูล + const prjwntbdg = (requestData.prjwntbdg && requestData.prjwntbdg !== '') ? requestData.prjwntbdg : '0.00'; + const prjusrseq = (requestData.prjusrseq && requestData.prjusrseq !== '') ? requestData.prjusrseq : null; + let arysave = { methods: 'post', - prjseq: latseq+1, - prjnam: req.body.request.prjnam, - prjusrseq: req.body.request.prjusrseq, - prjwntbdg: req.body.request.prjwntbdg, + prjseq: latseq + 1, + prjnam: requestData.prjnam, + prjusrseq: prjusrseq, + prjwntbdg: prjwntbdg, prjacpbdg: '0.00', prjbdgcod: '', - prjcomstt: req.body.request.prjcomstt, - prjacpdtm: req.body.request.prjacpdtm + prjcomstt: requestData.prjcomstt || 'UAC', // Default UAC ถ้ายิงมาแค่ชื่อกับงบ + prjacpdtm: requestData.prjacpdtm || null } + + // เพิ่ม Logic จัดการไฟล์ + if (req.file) { + arysave.prjdoc = req.file.filename // บันทึกชื่อไฟล์ลง DB + } + + // กรณี User Seq ไม่ได้ส่งมา (เป็น null) ให้ใช้จาก Token + 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/middlewares/verifyEmailHandler.js b/exthernal-ttc-api/src/middlewares/verifyEmailHandler.js index caa253f..5b4710e 100644 --- a/exthernal-ttc-api/src/middlewares/verifyEmailHandler.js +++ b/exthernal-ttc-api/src/middlewares/verifyEmailHandler.js @@ -1,4 +1,4 @@ -import Redis from 'ioredis'; +import Redis from '../utils/redis.js'; import { GeneralService } from '../share/generalservice.js'; // import { sendError } from './response.js'; diff --git a/exthernal-ttc-api/src/routes/route.js b/exthernal-ttc-api/src/routes/route.js index 09b45f6..602b58e 100644 --- a/exthernal-ttc-api/src/routes/route.js +++ b/exthernal-ttc-api/src/routes/route.js @@ -7,6 +7,7 @@ import { projectAdd } from '../controllers/projectAddController.js' import { BudgetExpenseController } from '../controllers/budgetExpenseController.js' import { reportController } from '../controllers/reportController.js' import { transactionSearch } from '../controllers/transactionSearchController.js' +import { uploadMiddleware } from '../middlewares/uploadMiddleware.js' // ✅ Import แบบ Named Export // import { authMiddleware } from '../middlewares/auth.js' // import { sendResponse } from '../utils/response.js' @@ -40,7 +41,8 @@ router.post('/projectsearch', async (req, res) => { if (result) return res.json(result) }) -router.post('/projectadd', async (req, res) => { +// ใช้ uploadMiddleware แทน upload.single (เพราะ Wrapper จัดการให้แล้ว) +router.post('/projectadd', uploadMiddleware, async (req, res) => { const result = await controller_projectAdd_post.onNavigate(req, res) if (result) return res.json(result) }) @@ -60,4 +62,4 @@ router.post('/report', async (req, res) => { if (result) return res.json(result) }) -export default router +export default router \ No newline at end of file diff --git a/exthernal-ttc-api/src/utils/redis.js b/exthernal-ttc-api/src/utils/redis.js index fd9023c..4a22acc 100644 --- a/exthernal-ttc-api/src/utils/redis.js +++ b/exthernal-ttc-api/src/utils/redis.js @@ -4,7 +4,19 @@ dotenv.config() const redis = new Redis({ host: process.env.REDIS_HOST, - port: process.env.REDIS_PORT + port: process.env.REDIS_PORT, + connectTimeout: 10000, + maxRetriesPerRequest: null +}) + +redis.on('error', (err) => { + // Log the error so you know it's happening, but don't crash + console.error('Redis connection error:', err.code); +}) + +// Optional: Log when connected successfully +redis.on('connect', () => { + console.log('Connected to Redis successfully'); }) export async function saveOtp(email, otp) { diff --git a/package.json b/package.json index 1358998..9ee6f07 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "author": "Nuttakit Pothong", "license": "MIT", "dependencies": { + "archiver": "^7.0.1", "bcrypt": "^6.0.0", "connect-redis": "^9.0.0", "cors": "^2.8.5", @@ -28,6 +29,7 @@ "express-session": "^1.18.2", "ioredis": "^5.8.2", "jsonwebtoken": "^9.0.2", + "multer": "^2.0.2", "nodemailer": "^7.0.10", "pg": "^8.16.3", "socket.io": "^4.8.1",