123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // 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";
- // 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 { LocationsManagementApi } from "#api/locations-management-api.js";
- import { CheckPermissionsService } from "#modules/permissions-management/check-permissions-service.js";
- import { RouterUtils } from "#utils/router-utils.js";
- dayjs.extend(utc);
- router.post("/create-location", async (req, res, next) => {
- try {
- // валидация запроса
- const { name, eventId, rooms } =
- LocationsManagementApi.ZCreateLocation.req.parse(req.body);
- const userId = UserUtils.getUserFromReq(req).userId;
- await CheckPermissionsService.checkEntityPermission(
- eventId,
- userId,
- "edit_event",
- "edit_event_true",
- );
- const locationId = uuidv7();
- // location
- await db.query(
- sql.unsafe`
- insert into locations_management.locations
- (location_id, name, event_id)
- values
- (${locationId}, ${name}, ${eventId})`,
- );
- // rooms
- for (const room of rooms) {
- const roomId = uuidv7();
- await db.query(
- sql.unsafe`
- insert into locations_management.rooms
- (room_id, location_id, name, parent_id)
- values
- (${roomId}, ${locationId}, ${room.name}, ${room.parentId})
- `,
- );
- }
- RouterUtils.validAndSendResponse(
- LocationsManagementApi.ZCreateLocation.res,
- res,
- {
- code: "success",
- },
- );
- } catch (e) {
- next(e);
- }
- });
- router.post("/get-event-locations", async (req, res, next) => {
- try {
- // валидация запроса
- const { eventId } = LocationsManagementApi.ZGetEventLocations.req.parse(
- req.body,
- );
- const userId = UserUtils.getUserFromReq(req).userId;
- await CheckPermissionsService.checkEntityPermission(
- eventId,
- userId,
- "edit_event",
- "edit_event_true",
- );
- const locations = await db.any(
- sql.type(
- z.object({
- location_id: ZDbShema.locations_management.locations.location_id,
- name: ZDbShema.locations_management.locations.name,
- rooms: z.array(
- z.object({
- room_id: ZDbShema.locations_management.rooms.room_id,
- name: ZDbShema.locations_management.rooms.name,
- parent_id: ZDbShema.locations_management.rooms.parent_id,
- }),
- ),
- }),
- )`
- SELECT
- l.location_id,
- l.name,
- COALESCE(
- json_agg(
- jsonb_build_object(
- 'room_id', r.room_id,
- 'name', r.name,
- 'parent_id', r.parent_id
- )
- ) FILTER (WHERE r.room_id IS NOT NULL),
- '[]'::json
- ) AS rooms
- FROM locations_management.locations l
- LEFT JOIN locations_management.rooms r ON l.location_id = r.location_id
- WHERE l.event_id = ${eventId}
- GROUP BY l.location_id, l.name;
- `,
- );
- RouterUtils.validAndSendResponse(
- LocationsManagementApi.ZGetEventLocations.res,
- res,
- {
- code: "success",
- locations: [...locations],
- },
- );
- } catch (e) {
- next(e);
- }
- });
|