|
@@ -14,10 +14,7 @@ import { RouterUtils } from "#utils/router-utils.js";
|
|
|
import { Request, Response } from "express";
|
|
|
import sessionService from "#modules/users/auth/services/session-service.js";
|
|
|
import { apiTypes } from "#api/current-api.js";
|
|
|
-import {
|
|
|
- addDataToValidator,
|
|
|
- validateAct,
|
|
|
-} from "./validators/act-validators.js";
|
|
|
+import { validateActValidators } from "./validators/act-validators.js";
|
|
|
import {
|
|
|
CustomFieldWithUserCopyValue,
|
|
|
CustomFieldWithValidators,
|
|
@@ -26,6 +23,9 @@ import { ApiError } from "#exceptions/api-error.js";
|
|
|
|
|
|
import { cCustomFieldsValidateService } from "../custom-fields/c-cf-validate-service.js";
|
|
|
import { v7 } from "uuid";
|
|
|
+import { cPeService } from "./participant-entities/c-pe-service.js";
|
|
|
+import { cActService } from "./c-act-service.js";
|
|
|
+import { validatePeForAct } from "./validators/act-pe-validators.js";
|
|
|
|
|
|
class ClientActivitiesController {
|
|
|
async getEventActivities(
|
|
@@ -95,7 +95,7 @@ class ClientActivitiesController {
|
|
|
...activity,
|
|
|
validators: await Promise.all(
|
|
|
activity.validators.map(async (validator) =>
|
|
|
- addDataToValidator(validator, activity.activityId),
|
|
|
+ cActService.addDataToActValidator(validator, activity.activityId),
|
|
|
),
|
|
|
),
|
|
|
};
|
|
@@ -175,7 +175,7 @@ class ClientActivitiesController {
|
|
|
...activity,
|
|
|
validators: await Promise.all(
|
|
|
activity.validators.map(async (validator) =>
|
|
|
- addDataToValidator(validator, activity.activityId),
|
|
|
+ cActService.addDataToActValidator(validator, activity.activityId),
|
|
|
),
|
|
|
),
|
|
|
};
|
|
@@ -292,9 +292,19 @@ class ClientActivitiesController {
|
|
|
|
|
|
const files = req.files;
|
|
|
|
|
|
+ // проверка доступа
|
|
|
+ const user = sessionService.getUserFromReq(req);
|
|
|
+ const isOwner = await cPeService.checkPeOwner(user.userId, peId);
|
|
|
+ if (!isOwner) throw ApiError.ForbiddenError();
|
|
|
+
|
|
|
const actRegData = await selPool.maybeOne(sql.type(
|
|
|
z.object({
|
|
|
activityId: DbSchema.act.activities.activityId,
|
|
|
+ code: DbSchema.act.activities.code,
|
|
|
+ publicName: DbSchema.act.activities.publicName,
|
|
|
+ eventInstId: DbSchema.act.activities.eventInstId,
|
|
|
+ categoryId: DbSchema.act.activities.categoryId,
|
|
|
+ categoryCode: DbSchema.act.activityCategories.code,
|
|
|
validators: z.array(apiTypes.activities.ActValidator),
|
|
|
peTypes: z.array(
|
|
|
z.object({
|
|
@@ -310,6 +320,11 @@ class ClientActivitiesController {
|
|
|
)`
|
|
|
select
|
|
|
a.activity_id "activityId",
|
|
|
+ a.code,
|
|
|
+ a.public_name "publicName",
|
|
|
+ a.event_inst_id "eventInstId",
|
|
|
+ a.category_id "categoryId",
|
|
|
+ a.category_code "categoryCode",
|
|
|
a.validators,
|
|
|
a.pe_types "peTypes",
|
|
|
coalesce(f.fields, '[]'::jsonb) "fields"
|
|
@@ -343,56 +358,42 @@ class ClientActivitiesController {
|
|
|
"Данные для регистрации на мероприятии не найдены",
|
|
|
);
|
|
|
|
|
|
- const validators = await Promise.all(
|
|
|
+ //
|
|
|
+ // -- ВАЛИДАЦИЯ --
|
|
|
+ const validatorsWithData = await Promise.all(
|
|
|
actRegData.validators.map(
|
|
|
async (validator) =>
|
|
|
- await addDataToValidator(validator, actRegData.activityId),
|
|
|
+ await cActService.addDataToActValidator(
|
|
|
+ validator,
|
|
|
+ actRegData.activityId,
|
|
|
+ ),
|
|
|
),
|
|
|
);
|
|
|
+ // валидация активности
|
|
|
|
|
|
- // валидация типа pe
|
|
|
-
|
|
|
- const peTypeCode = await selPool.maybeOneFirst(sql.type(
|
|
|
- z.object({
|
|
|
- code: z.string(),
|
|
|
- }),
|
|
|
- )`
|
|
|
- select
|
|
|
- pt.code
|
|
|
- from
|
|
|
- act.part_entities p
|
|
|
- left join act.pe_types pt on
|
|
|
- p.pe_type_id = pt.pe_type_id
|
|
|
- where
|
|
|
- p.pe_id = ${peId}
|
|
|
- `);
|
|
|
- if (!peTypeCode)
|
|
|
+ const validatedActivity = validateActValidators(validatorsWithData);
|
|
|
+ if (!validatedActivity.isOpen)
|
|
|
throw ApiError.BadRequest(
|
|
|
- "peTypeNotFound",
|
|
|
- "Тип сущности участия не найден",
|
|
|
+ "actValidatorFailed",
|
|
|
+ validatedActivity.messages.join(", "),
|
|
|
);
|
|
|
-
|
|
|
- const isPeTypeValid = actRegData.peTypes.find((t) => t.code === peTypeCode);
|
|
|
- if (!isPeTypeValid)
|
|
|
+ //
|
|
|
+ // валидация pe
|
|
|
+ const pe = await cPeService.getPeWithValues(peId);
|
|
|
+ const members = await cPeService.getMembers(peId);
|
|
|
+ if (!pe)
|
|
|
+ throw ApiError.BadRequest("peNotFound", "Сущность участия не найдена");
|
|
|
+
|
|
|
+ const fullPe = {
|
|
|
+ ...pe,
|
|
|
+ members: [...members],
|
|
|
+ };
|
|
|
+ const validatedPe = validatePeForAct(actRegData, fullPe);
|
|
|
+ if (!validatedPe.isValid)
|
|
|
throw ApiError.BadRequest(
|
|
|
- "peTypeNotFound",
|
|
|
- `Тип сущности участия ${peTypeCode} не подходит к мероприятию ${activityCode}. Нужны ${actRegData.peTypes.map((v) => v.code).join(", ")}`,
|
|
|
+ "peValidatorFailed",
|
|
|
+ validatedPe.messages.join(", "),
|
|
|
);
|
|
|
-
|
|
|
- //
|
|
|
- //
|
|
|
-
|
|
|
- // валидация активности
|
|
|
- const actValidators = validators.filter(
|
|
|
- (validator) => !validator.isPeValidator,
|
|
|
- );
|
|
|
- for (const validator of actValidators) {
|
|
|
- const result = validateAct(validator);
|
|
|
- if (!result.isValid) {
|
|
|
- throw ApiError.BadRequest("actValidatorFailed", result.message);
|
|
|
- }
|
|
|
- }
|
|
|
- //
|
|
|
//
|
|
|
|
|
|
// валидация формы
|