123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- // router
- import express from "express";
- const router = express.Router();
- export default router;
- // db
- import { db } from "#db";
- import { ZDbShema } from "#db-shema";
- import { sql } from "slonik";
- // api
- import { CompanyManagementApi } from "#api/companies-management-api.js";
- // error
- // import { ApiError } from "#exceptions/api-error.ts";
- // dayjs
- import dayjs from "dayjs";
- import utc from "dayjs/plugin/utc.js";
- dayjs.extend(utc);
- import timezone from "dayjs/plugin/timezone.js";
- dayjs.extend(timezone);
- // other
- import { z } from "zod";
- import { v7 as uuidv7 } from "uuid";
- // import { logger } from "#logger";
- import { UserUtils } from "#utils/user-utils.js";
- import { EntityesService } from "#modules/entities-management/entityes-service.js";
- import { RouterUtils } from "#utils/router-utils.js";
- import { ApiError } from "#exceptions/api-error.js";
- import { CompaniesService } from "./companies-service.js";
- import { CheckPermissionsService } from "#modules/permissions-management/check-permissions-service.js";
- import { config } from "#config";
- dayjs.extend(utc);
- // TODO транзакции
- router.post("/create-company", async (req, res, next) => {
- try {
- // валидация запроса
- const { name, timezone } = CompanyManagementApi.ZCreateCompany.req.parse(
- req.body,
- );
- const userId = UserUtils.getUserFromReq(req).userId;
- const companyId = uuidv7();
- // entity
- await EntityesService.createEntity(companyId, "company");
- // company
- await db.query(
- sql.unsafe`
- insert into companies_management.companies
- (company_id, name, owner_id, timezone)
- values
- (${companyId}, ${name}, ${userId}, ${timezone})`,
- );
- // добавляем юзера в компанию
- const MANAGER_ROLE_ID = config.COMPANY_DEFAULT_ROLE_MANAGER_ID;
- if (!MANAGER_ROLE_ID) {
- throw Error("COMPANY_DEFAULT_ROLE_MANAGER_ID is not defined");
- }
- await db.query(
- sql.unsafe`
- insert into permissions_management.user_roles
- (user_id, role_id, entity_id)
- values
- (${userId}, ${MANAGER_ROLE_ID}, ${companyId})`,
- );
- RouterUtils.validAndSendResponse(
- CompanyManagementApi.ZCreateCompany.res,
- res,
- { code: "success" },
- );
- } catch (e) {
- next(e);
- }
- });
- router.post("/get-user-companies", async (req, res, next) => {
- try {
- const userId = UserUtils.getUserFromReq(req).userId;
- const companies = await db.any(
- sql.type(
- z.object({
- company_id: ZDbShema.companies_management.companies.company_id,
- name: ZDbShema.companies_management.companies.name,
- owner_id: ZDbShema.companies_management.companies.owner_id,
- timezone: ZDbShema.companies_management.companies.timezone,
- }),
- )`
- select
- c.company_id,
- c."name",
- c.owner_id,
- c.timezone
- from
- companies_management.companies c
- join permissions_management.cached_user_permissions cup on
- c.company_id = cup.entity_id
- where
- cup.user_id = ${userId} and entity_type_id = 'company' and permission_id = 'view_company' and permission_value_id = 'view_company_true'
- `,
- );
- RouterUtils.validAndSendResponse(
- CompanyManagementApi.ZGetUserCompanies.res,
- res,
- { code: "success", companies: [...companies] },
- );
- } catch (e) {
- next(e);
- }
- });
- router.post("/get-company", async (req, res, next) => {
- try {
- // валидация запроса
- const { companyId } = CompanyManagementApi.ZGetCompany.req.parse(req.body);
- const userId = UserUtils.getUserFromReq(req).userId;
- await CheckPermissionsService.checkEntityPermission(
- companyId,
- userId,
- "view_company",
- "view_company_true",
- );
- const company = await db.maybeOne(
- sql.type(
- z.object({
- company_id: ZDbShema.companies_management.companies.company_id,
- name: ZDbShema.companies_management.companies.name,
- owner_id: ZDbShema.companies_management.companies.owner_id,
- timezone: ZDbShema.companies_management.companies.timezone,
- employees: z.array(
- z.object({
- user_id: ZDbShema.permissions_management.user_roles.user_id,
- user_name: ZDbShema.users_management.users.name,
- role_id: ZDbShema.permissions_management.user_roles.role_id,
- role_name: ZDbShema.permissions_management.roles.name,
- }),
- ),
- }),
- )`
- select
- c.company_id,
- c."name",
- c.owner_id,
- c.timezone,
- coalesce(
- json_agg(
- json_build_object(
- 'user_id',
- ur.user_id,
- 'user_name',
- u.name,
- 'role_id',
- ur.role_id,
- 'role_name',
- r."name"
- )
- ) filter (
- where
- ur.user_id is not null),
- '[]'::json
- ) as employees
- from
- companies_management.companies c
- left join permissions_management.user_roles ur on
- c.company_id = ur.entity_id
- join permissions_management.roles r on
- ur.role_id = r.role_id
- join users_management.users u on
- ur.user_id = u.user_id
- where
- c.company_id = ${companyId}
- group by
- c.company_id
- `,
- );
- if (!company) {
- throw ApiError.BadRequest("Company not found", "Компания не найдена");
- }
- const REQUIRED_PERMISSION = "view_event_true";
- const events = await CompaniesService.getUserCompanyEvents(
- userId,
- company.company_id,
- REQUIRED_PERMISSION,
- );
- RouterUtils.validAndSendResponse(
- CompanyManagementApi.ZGetCompany.res,
- res,
- { code: "success", company: { ...company, events: [...events] } },
- );
- } catch (e) {
- next(e);
- }
- });
|