forked from ttc/micro-service-api
123 lines
3.9 KiB
JavaScript
123 lines
3.9 KiB
JavaScript
|
|
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' }
|
|||
|
|
}
|
|||
|
|
}
|