import type { Request } from "express"; import { TokenPayload } from "#modules/users/auth/types/token-playload-type.js"; import { ApiError } from "#exceptions/api-error.js"; import { z } from "zod"; import { selPool } from "#db/db.js"; import { sql } from "slonik"; import { DbSchema } from "#db/db-schema.js"; class SessionService { // getUserFromCookies(cookies: { // userData: { // username: string; // userId: string; // }; // }) { // const userData = cookies.userData; // if (!userData) { // throw ApiError.UnauthorizedError(); // } // return userData; // } // getUserFromReq(req: Request): { userId: string; email: string; }; getUserFromReq( req: Request, isRequired: false, ): { userId: string; email: string; } | null; /** * Получает данные пользователя из запроса (req.user). * @param req - запрос * @param isRequired - если не указано, то выбрасывает ошибку, если пользователь не авторизован * @returns данные пользователя, если пользователь авторизован, иначе null */ getUserFromReq(req: Request, isRequired: boolean = true) { const userData = TokenPayload.safeParse(req.user); if (!userData.success && isRequired) { throw ApiError.UnauthorizedError(); } if (!userData.success && !isRequired) { return null; } return userData.data; } getEventFromCookies(cookies: { userData: { username: string; userId: string; }; }) { const userData = cookies.userData; if (!userData) { throw ApiError.UnauthorizedError(); } return userData; } // TODO: Добавить ограничение в БД что только один ивент может быть актуальным async getCurrentEventFromReq(req: Request) { if (!req.eventCode) { throw ApiError.UnauthorizedError(); } const eventCodeSafe = z.string().safeParse(req.eventCode); if (!eventCodeSafe.success) { throw ApiError.UnauthorizedError(); } const eventData = await selPool.maybeOne( sql.type( z.object({ eventInstId: DbSchema.ev.eventInst.eventInstId, eventId: DbSchema.ev.eventInst.eventId, code: DbSchema.ev.events.code, eventTypeCode: DbSchema.ev.eventTypes.code, privateName: DbSchema.ev.eventInst.privateName, publicName: DbSchema.ev.eventInst.publicName, timezone: DbSchema.ev.eventInst.timezone, }), )` select ei.event_inst_id as "eventInstId", ei.event_id as "eventId", e.code as "code", et.code as "eventTypeCode", ei.private_name as "privateName", ei.public_name as "publicName", ei.timezone as "timezone" from ev.events e join ev.event_inst ei on e.event_id = ei.event_id and ei.is_current = true join ev.event_types et on et.event_type_id = e.event_type_id where e.code = ${eventCodeSafe.data} `, ); if (!eventData) { throw ApiError.BadRequest("noEvent", "Ивент не найден"); } return eventData; } } export default new SessionService();