41 lines
2.3 KiB
TypeScript
41 lines
2.3 KiB
TypeScript
"use server";
|
||
|
||
// mock login e-Court: รับเฉพาะผู้ใช้ใน MOCK_USERS (user1–user5) + Demo1234
|
||
// → ตั้ง cookie oacCase ตาม format จริง (identity ของแอปอ่านผ่าน lib/session.ts
|
||
// — บังคับด้วย middleware.ts)
|
||
import { cookies } from "next/headers";
|
||
import { redirect } from "next/navigation";
|
||
|
||
import { buildOacCaseCookie, MOCK_USERS, OAC_CASE_COOKIE } from "@/utils/user";
|
||
|
||
const MOCK_PASSWORD = "Demo1234";
|
||
|
||
export async function login(
|
||
username: string,
|
||
password: string,
|
||
): Promise<{ ok: true } | { ok: false; error: string }> {
|
||
// mock ตอบเร็วกว่าตา — หน่วงเล็กน้อยให้เห็นสถานะ "กำลังตรวจสอบ…"
|
||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||
const name = username.trim();
|
||
// username มาจาก dropdown เลือกผิดไม่ได้ — เช็ครายชื่อฝั่ง server เป็น defense กัน hand-craft
|
||
if (!MOCK_USERS.includes(name) || password !== MOCK_PASSWORD) {
|
||
return { ok: false, error: "รหัสผ่านไม่ถูกต้อง" };
|
||
}
|
||
// u_userid ต่างกันต่อคน (= u_userlogin) — สิทธิ์ "แก้ไขได้เฉพาะของตัวเอง" (guard ด้วย
|
||
// userId) ต้องแยกกันจริงทั้ง 5 คน ห้ามแชร์ค่าเดียว
|
||
cookies().set(OAC_CASE_COOKIE, buildOacCaseCookie(name, name), {
|
||
httpOnly: true,
|
||
sameSite: "lax",
|
||
path: "/",
|
||
maxAge: 8 * 60 * 60,
|
||
});
|
||
return { ok: true };
|
||
}
|
||
|
||
export async function logout(): Promise<void> {
|
||
// ลบ cookie ด้วย path "/" เท่านั้น (ตรงกับตอน set) ไม่งั้น browser ไม่ลบให้
|
||
cookies().set(OAC_CASE_COOKIE, "", { path: "/", maxAge: 0 });
|
||
// redirect ใน action เอง — ให้ Next จัดการ navigation กลไกเดียว
|
||
// (ถ้าให้ client router.replace เอง จะชนกับ re-render ของหน้า "/" ที่เพิ่งเสีย session จน navigation ไม่เกิด)
|
||
redirect("/login");
|
||
}
|