-api เส้น register

-เครื่องมือต่างๆ (ไม่สมบูร)
This commit is contained in:
x2Skyz
2025-11-21 12:09:43 +07:00
parent 4cb135d251
commit f8344e7afc
13 changed files with 561 additions and 139 deletions

View File

@@ -1,88 +1,57 @@
import bcrypt from 'bcrypt';
import crypto from 'crypto';
import nodemailer from 'nodemailer';
import { GeneralService } from '../share/generalservice.js';
import { sendError } from '../utils/response.js';
import redis from '../utils/redis.js';
import { GeneralService } from '../share/generalservice.js'
import bcrypt from 'bcrypt'
export class RegisterService {
constructor() {
// this.redis = new Redis();
this.generalService = new GeneralService();
this.generalService = new GeneralService()
}
async requestRegistration(database, email, fname, lname, password) {
let result = [];
async createUser(database, userData) {
// 1. ทำการ Hash Password
const saltRounds = 10;
const hashedPassword = await bcrypt.hash(userData.password, saltRounds);
// 2. เตรียม SQL
const sql = `
INSERT INTO ${database}.usrmst
(username, password, email, firstname, lastname, created_at)
VALUES (?, ?, ?, ?, ?, NOW())
`
// 3. ใช้ hashedPassword แทน password เดิม
const params = [
userData.username,
hashedPassword, // ส่งตัวที่ Hash แล้วเข้า DB
userData.email,
userData.firstname,
userData.lastname
]
try {
let sql = `
SELECT usrseq FROM ${database}.usrmst WHERE usrnam = $1
`;
let param = [email];
const userCheck = await this.generalService.executeQueryParam(database, sql, param);
if (userCheck.length > 0) {
this.generalService.devhint(1, 'registerservice.js', `❌ Duplicate email (${email})`);
throw sendError('อีเมลนี้ถูกใช้แล้ว', 'Email already registered');
}
const hashedPwd = await bcrypt.hash(password, 10);
const token = crypto.randomBytes(32).toString('hex');
const payload = JSON.stringify({ fname, lname, hashedPwd, token, database });
await redis.set(`verify:${email}`, payload, 'EX', 86400); // 24h
const verifyUrl = `http://localhost:1012/login/verify-email?token=${token}&email=${encodeURIComponent(email)}&organization=${database}`;
await this.sendVerifyEmail(email, verifyUrl);
this.generalService.devhint(2, 'registerservice.js', `✅ Verify link sent to ${email}`);
result = {
code: '200',
message_th: 'ส่งลิงก์ยืนยันอีเมลแล้ว',
data: {}
};
const result = await this.generalService.executeQueryParam(database, sql, params);
// เช็คผลลัพธ์ตาม Structure ของ GeneralService
// สมมติว่าถ้า Error ตัว executeQueryParam อาจจะ throw หรือ return null
return { status: true, message: 'Registration successful' };
} catch (error) {
this.generalService.devhint(1, 'registerservice.js', '❌ Registration Error', error.message);
throw error;
}
return result;
}
async sendVerifyEmail(email, verifyUrl) {
try {
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
const html = `
<div style="font-family: sans-serif;">
<h2>ยืนยันการสมัครสมาชิก</h2>
<p>กรุณากดยืนยันภายใน 24 ชั่วโมง เพื่อเปิดใช้งานบัญชีของคุณ</p>
<a href="${verifyUrl}"
style="display:inline-block;background:#0078d4;color:white;
padding:10px 20px;text-decoration:none;border-radius:5px;">ยืนยันอีเมล</a>
<p style="margin-top:16px;font-size:13px;color:#555;">หากคุณไม่ได้สมัคร โปรดละเว้นอีเมลนี้</p>
</div>
`;
await transporter.sendMail({
from: `"System" <${process.env.SMTP_USER}>`,
to: email,
subject: '📩 ยืนยันอีเมลสำหรับสมัครสมาชิก',
html,
});
this.generalService.devhint(2, 'registerservice.js', `📤 Verification email sent (${email})`);
} catch (error) {
this.generalService.devhint(1, 'registerservice.js', '❌ Email Send Failed', error.message);
throw sendError('ไม่สามารถส่งอีเมลได้', 'Email send failed');
console.error('Register Service Error:', error);
return null;
}
}
}
async genNum(database) {
const sql = `
SELECT
MAX(usrseq) as max_seq
FROM nuttakit.usrmst
`
const params = []
const aryResult = await this.generalService.executeQueryParam(database, sql, params);
const lastSeq = aryResult[0]?.max_seq || 0;
return lastSeq + 1;
}
}