diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 90c3cd8..dbf006e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -54,7 +54,7 @@ model timetable { model users { id Int @id(map: "pk_users") @default(autoincrement()) - login String @db.VarChar(25) + login String @unique @db.VarChar(25) pass String? @db.VarChar(100) is_admin Boolean? @default(false) timetable timetable[] diff --git a/src/pages/gate/login.ts b/src/pages/gate/login.ts index 1d624ea..3749b19 100644 --- a/src/pages/gate/login.ts +++ b/src/pages/gate/login.ts @@ -1,34 +1,41 @@ import type { APIContext } from "astro"; import { createSession, getUserFromAuth } from "../../db"; +import { Prisma } from "@prisma/client"; -export async function post({ request, redirect, cookies }: APIContext) { +export async function post({ request, cookies }: APIContext) { const response: { ok: boolean; reason?: string } = { ok: true, }; + try { + const formData = await request.formData(); + const login = formData.get("login"); + const password = formData.get("password"); + if (login === null || password === null) { + throw new Error("Не предоставлены данные для входа"); + } - const formData = await request.formData(); - const login = formData.get("login"); - const password = formData.get("password"); - if (login === null || password === null) { - response.ok = false; - response.reason = "Не предоставлены данные для входа"; - } else { const user = await getUserFromAuth(login!.toString(), password!.toString()); - if (user === null) { - response.ok = false; - response.reason = "Неправильная связка логин/пароль"; + throw new Error("Неправильная связка логин/пароль"); + } + + const session = await createSession(user!); + if (session === null) { + throw new Error("Не удалось создать сессию для пользователя"); + } + + response.ok = true; + cookies.set("session", session.id, { + path: "/", + }); + } catch (e: any) { + response.ok = false; + if (e instanceof Prisma.PrismaClientKnownRequestError) { + response.reason = `Неизвестная ошибка базы данных. Код ${e.code}`; + } else if (e instanceof Error) { + response.reason = e.message.trim(); } else { - const session = await createSession(user!); - if (session !== null) { - response.ok = true; - cookies.set("session", session.id, { - path: "/", - }); - } else { - response.ok = false; - response.reason = "Не удалось создать сессию для пользователя"; - } + response.reason = e.toString().trim(); } } diff --git a/src/pages/gate/register.ts b/src/pages/gate/register.ts index 077373a..c048bf0 100644 --- a/src/pages/gate/register.ts +++ b/src/pages/gate/register.ts @@ -1,25 +1,39 @@ import type { APIContext } from "astro"; import { createUser } from "../../db"; +import { Prisma } from "@prisma/client"; export async function post({ request }: APIContext) { const response: { ok: boolean; reason?: string } = { ok: true, }; - const formData = await request.formData(); - const login = formData.get("login"); - const password = formData.get("password"); - if (login === null || password === null) { - response.ok = false; - response.reason = "Не предоставлены данные для регистрации"; - } else { + try { + const formData = await request.formData(); + const login = formData.get("login"); + const password = formData.get("password"); + if (login === null || password === null) { + throw new Error("Не предоставлены данные для регистрации"); + } + const user = await createUser(login!.toString(), password!.toString()); if (user === null) { - response.ok = false; - response.reason = "Невозможно зарегистрировать пользователя"; + throw new Error("Невозможно зарегистрировать пользователя"); + } + + response.ok = true; + } catch (e: any) { + response.ok = false; + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === "P2002") { + response.reason = "Пользователь с таким логином уже существует"; + } else { + response.reason = `Неизвестная ошибка базы данных. Код ${e.code}`; + } + } else if (e instanceof Error) { + response.reason = e.message.trim(); } else { - response.ok = true; + response.reason = e.toString().trim(); } } diff --git a/src/pages/login.astro b/src/pages/login.astro index f6fafc5..8a83177 100644 --- a/src/pages/login.astro +++ b/src/pages/login.astro @@ -23,7 +23,7 @@ if (Astro.cookies.has("session")) {

Вход

-
+
@@ -45,4 +45,29 @@ if (Astro.cookies.has("session")) { + + diff --git a/src/pages/register.astro b/src/pages/register.astro index 76b2374..1ff4d6f 100644 --- a/src/pages/register.astro +++ b/src/pages/register.astro @@ -23,7 +23,7 @@ if (Astro.cookies.has("session")) {

Регистрация

- +
@@ -45,4 +45,29 @@ if (Astro.cookies.has("session")) { + +