42 lines
1.5 KiB
JavaScript
42 lines
1.5 KiB
JavaScript
import prisma from '@/lib/prisma';
|
|
import bcrypt from 'bcrypt';
|
|
import { signToken } from '@/lib/auth';
|
|
|
|
export async function POST(req) {
|
|
try {
|
|
const { username, password } = await req.json();
|
|
|
|
if (!username || !password) {
|
|
return Response.json({ error: 'نام کاربری و رمز عبور الزامی است.' }, { status: 400 });
|
|
}
|
|
|
|
const user = await prisma.user.findUnique({
|
|
where: { username }
|
|
});
|
|
|
|
if (!user) {
|
|
return Response.json({ error: 'کاربر یافت نشد.' }, { status: 404 });
|
|
}
|
|
|
|
const isMatch = await bcrypt.compare(password, user.password);
|
|
|
|
if (!isMatch) {
|
|
return Response.json({ error: 'رمز عبور اشتباه است.' }, { status: 401 });
|
|
}
|
|
|
|
let parsedRoles = user.roles;
|
|
if (typeof parsedRoles === 'string') {
|
|
try { parsedRoles = JSON.parse(parsedRoles); } catch (e) { parsedRoles = null; }
|
|
}
|
|
|
|
let userRoles = Array.isArray(parsedRoles) ? parsedRoles : (user.role === 'ADMIN' ? ['ADMIN'] : ['COUNTER']);
|
|
|
|
const token = signToken({ id: user.id, username: user.username, name: user.name, orgId: user.orgId, roles: userRoles, role: user.role });
|
|
|
|
return Response.json({ message: 'با موفقیت وارد شدید', token, user: { id: user.id, name: user.name, orgId: user.orgId, roles: userRoles, avatarUrl: user.avatarUrl } });
|
|
} catch (error) {
|
|
console.error(error);
|
|
return Response.json({ error: 'خطای سرور رخ داد.' }, { status: 500 });
|
|
}
|
|
}
|