|
@@ -5,11 +5,11 @@ export default router;
|
|
|
|
|
|
// db
|
|
|
import { db } from "#db";
|
|
|
-import { ZDbShema } from "#db-shema";
|
|
|
+import { DbShema } from "#db-shema";
|
|
|
import { sql } from "slonik";
|
|
|
|
|
|
// api
|
|
|
-import { EventsManagementApi } from "#api/events-management-api.js";
|
|
|
+import { EventsManagementApi } from "#api";
|
|
|
|
|
|
// error
|
|
|
import { ApiError } from "#exceptions/api-error.ts";
|
|
@@ -27,62 +27,38 @@ import { z } from "zod";
|
|
|
import { v7 as uuidv7 } from "uuid";
|
|
|
// import { logger } from "#logger";
|
|
|
import { UserUtils } from "#utils/user-utils.js";
|
|
|
-import { CheckPermissionsService } from "#modules/permissions-management/check-permissions-service.js";
|
|
|
-import { EntityesService } from "#modules/entities-management/entityes-service.js";
|
|
|
import { RouterUtils } from "#utils/router-utils.js";
|
|
|
-import { AllPermissionsValues } from "#modules/permissions-management/permissions-types.js";
|
|
|
+import { CompaniesService } from "#modules/companies-management/companies-service.js";
|
|
|
+import { EventsService } from "./events-service.js";
|
|
|
|
|
|
dayjs.extend(utc);
|
|
|
|
|
|
-router.post("/create-event", async (req, res, next) => {
|
|
|
+router.post("/event", async (req, res, next) => {
|
|
|
try {
|
|
|
// валидация запроса
|
|
|
- const { localName, dates, timezone, companyId, rolesToAdd, staff } =
|
|
|
- EventsManagementApi.ZCreateEvent.req.parse(req.body);
|
|
|
+ const { localName, dates, timezone, companyId } =
|
|
|
+ EventsManagementApi.POST_Event.req.parse(req.body);
|
|
|
|
|
|
const userId = UserUtils.getUserFromReq(req).userId;
|
|
|
|
|
|
- // проверка прав
|
|
|
- await CheckPermissionsService.checkEntityPermission(
|
|
|
- companyId,
|
|
|
+ const company = await CompaniesService.checkCompanyAccess(
|
|
|
userId,
|
|
|
- "create_event",
|
|
|
- "create_event_true",
|
|
|
+ companyId,
|
|
|
);
|
|
|
|
|
|
// если тз не указана, то ставим тз компании
|
|
|
let tz = timezone;
|
|
|
if (!tz) {
|
|
|
- const userTz = (
|
|
|
- await db.one(
|
|
|
- sql.type(
|
|
|
- z.object({
|
|
|
- timezone: ZDbShema.companies_management.companies.timezone,
|
|
|
- }),
|
|
|
- )`
|
|
|
- select
|
|
|
- timezone
|
|
|
- from
|
|
|
- companies_management.companies
|
|
|
- where
|
|
|
- company_id = ${companyId}`,
|
|
|
- )
|
|
|
- ).timezone;
|
|
|
-
|
|
|
- tz = userTz;
|
|
|
+ tz = company.timezone;
|
|
|
}
|
|
|
//
|
|
|
|
|
|
const eventId = uuidv7();
|
|
|
|
|
|
- // создаём ентити
|
|
|
- // TODO заменить на процедуру
|
|
|
- await EntityesService.createEntity(eventId, "event");
|
|
|
-
|
|
|
// создаём ивент
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- insert into events_management.events
|
|
|
+ insert into ev.events
|
|
|
(event_id, local_name, timezone, company_id)
|
|
|
values
|
|
|
(${eventId}, ${localName}, ${tz}, ${companyId})`,
|
|
@@ -92,129 +68,57 @@ router.post("/create-event", async (req, res, next) => {
|
|
|
for (const date of dates) {
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- insert into events_management.event_dates
|
|
|
+ insert into ev.event_dates
|
|
|
(event_id, date)
|
|
|
values
|
|
|
(${eventId}, ${date})`,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- // вставляем новые роли ивента
|
|
|
- for (const role of rolesToAdd) {
|
|
|
- // роль
|
|
|
- await db.query(
|
|
|
- sql.unsafe`
|
|
|
- insert into
|
|
|
- permissions_management.roles
|
|
|
- (role_id, name, description, entity_id, is_system)
|
|
|
- values
|
|
|
- (${role.roleId}, ${role.name}, ${role.description}, ${eventId}, false)`,
|
|
|
- );
|
|
|
-
|
|
|
- // права
|
|
|
- for (const permission of role.permissions) {
|
|
|
- await db.query(
|
|
|
- sql.unsafe`
|
|
|
- insert into permissions_management.non_default_roles_overrides
|
|
|
- (entity_id, role_id, permission_id, permission_value_id)
|
|
|
- values
|
|
|
- (${eventId}, ${role.roleId}, ${permission.permissionId}, ${permission.permissionValueId})
|
|
|
- `,
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // добавляем юзеров
|
|
|
-
|
|
|
- for (const user of staff) {
|
|
|
- await db.query(
|
|
|
- sql.unsafe`
|
|
|
- insert into
|
|
|
- permissions_management.user_roles
|
|
|
- (user_id, role_id, entity_id)
|
|
|
- values
|
|
|
- (${user.userId}, ${user.roleId}, ${eventId})`,
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- RouterUtils.validAndSendResponse(
|
|
|
- EventsManagementApi.ZCreateEvent.res,
|
|
|
- res,
|
|
|
- {
|
|
|
- code: "success",
|
|
|
- event_id: eventId,
|
|
|
- },
|
|
|
+ // менеджер
|
|
|
+ await db.query(
|
|
|
+ sql.unsafe`
|
|
|
+ insert into ev.event_managers
|
|
|
+ (event_id, user_id)
|
|
|
+ values
|
|
|
+ (${eventId}, ${userId})`,
|
|
|
);
|
|
|
- } catch (e) {
|
|
|
- next(e);
|
|
|
- }
|
|
|
-});
|
|
|
-
|
|
|
-router.post("/get-event-system-roles", async (req, res, next) => {
|
|
|
- try {
|
|
|
- const systemRoles = await db.any(sql.type(
|
|
|
- z.object({
|
|
|
- role_id: ZDbShema.permissions_management.roles.role_id,
|
|
|
- name: ZDbShema.permissions_management.roles.name,
|
|
|
- description: ZDbShema.permissions_management.roles.description,
|
|
|
- }),
|
|
|
- )`
|
|
|
- select
|
|
|
- *
|
|
|
- from
|
|
|
- permissions_management.roles
|
|
|
- where
|
|
|
- is_system = true
|
|
|
- and entity_type_id = 'event'
|
|
|
- `);
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(
|
|
|
- EventsManagementApi.ZGetEventSystemRoles.res,
|
|
|
- res,
|
|
|
- {
|
|
|
- code: "success",
|
|
|
- roles: [...systemRoles],
|
|
|
- },
|
|
|
- );
|
|
|
+ RouterUtils.validAndSendResponse(EventsManagementApi.POST_Event.res, res, {
|
|
|
+ code: "success",
|
|
|
+ eventId: eventId,
|
|
|
+ });
|
|
|
} catch (e) {
|
|
|
next(e);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-router.post("/get-event", async (req, res, next) => {
|
|
|
+router.get("/event/:eventId", async (req, res, next) => {
|
|
|
try {
|
|
|
// валидация запроса
|
|
|
- const { eventId } = EventsManagementApi.ZGetEvent.req.parse(req.body);
|
|
|
+ const { eventId } = EventsManagementApi.GET_Event.req.parse(req.params);
|
|
|
const userId = UserUtils.getUserFromReq(req).userId;
|
|
|
|
|
|
- // проверка прав
|
|
|
- await CheckPermissionsService.checkEntityPermission(
|
|
|
- eventId,
|
|
|
- userId,
|
|
|
- "view_event",
|
|
|
- "view_event_true",
|
|
|
- );
|
|
|
+ await EventsService.checkEventAccess(userId, eventId);
|
|
|
|
|
|
- // TODO проверить везде ARRAY_AGG
|
|
|
// event
|
|
|
- const DbEventsTypes = ZDbShema.events_management.events;
|
|
|
const event = await db.maybeOne(
|
|
|
sql.type(
|
|
|
z.object({
|
|
|
- event_id: DbEventsTypes.event_id,
|
|
|
- local_name: DbEventsTypes.local_name,
|
|
|
- timezone: DbEventsTypes.timezone,
|
|
|
- dates: z.array(ZDbShema.events_management.event_dates.date),
|
|
|
+ eventId: DbShema.ev.events.eventId,
|
|
|
+ localName: DbShema.ev.events.localName,
|
|
|
+ timezone: DbShema.ev.events.timezone,
|
|
|
+ dates: z.array(DbShema.ev.eventDates.date),
|
|
|
}),
|
|
|
)`
|
|
|
select
|
|
|
- e.event_id,
|
|
|
- e.local_name,
|
|
|
+ e.event_id as "eventId",
|
|
|
+ e.local_name as "localName",
|
|
|
e.timezone,
|
|
|
COALESCE(ARRAY_REMOVE(ARRAY_AGG(ed."date"), NULL), '{}') AS dates
|
|
|
from
|
|
|
- events_management.events e
|
|
|
- left join events_management.event_dates ed on
|
|
|
+ ev.events e
|
|
|
+ left join ev.event_dates ed on
|
|
|
e.event_id = ed.event_id
|
|
|
where
|
|
|
e.event_id = ${eventId}
|
|
@@ -224,147 +128,124 @@ router.post("/get-event", async (req, res, next) => {
|
|
|
e.timezone;
|
|
|
`,
|
|
|
);
|
|
|
-
|
|
|
if (!event) throw ApiError.BadRequest("EventNotFound", "Ивент не найден");
|
|
|
|
|
|
// points
|
|
|
- const DbPointsType = ZDbShema.events_management.program_points;
|
|
|
+ const DbPointsType = DbShema.ev.programPoints;
|
|
|
const programPoints = await db.any(
|
|
|
sql.type(
|
|
|
z.object({
|
|
|
- program_point_id: DbPointsType.program_point_id,
|
|
|
+ programPointId: DbPointsType.programPointId,
|
|
|
name: DbPointsType.name,
|
|
|
- start_date: DbPointsType.start_date,
|
|
|
- end_date: DbPointsType.end_date,
|
|
|
- room_id: DbPointsType.room_id,
|
|
|
- is_internal: DbPointsType.is_internal,
|
|
|
+ startDate: DbPointsType.startDate,
|
|
|
+ endDate: DbPointsType.endDate,
|
|
|
+ roomId: DbPointsType.roomId,
|
|
|
+ isInternal: DbPointsType.isInternal,
|
|
|
}),
|
|
|
)`
|
|
|
select
|
|
|
- program_point_id,
|
|
|
+ program_point_id as "programPointId",
|
|
|
name,
|
|
|
- start_date,
|
|
|
- end_date,
|
|
|
- room_id,
|
|
|
- is_internal
|
|
|
+ start_date as "startDate",
|
|
|
+ end_date as "endDate",
|
|
|
+ room_id as "roomId",
|
|
|
+ is_internal as "isInternal"
|
|
|
from
|
|
|
- events_management.program_points
|
|
|
+ ev.program_points
|
|
|
where
|
|
|
event_id = ${eventId}
|
|
|
`,
|
|
|
);
|
|
|
|
|
|
- // комнаты ивента
|
|
|
- const eventRoomsIds: string[] = programPoints
|
|
|
- .map((point) => point.room_id)
|
|
|
- .filter((roomId) => roomId !== null);
|
|
|
-
|
|
|
- //
|
|
|
// rooms
|
|
|
- let rooms: readonly {
|
|
|
- name: string;
|
|
|
- room_id: string;
|
|
|
- }[] = [];
|
|
|
-
|
|
|
- // TODO ошибка в in?
|
|
|
- if (eventRoomsIds.length > 0) {
|
|
|
- rooms = await db.any(
|
|
|
- sql.type(
|
|
|
- z.object({
|
|
|
- room_id: ZDbShema.locations_management.rooms.room_id,
|
|
|
- name: ZDbShema.locations_management.rooms.name,
|
|
|
- location_id: ZDbShema.locations_management.rooms.location_id,
|
|
|
- }),
|
|
|
- )`
|
|
|
+ const rooms = await db.any(
|
|
|
+ sql.type(
|
|
|
+ z.object({
|
|
|
+ roomId: DbShema.ev.rooms.roomId,
|
|
|
+ name: DbShema.ev.rooms.name,
|
|
|
+ locationId: DbShema.ev.rooms.locationId,
|
|
|
+ }),
|
|
|
+ )`
|
|
|
select
|
|
|
- room_id, name, location_id
|
|
|
+ r.room_id as "roomId",
|
|
|
+ r.name,
|
|
|
+ r.location_id as "locationId"
|
|
|
from
|
|
|
- locations_management.rooms
|
|
|
+ ev.rooms r
|
|
|
+ join ev.locations l on
|
|
|
+ l.location_id = r.location_id
|
|
|
where
|
|
|
- room_id in (${sql.join(eventRoomsIds, sql.fragment`, `)})
|
|
|
+ l.event_id = ${eventId}
|
|
|
`,
|
|
|
- );
|
|
|
- }
|
|
|
+ );
|
|
|
|
|
|
// task-blocks
|
|
|
- // TODO вынести
|
|
|
- const REQUIRED_TB_PERMISSION: AllPermissionsValues = "view_task_block_true";
|
|
|
+ // TODO: вынести
|
|
|
const taskBlocks = await db.any(
|
|
|
sql.type(
|
|
|
z.object({
|
|
|
- task_block_id: ZDbShema.tasks_management.task_blocks.task_block_id,
|
|
|
- name: ZDbShema.tasks_management.task_blocks.name,
|
|
|
+ taskBlockId: DbShema.ev.taskBlocks.taskBlockId,
|
|
|
+ name: DbShema.ev.taskBlocks.name,
|
|
|
}),
|
|
|
)`
|
|
|
select
|
|
|
- tb.task_block_id,
|
|
|
+ tb.task_block_id as "taskBlockId",
|
|
|
tb.name
|
|
|
from
|
|
|
- tasks_management.task_blocks tb
|
|
|
- -- permissions
|
|
|
- join permissions_management.cached_user_permissions cup on
|
|
|
- tb.task_block_id = cup.entity_id
|
|
|
+ ev.task_blocks tb
|
|
|
where
|
|
|
- tb.event_id = ${eventId} and
|
|
|
- cup.user_id = ${userId} and
|
|
|
- cup.permission_value_id = ${REQUIRED_TB_PERMISSION}
|
|
|
+ tb.event_id = ${eventId}
|
|
|
`,
|
|
|
);
|
|
|
|
|
|
- const staff = await db.any(
|
|
|
+ const managers = await db.any(
|
|
|
sql.type(
|
|
|
z.object({
|
|
|
- user_id: ZDbShema.users_management.users.user_id,
|
|
|
- name: ZDbShema.users_management.users.name,
|
|
|
- role_id: ZDbShema.permissions_management.roles.role_id,
|
|
|
- role_name: ZDbShema.permissions_management.roles.name,
|
|
|
+ userId: DbShema.ev.eventManagers.userId,
|
|
|
+ name: DbShema.usr.users.name,
|
|
|
+ email: DbShema.usr.users.email,
|
|
|
}),
|
|
|
)`
|
|
|
select
|
|
|
- u.user_id,
|
|
|
+ em.user_id as "userId",
|
|
|
u.name,
|
|
|
- ur.role_id,
|
|
|
- r.name as role_name
|
|
|
- from
|
|
|
- users_management.users u
|
|
|
- join permissions_management.user_roles ur on
|
|
|
- u.user_id = ur.user_id
|
|
|
- join permissions_management.roles r on
|
|
|
- r.role_id = ur.role_id
|
|
|
- where ur.entity_id = ${eventId}
|
|
|
+ u.email
|
|
|
+ from
|
|
|
+ ev.event_managers em
|
|
|
+ join
|
|
|
+ usr.users u on
|
|
|
+ em.user_id = u.user_id
|
|
|
+ where
|
|
|
+ em.event_id = ${eventId}
|
|
|
`,
|
|
|
);
|
|
|
|
|
|
const roles = await db.any(
|
|
|
sql.type(
|
|
|
z.object({
|
|
|
- role_id: ZDbShema.permissions_management.roles.role_id,
|
|
|
- name: ZDbShema.permissions_management.roles.name,
|
|
|
- description: ZDbShema.permissions_management.roles.description,
|
|
|
- is_system: ZDbShema.permissions_management.roles.is_system,
|
|
|
+ roleId: DbShema.ev.roles.roleId,
|
|
|
+ name: DbShema.ev.roles.name,
|
|
|
}),
|
|
|
)`
|
|
|
select
|
|
|
- r.role_id,
|
|
|
- r.name,
|
|
|
- r.description,
|
|
|
- r.is_system
|
|
|
+ r.role_id as "roleId",
|
|
|
+ r.name
|
|
|
from
|
|
|
- permissions_management.roles r
|
|
|
+ ev.roles r
|
|
|
where
|
|
|
- entity_type_id = 'event' and (is_system or entity_id = ${eventId})
|
|
|
+ r.event_id = ${eventId}
|
|
|
`,
|
|
|
);
|
|
|
|
|
|
// res
|
|
|
- RouterUtils.validAndSendResponse(EventsManagementApi.ZGetEvent.res, res, {
|
|
|
+ RouterUtils.validAndSendResponse(EventsManagementApi.GET_Event.res, res, {
|
|
|
code: "success",
|
|
|
event: {
|
|
|
...event,
|
|
|
programPoints: [...programPoints],
|
|
|
rooms: [...rooms],
|
|
|
taskBlocks: [...taskBlocks],
|
|
|
- staff: [...staff],
|
|
|
+ managers: [...managers],
|
|
|
roles: [...roles],
|
|
|
},
|
|
|
});
|
|
@@ -373,28 +254,22 @@ router.post("/get-event", async (req, res, next) => {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-router.post("/create-program-point", async (req, res, next) => {
|
|
|
+router.post("/program-point", async (req, res, next) => {
|
|
|
try {
|
|
|
// валидация запроса
|
|
|
const { name, startDate, endDate, eventId, roomId, isInternal } =
|
|
|
- EventsManagementApi.ZCreateProgramPoint.req.parse(req.body);
|
|
|
+ EventsManagementApi.POST_ProgramPoint.req.parse(req.body);
|
|
|
|
|
|
const userId = UserUtils.getUserFromReq(req).userId;
|
|
|
|
|
|
// проверка прав
|
|
|
- await CheckPermissionsService.checkEntityPermission(
|
|
|
- eventId,
|
|
|
- userId,
|
|
|
- "edit_event",
|
|
|
- "edit_event_true",
|
|
|
- );
|
|
|
+ await EventsService.checkEventAccess(userId, eventId);
|
|
|
|
|
|
const programPointId = uuidv7();
|
|
|
|
|
|
- // event
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- insert into events_management.program_points
|
|
|
+ insert into ev.program_points
|
|
|
(program_point_id, name, start_date, end_date, room_id, event_id, is_internal)
|
|
|
values
|
|
|
(${programPointId}, ${name}, ${startDate}, ${endDate}, ${roomId}, ${eventId}, ${isInternal})
|
|
@@ -402,41 +277,37 @@ router.post("/create-program-point", async (req, res, next) => {
|
|
|
);
|
|
|
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- EventsManagementApi.ZCreateProgramPoint.res,
|
|
|
+ EventsManagementApi.POST_ProgramPoint.res,
|
|
|
res,
|
|
|
- { code: "success" },
|
|
|
+ { code: "success", programPointId },
|
|
|
);
|
|
|
} catch (e) {
|
|
|
next(e);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-router.post("/update-event", async (req, res, next) => {
|
|
|
+router.patch("/event", async (req, res, next) => {
|
|
|
try {
|
|
|
// валидация запроса
|
|
|
- const { eventId, localName, dates, timezone, programPoint } =
|
|
|
- EventsManagementApi.ZUpdateEvent.req.parse(req.body);
|
|
|
+ const { eventId, localName, dates, timezone, programPoint, role } =
|
|
|
+ EventsManagementApi.PATCH_Event.req.parse(req.body);
|
|
|
|
|
|
const userId = UserUtils.getUserFromReq(req).userId;
|
|
|
|
|
|
// проверка прав
|
|
|
- await CheckPermissionsService.checkEntityPermission(
|
|
|
- eventId,
|
|
|
- userId,
|
|
|
- "edit_event",
|
|
|
- "edit_event_true",
|
|
|
- );
|
|
|
+ await EventsService.checkEventAccess(userId, eventId);
|
|
|
|
|
|
// change localName, timezone
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- update events_management.events
|
|
|
+ update ev.events
|
|
|
set
|
|
|
${sql.join(
|
|
|
[
|
|
|
localName
|
|
|
? sql.unsafe`local_name = ${localName}`
|
|
|
: sql.unsafe`local_name = local_name`,
|
|
|
+
|
|
|
timezone
|
|
|
? sql.unsafe`timezone = ${timezone}`
|
|
|
: sql.unsafe`timezone = timezone`,
|
|
@@ -451,7 +322,7 @@ router.post("/update-event", async (req, res, next) => {
|
|
|
if (dates) {
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- delete from events_management.event_dates
|
|
|
+ delete from ev.event_dates
|
|
|
where
|
|
|
event_id = ${eventId}`,
|
|
|
);
|
|
@@ -459,7 +330,7 @@ router.post("/update-event", async (req, res, next) => {
|
|
|
for (const date of dates) {
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- insert into events_management.event_dates
|
|
|
+ insert into ev.event_dates
|
|
|
(event_id, date)
|
|
|
values
|
|
|
(${eventId}, ${date})`,
|
|
@@ -467,10 +338,11 @@ router.post("/update-event", async (req, res, next) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // TODO: преверить безопасность pp и roles
|
|
|
if (programPoint) {
|
|
|
await db.query(
|
|
|
sql.unsafe`
|
|
|
- update events_management.program_points
|
|
|
+ update ev.program_points
|
|
|
set
|
|
|
name = ${programPoint.name},
|
|
|
start_date = ${programPoint.startDate},
|
|
@@ -481,13 +353,50 @@ router.post("/update-event", async (req, res, next) => {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(
|
|
|
- EventsManagementApi.ZUpdateEvent.res,
|
|
|
- res,
|
|
|
- {
|
|
|
- code: "success",
|
|
|
- },
|
|
|
+ if (role) {
|
|
|
+ await db.query(
|
|
|
+ sql.unsafe`
|
|
|
+ update ev.roles
|
|
|
+ set
|
|
|
+ name = ${role.name}
|
|
|
+ where
|
|
|
+ role_id = ${role.roleId}`,
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ RouterUtils.validAndSendResponse(EventsManagementApi.PATCH_Event.res, res, {
|
|
|
+ code: "success",
|
|
|
+ });
|
|
|
+ } catch (e) {
|
|
|
+ next(e);
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.post("/role", async (req, res, next) => {
|
|
|
+ try {
|
|
|
+ // валидация запроса
|
|
|
+ const { name, eventId } = EventsManagementApi.POST_Role.req.parse(req.body);
|
|
|
+
|
|
|
+ const userId = UserUtils.getUserFromReq(req).userId;
|
|
|
+
|
|
|
+ // проверка прав
|
|
|
+ await EventsService.checkEventAccess(userId, eventId);
|
|
|
+
|
|
|
+ const roleId = uuidv7();
|
|
|
+
|
|
|
+ // create role
|
|
|
+ await db.query(
|
|
|
+ sql.unsafe`
|
|
|
+ insert into ev.roles
|
|
|
+ (role_id, name, event_id)
|
|
|
+ values
|
|
|
+ (${roleId}, ${name}, ${eventId})`,
|
|
|
);
|
|
|
+
|
|
|
+ RouterUtils.validAndSendResponse(EventsManagementApi.POST_Role.res, res, {
|
|
|
+ code: "success",
|
|
|
+ roleId,
|
|
|
+ });
|
|
|
} catch (e) {
|
|
|
next(e);
|
|
|
}
|