companies-router.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // router
  2. import express from "express";
  3. const router = express.Router();
  4. export default router;
  5. // db
  6. import { db } from "#db";
  7. import { ZDbShema } from "#db-shema";
  8. import { sql } from "slonik";
  9. // api
  10. import { CompanyManagementApi } from "#api/companies-management-api.js";
  11. // error
  12. // import { ApiError } from "#exceptions/api-error.ts";
  13. // dayjs
  14. import dayjs from "dayjs";
  15. import utc from "dayjs/plugin/utc.js";
  16. dayjs.extend(utc);
  17. import timezone from "dayjs/plugin/timezone.js";
  18. dayjs.extend(timezone);
  19. // other
  20. import { z } from "zod";
  21. import { v7 as uuidv7 } from "uuid";
  22. // import { logger } from "#logger";
  23. import { UserUtils } from "#utils/user-utils.js";
  24. import { EntityesService } from "#modules/entities-management/entityes-service.js";
  25. import { RouterUtils } from "#utils/router-utils.js";
  26. import { ApiError } from "#exceptions/api-error.js";
  27. import { CompaniesService } from "./companies-service.js";
  28. import { CheckPermissionsService } from "#modules/permissions-management/check-permissions-service.js";
  29. import { config } from "#config";
  30. dayjs.extend(utc);
  31. // TODO транзакции
  32. router.post("/create-company", async (req, res, next) => {
  33. try {
  34. // валидация запроса
  35. const { name, timezone } = CompanyManagementApi.ZCreateCompany.req.parse(
  36. req.body,
  37. );
  38. const userId = UserUtils.getUserFromReq(req).userId;
  39. const companyId = uuidv7();
  40. // entity
  41. await EntityesService.createEntity(companyId, "company");
  42. // company
  43. await db.query(
  44. sql.unsafe`
  45. insert into companies_management.companies
  46. (company_id, name, owner_id, timezone)
  47. values
  48. (${companyId}, ${name}, ${userId}, ${timezone})`,
  49. );
  50. // добавляем юзера в компанию
  51. const MANAGER_ROLE_ID = config.COMPANY_DEFAULT_ROLE_MANAGER_ID;
  52. if (!MANAGER_ROLE_ID) {
  53. throw Error("COMPANY_DEFAULT_ROLE_MANAGER_ID is not defined");
  54. }
  55. await db.query(
  56. sql.unsafe`
  57. insert into permissions_management.user_roles
  58. (user_id, role_id, entity_id)
  59. values
  60. (${userId}, ${MANAGER_ROLE_ID}, ${companyId})`,
  61. );
  62. RouterUtils.validAndSendResponse(
  63. CompanyManagementApi.ZCreateCompany.res,
  64. res,
  65. { code: "success" },
  66. );
  67. } catch (e) {
  68. next(e);
  69. }
  70. });
  71. router.post("/get-user-companies", async (req, res, next) => {
  72. try {
  73. const userId = UserUtils.getUserFromReq(req).userId;
  74. const companies = await db.any(
  75. sql.type(
  76. z.object({
  77. company_id: ZDbShema.companies_management.companies.company_id,
  78. name: ZDbShema.companies_management.companies.name,
  79. owner_id: ZDbShema.companies_management.companies.owner_id,
  80. timezone: ZDbShema.companies_management.companies.timezone,
  81. }),
  82. )`
  83. select
  84. c.company_id,
  85. c."name",
  86. c.owner_id,
  87. c.timezone
  88. from
  89. companies_management.companies c
  90. join permissions_management.cached_user_permissions cup on
  91. c.company_id = cup.entity_id
  92. where
  93. cup.user_id = ${userId} and entity_type_id = 'company' and permission_id = 'view_company' and permission_value_id = 'view_company_true'
  94. `,
  95. );
  96. RouterUtils.validAndSendResponse(
  97. CompanyManagementApi.ZGetUserCompanies.res,
  98. res,
  99. { code: "success", companies: [...companies] },
  100. );
  101. } catch (e) {
  102. next(e);
  103. }
  104. });
  105. router.post("/get-company", async (req, res, next) => {
  106. try {
  107. // валидация запроса
  108. const { companyId } = CompanyManagementApi.ZGetCompany.req.parse(req.body);
  109. const userId = UserUtils.getUserFromReq(req).userId;
  110. await CheckPermissionsService.checkEntityPermission(
  111. companyId,
  112. userId,
  113. "view_company",
  114. "view_company_true",
  115. );
  116. const company = await db.maybeOne(
  117. sql.type(
  118. z.object({
  119. company_id: ZDbShema.companies_management.companies.company_id,
  120. name: ZDbShema.companies_management.companies.name,
  121. owner_id: ZDbShema.companies_management.companies.owner_id,
  122. timezone: ZDbShema.companies_management.companies.timezone,
  123. employees: z.array(
  124. z.object({
  125. user_id: ZDbShema.permissions_management.user_roles.user_id,
  126. user_name: ZDbShema.users_management.users.name,
  127. role_id: ZDbShema.permissions_management.user_roles.role_id,
  128. role_name: ZDbShema.permissions_management.roles.name,
  129. }),
  130. ),
  131. }),
  132. )`
  133. select
  134. c.company_id,
  135. c."name",
  136. c.owner_id,
  137. c.timezone,
  138. coalesce(
  139. json_agg(
  140. json_build_object(
  141. 'user_id',
  142. ur.user_id,
  143. 'user_name',
  144. u.name,
  145. 'role_id',
  146. ur.role_id,
  147. 'role_name',
  148. r."name"
  149. )
  150. ) filter (
  151. where
  152. ur.user_id is not null),
  153. '[]'::json
  154. ) as employees
  155. from
  156. companies_management.companies c
  157. left join permissions_management.user_roles ur on
  158. c.company_id = ur.entity_id
  159. join permissions_management.roles r on
  160. ur.role_id = r.role_id
  161. join users_management.users u on
  162. ur.user_id = u.user_id
  163. where
  164. c.company_id = ${companyId}
  165. group by
  166. c.company_id
  167. `,
  168. );
  169. if (!company) {
  170. throw ApiError.BadRequest("Company not found", "Компания не найдена");
  171. }
  172. const REQUIRED_PERMISSION = "view_event_true";
  173. const events = await CompaniesService.getUserCompanyEvents(
  174. userId,
  175. company.company_id,
  176. REQUIRED_PERMISSION,
  177. );
  178. RouterUtils.validAndSendResponse(
  179. CompanyManagementApi.ZGetCompany.res,
  180. res,
  181. { code: "success", company: { ...company, events: [...events] } },
  182. );
  183. } catch (e) {
  184. next(e);
  185. }
  186. });