Project

General

Profile

Actions

Task #6108

closed

Backend: поля helpDirections, missionParticipationConfirmed, personalDataConsent

Added by Redmine Admin 1 day ago. Updated 1 day ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Start date:
08/25/2026
Due date:
% Done:

0%

Estimated time:

Description

Сопутствующая задача к ТЗ от 24.08.2026. Фронтенд реализован полностью (#6093–#6107) и уже отправляет/читает перечисленные поля. Задача самодостаточна: всё, что нужно бэкенду, описано здесь.

1. Новые поля волонтера

/api/volunteers (GET списком, POST, PUT) и волонтер внутри /api/volunteer-applications:

Поле Тип Смысл
helpDirections string[] направления волонтерской помощи, 16 значений справочника (см. ниже)
missionParticipationConfirmed boolean | null подтверждение участия; null = статус не поставлен, это отдельное состояние, не false
volunteerMissionId string | null миссия, к которой привязан волонтер
volunteerMissionShiftId string | null смена

Справочник helpDirections (ключ → подпись, подписи используются в Excel):
NO_SPECIALIZATION, CONSTRUCTION_REPAIR, ROOFING, WELDING, ELECTRICAL, PLUMBING, DRIVER_CAR_B, DRIVER_TRUCK_C, COOKING, MEDICAL_HELP, PSYCHOLOGICAL_HELP, LEGAL_HELP, LOADING_UNLOADING, LOGISTICS, CHILDREN_ELDERLY, MEDIA_VOLUNTEER.
Правило целостности: NO_SPECIALIZATION не может встречаться вместе с любым другим значением (на фронте это гарантировано UI, на бэкенде — желательно валидацией, т.к. есть импорт).

2. Заявка из внешнего контура

POST /api/volunteer-applications/outer_perimeter (multipart/form-data) дополнительно получает:

  • helpDirectionsповторяющееся поле, по одному значению на запись (не строка через запятую)
  • personalDataConsent"true" / "false", согласие на обработку ПД (#6105). Без отметки фронт не даёт отправить заявку; значение стоит сохранять как юридический факт с датой.

3. Проставление подтверждения участия из таблицы (#6099)

PATCH /api/volunteers/{id}/participation-confirmation
Тело: { "missionParticipationConfirmed": true | false | null }

Решение на согласование: эндпоинт придуман фронтендом. Если удобнее — можно обойтись существующим PUT /api/volunteers/{id}, тогда правится один вызов в VolunteersIndex.tsx (handleParticipationChange). Отдельный PATCH выбран потому, что оператор меняет статус построчно и слать целого волонтера ради одного поля не хочется.

Фронт применяет изменение оптимистично и откатывает значение в UI при любой ошибке, так что до реализации эндпоинта колонка визуально работает, но не сохраняет.

4. Импорт

POST /api/volunteer-missions/{id}/import-volunteers — в объектах массива volunteers теперь приходят helpDirections и missionParticipationConfirmed (см. п.1). Тот же эндпоинт используется импортом со страницы «Волонтеры» (#6101).

5. Nullable даты (#6093, #6094)

  • VolunteerMission.missionStartDate / missionEndDate — nullable
  • VolunteerMissionShift.departureDate / arrivalDate — nullable

Фронт отправляет null при пустом значении и корректно отображает отсутствующие даты.

6. Желательно (не блокирует)

GET /api/volunteers — отдавать связанные mission (id, name, missionStartDate, missionEndDate) и shift (id, shiftNumber). Сейчас карточка волонтера при отсутствии этих данных догружает последнюю заявку волонтера отдельным запросом (/api/volunteer-applications?volunteerId=...&size=1&sort=createdAt,desc), а фильтр по миссии на странице «Волонтеры» работает только по тем волонтерам, у кого связь пришла в списке.

Совместимость

Все новые поля читаются фронтендом защитно (отсутствующее значение = пусто), поэтому фронт можно выкатывать до бэкенда — ничего не сломается, новые поля просто не будут сохраняться.

Actions #1

Updated by Redmine Admin 1 day ago

Фронтенд готов и уже отправляет/читает все перечисленные поля (задачи #6093–#6107 закрыты). До реализации на бэкенде новые поля будут теряться при сохранении, а колонка «Подтверждение участия» на странице «Волонтеры» будет откатывать значение с сообщением об ошибке — эндпоинта PATCH /api/volunteers/{id}/participation-confirmation пока нет.

Все поля читаются фронтендом защитно (отсутствующие значения = пусто), поэтому выкатка фронта до бэкенда ничего не ломает.

Actions #2

Updated by Redmine Admin 1 day ago

  • Description updated (diff)

Описание переписано в самодостаточный контракт для бэкенда: точные имена полей, типы, эндпоинты, справочник направлений и требования к nullable-датам. Работа по бэкенду выносится за рамки текущей сессии.

Отдельно на согласование — п.3: эндпоинт PATCH /api/volunteers/{id}/participation-confirmation придуман фронтендом, можно заменить на существующий PUT /api/volunteers/{id} правкой одного вызова.

Бэкенд лежит в отдельной кодовой базе, в репозитории фронтенда (humanitarian_mission) его нет.

Actions #3

Updated by Redmine Admin 1 day ago

  • Status changed from New to Closed

Перенесена в проект hummission-back (#38) как задача #6109 — там же будет вестись работа по бэкенду. Здесь закрываю, чтобы задача бэкенда не висела в проекте фронтенда.

Содержимое перенесено полностью, ничего не потеряно. Актуальная версия контракта — #6109.

Actions

Also available in: Atom PDF