import bcrypt from 'bcrypt' import { GeneralService } from '../share/generalservice.js' import { generateToken } from '../utils/token.js' // =================================================== // 📦 LoginService Class // =================================================== export class LoginService { // =================================================== // Zone 1️⃣ : Declaration & Constructor // =================================================== constructor() { this.generalService = new GeneralService() } // =================================================== // 🔹 Verify Login — Username/Password // =================================================== async verifyLogin(database, username, password) { this.generalService.devhint(2, 'loginservice.js', `verifyLogin() start for username=${username}`) // Zone 1️⃣ : Declaration let user = null let token = null // Zone 2️⃣ : Query user let sql = ` SELECT usrseq, usrnam, usrrol, usrpwd, usrthinam, usrthilstnam FROM ${database}.usrmst WHERE usrnam = $1 ` let params = [username] // ✅ ห้ามลืมเด็ดขาด const rows = await this.generalService.executeQueryParam(database, sql, params) this.generalService.devhint(3, 'loginservice.js', `query done, found=${rows.length}`) if (rows.length === 0) { this.generalService.devhint(2, 'loginservice.js', 'no user found') return null } // Zone 3️⃣ : Validate password user = rows[0] const match = await bcrypt.compare(password, user.usrpwd) if (!match) { this.generalService.devhint(2, 'loginservice.js', 'password mismatch') return null } // Zone 4️⃣ : Generate JWT Token token = generateToken({ id: user.usrseq, name: user.usrnam, role: user.usrrol, organization: database }) this.generalService.devhint(2, 'loginservice.js', 'token generated successfully') // Zone 5️⃣ : Return Raw Result return { token, ...user } } // =================================================== // 🔹 Login ผ่าน Biometric // =================================================== async loginWithBiometric(database, biometric_id) { this.generalService.devhint(2, 'loginservice.js', `loginWithBiometric() start for biometric_id=${biometric_id}`) // Zone 1️⃣ : Declaration let sql = '' let params = [] // Zone 2️⃣ : Query sql = ` SELECT usrid, usrnam, usrrol FROM ${database}.usrmst WHERE biometric_id = $1 ` params = [biometric_id] const rows = await this.generalService.executeQueryParam(database, sql, params) if (rows.length === 0) { this.generalService.devhint(2, 'loginservice.js', 'no biometric found') return null } // Zone 3️⃣ : Generate Token const user = rows[0] const token = generateToken({ id: user.usrid, name: user.usrnam, role: user.usrrol, organization: database }) this.generalService.devhint(2, 'loginservice.js', 'biometric token generated') return { token, user } } // =================================================== // 🔹 Register Biometric (หลัง login) // =================================================== async registerBiometric(database, usrid, biometric_id) { this.generalService.devhint(2, 'loginservice.js', `registerBiometric() start user=${usrid}`) // Zone 1️⃣ : Declaration let sql = '' let params = [] // Zone 2️⃣ : Query sql = ` UPDATE ${database}.usrmst SET biometric_id = $1 WHERE usrid = $2 ` params = [biometric_id, usrid] await this.generalService.executeQueryParam(database, sql, params) this.generalService.devhint(2, 'loginservice.js', 'biometric registered') return { message: 'Biometric registered successfully' } } }