session-service.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import type { Request } from "express";
  2. import { TokenPayload } from "#modules/users/auth/types/token-playload-type.js";
  3. import { ApiError } from "#exceptions/api-error.js";
  4. import { z } from "zod";
  5. import { selPool } from "#db/db.js";
  6. import { sql } from "slonik";
  7. import { DbSchema } from "#db/db-schema.js";
  8. class SessionService {
  9. // getUserFromCookies(cookies: {
  10. // userData: {
  11. // username: string;
  12. // userId: string;
  13. // };
  14. // }) {
  15. // const userData = cookies.userData;
  16. // if (!userData) {
  17. // throw ApiError.UnauthorizedError();
  18. // }
  19. // return userData;
  20. // }
  21. //
  22. getUserFromReq(req: Request): {
  23. userId: string;
  24. email: string;
  25. };
  26. getUserFromReq(
  27. req: Request,
  28. isRequired: false,
  29. ): {
  30. userId: string;
  31. email: string;
  32. } | null;
  33. /**
  34. * Получает данные пользователя из запроса (req.user).
  35. * @param req - запрос
  36. * @param isRequired - если не указано, то выбрасывает ошибку, если пользователь не авторизован
  37. * @returns данные пользователя, если пользователь авторизован, иначе null
  38. */
  39. getUserFromReq(req: Request, isRequired: boolean = true) {
  40. const userData = TokenPayload.safeParse(req.user);
  41. if (!userData.success && isRequired) {
  42. throw ApiError.UnauthorizedError();
  43. }
  44. if (!userData.success && !isRequired) {
  45. return null;
  46. }
  47. return userData.data;
  48. }
  49. getEventFromCookies(cookies: {
  50. userData: {
  51. username: string;
  52. userId: string;
  53. };
  54. }) {
  55. const userData = cookies.userData;
  56. if (!userData) {
  57. throw ApiError.UnauthorizedError();
  58. }
  59. return userData;
  60. }
  61. // TODO: Добавить ограничение в БД что только один ивент может быть актуальным
  62. async getCurrentEventFromReq(req: Request) {
  63. if (!req.eventCode) {
  64. throw ApiError.UnauthorizedError();
  65. }
  66. const eventCodeSafe = z.string().safeParse(req.eventCode);
  67. if (!eventCodeSafe.success) {
  68. throw ApiError.UnauthorizedError();
  69. }
  70. const eventData = await selPool.maybeOne(
  71. sql.type(
  72. z.object({
  73. eventInstId: DbSchema.ev.eventInst.eventInstId,
  74. eventId: DbSchema.ev.eventInst.eventId,
  75. code: DbSchema.ev.events.code,
  76. eventTypeCode: DbSchema.ev.eventTypes.code,
  77. privateName: DbSchema.ev.eventInst.privateName,
  78. publicName: DbSchema.ev.eventInst.publicName,
  79. timezone: DbSchema.ev.eventInst.timezone,
  80. }),
  81. )`
  82. select
  83. ei.event_inst_id as "eventInstId",
  84. ei.event_id as "eventId",
  85. e.code as "code",
  86. et.code as "eventTypeCode",
  87. ei.private_name as "privateName",
  88. ei.public_name as "publicName",
  89. ei.timezone as "timezone"
  90. from
  91. ev.events e
  92. join ev.event_inst ei on
  93. e.event_id = ei.event_id
  94. and ei.is_current = true
  95. join ev.event_types et on
  96. et.event_type_id = e.event_type_id
  97. where
  98. e.code = ${eventCodeSafe.data}
  99. `,
  100. );
  101. if (!eventData) {
  102. throw ApiError.BadRequest("noEvent", "Ивент не найден");
  103. }
  104. return eventData;
  105. }
  106. }
  107. export default new SessionService();