From f721d16ace5e290ece38e041a5c899e841fe25b4 Mon Sep 17 00:00:00 2001 From: Artem VV Date: Fri, 19 May 2023 21:15:25 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8E,=20=D1=81=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20unique=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=81=D1=85=D0=B5=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 2 +- src/pages/gate/login.ts | 49 ++++++++++++++++++++++---------------- src/pages/gate/register.ts | 34 ++++++++++++++++++-------- src/pages/login.astro | 27 ++++++++++++++++++++- src/pages/register.astro | 27 ++++++++++++++++++++- 5 files changed, 105 insertions(+), 34 deletions(-) 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")) { + +