123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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();
|