F
fu.ling-lang.org
↓ 0 downloadsทะเบียนแพ็กเกจ fu.ling-lang.org — เขียนด้วยภาษา Ling (ไทย) ทั้งหมด
Keywords registry, packages, web, ling, thai
lingfu install fu.ling-lang.orgCode / Files (22)
models/users.ling
// models/users.ling — โมเดลผู้ใช้ + เซสชัน + 2FA
// สร้างผู้ใช้พร้อมกุญแจลับ TOTP (2FA บังคับ) — คืนไอดีผู้ใช้ใหม่ (0 ถ้าซ้ำ)
ฟังก์ชัน ผู้ใช้สร้าง(ชื่อ, อีเมล, รหัสผ่าน, ความลับ) {
ผูก แฮช = password_hash(รหัสผ่าน)
ฐานข้อมูลรัน("INSERT OR IGNORE INTO users (username, email, password_hash, totp_secret) VALUES (?1, ?2, ?3, ?4)", ชื่อ, อีเมล, แฮช, ความลับ)
ผูก แถว = ฐานข้อมูลถาม("SELECT id FROM users WHERE username = ?1", ชื่อ)
ถ้า แถว.len == 0 {
คืน 0
}
ผูก หัว = รับรายการ(แถว, 0)
คืน หัว.id
}
ฟังก์ชัน ผู้ใช้มีอยู่(ชื่อ) {
ผูก แถว = ฐานข้อมูลถาม("SELECT id FROM users WHERE username = ?1 OR email = ?1", ชื่อ)
คืน แถว.len > 0
}
ฟังก์ชัน ผู้ใช้ทั้งหมด() {
คืน ฐานข้อมูลถาม("SELECT id, username, bio, github, created_at FROM users ORDER BY id")
}
ฟังก์ชัน ผู้ใช้หา(ชื่อ) {
คืน ฐานข้อมูลถาม("SELECT id, username, email, bio, github, created_at FROM users WHERE username = ?1", ชื่อ)
}
ฟังก์ชัน ผู้ใช้นับ() {
ผูก แถว = ฐานข้อมูลถาม("SELECT COUNT(*) AS n FROM users")
ผูก หัว = รับรายการ(แถว, 0)
คืน หัว.n
}
// ตรวจรหัสผ่าน — คืนแถวผู้ใช้ (id, totp_secret, totp_confirmed) หรือ [] ถ้าผิด
ฟังก์ชัน ผู้ใช้ตรวจรหัส(ชื่อ, รหัสผ่าน) {
ผูก แถว = ฐานข้อมูลถาม("SELECT id, username, password_hash, totp_secret, totp_confirmed FROM users WHERE username = ?1", ชื่อ)
ถ้า แถว.len == 0 {
คืน []
}
ผูก ผ = รับรายการ(แถว, 0)
ถ้า password_verify(รหัสผ่าน, ผ.password_hash) {
คืน แถว
}
คืน []
}
ฟังก์ชัน ผู้ใช้ยืนยัน2fa(ไอดี) {
ฐานข้อมูลรัน("UPDATE users SET totp_confirmed = 1 WHERE id = ?1", ไอดี)
}
ฟังก์ชัน ผู้ใช้ตั้งประวัติ(ไอดี, ประวัติ, กิตฮับ) {
ฐานข้อมูลรัน("UPDATE users SET bio = ?2, github = ?3 WHERE id = ?1", ไอดี, ประวัติ, กิตฮับ)
}
// ── เซสชัน ──
ฟังก์ชัน เซสชันสร้าง(ไอดีผู้ใช้, ระยะ) {
ผูก โทเคน = random_hex(24)
ฐานข้อมูลรัน("INSERT INTO sessions (token, user_id, stage) VALUES (?1, ?2, ?3)", โทเคน, ไอดีผู้ใช้, ระยะ)
คืน โทเคน
}
ฟังก์ชัน เซสชันเลื่อนขั้น(โทเคน) {
ฐานข้อมูลรัน("UPDATE sessions SET stage = 'active' WHERE token = ?1", โทเคน)
}
ฟังก์ชัน เซสชันลบ(โทเคน) {
ฐานข้อมูลรัน("DELETE FROM sessions WHERE token = ?1", โทเคน)
}
// คืนแถวผู้ใช้+เซสชัน (id, username, stage, totp_secret) จากโทเคน หรือ []
ฟังก์ชัน เซสชันผู้ใช้(โทเคน) {
ถ้า โทเคน == "" {
คืน []
}
คืน ฐานข้อมูลถาม("SELECT u.id, u.username, u.totp_secret, s.stage FROM sessions s JOIN users u ON u.id = s.user_id WHERE s.token = ?1", โทเคน)
}