// 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); } });