Перейти к основному содержимому

GET /api/v1/pin-manager/calendar/events — Календари консультантов ПИН (read-only)

Назначение

Отдаёт менеджеру ПИН события календарей инвест-консультантов компании ПИН: загрузку консультантов, запланированные консультации и их статусы — чтобы распределять входящие обращения инвесторов и контролировать занятость (UC-OVR-002). Выборка строго read-only: своим календарём консультант управляет сам через agent-область — консультанты ПИН пользуются теми же операциями, что и агенты агентств.

Metadata

ПолеЗначение
Сервис/контекстcalendar
API areapin-manager
Feature grouppin-calendar
Статусdraft
Документdocs/06-services/calendar/api/pin-manager/list-events.md

Актор и доступ

ПроверкаЗначение
Actor typeUser (менеджер / руководитель ПИН — сотрудник компании ПИН)
Auth policy / Permissionscalendar.team.view (назначено в scope компании ПИН)
Scope (RBAC)организация: компания ПИН — актор не из компании ПИН доступа не имеет
Record-levelне применяется — видны события всех консультантов компании ПИН
Tenant isolationTenantId из токена (tenant_id) = компания ПИН; календари агентств этой областью недоступны (ADR-0052)
Auditread-sensitive: актор, фильтры и ConsultantUserId фиксируются в trace; Title/Description/Location в логи не пишутся

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/v1/pin-manager/calendar/events
Success status200
Idempotency headerнет (безопасное чтение)
Correlationсквозной trace через заголовок traceparent

Входные данные / параметры запроса

Все фильтры комбинируются по «И».

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
TenantIdтокен (tenant_id)GuidДаRequired (= компания ПИН); не принимается из queryTenant isolation
FromqueryDateTimeOffsetДаUTC; начало диапазона
ToqueryDateTimeOffsetДаUTC; To > From; To − From ≤ 92 дня
ConsultantUserIdqueryGuid?Неткалендарь конкретного консультанта (фильтр по владельцу события); пользователь вне компании ПИН → пустая выборка (fail-closed)
KindqueryEventKind?Нетenum-строка Showing/Consultation/Meeting/Task/BookingDeadline (у консультантов преобладает Consultation)
StatusqueryEventStatus?Нетenum-строка Planned/InProgress/Completed/Cancelled
Page / PageSizequeryintНетPage ≥ 1; PageSize 1..500, default 200

Модель ответа — страница CalendarEventModel

Модель, правило выборки диапазона и правило HasConflicts — по дому list-events.md; OwnerUserId строки — консультант ПИН. Сортировка — OwnerUserId, затем StartAt возр., затем Id (как в agency-выборке); HasConflicts вычисляется per-owner.

Алгоритм

  1. Контекст и доступ. Актор — сотрудник компании ПИН с calendar.team.view; нет права или актор не из компании ПИН → FORBIDDEN. TenantId берётся из токена.
  2. Проверка входа. From/To заданы, To > From, диапазон ≤ 92 дней; enum-значения допустимы; paging в границах — иначе VALIDATION_FAILED.
  3. Что читаем. Страница событий TenantId = компания ПИН по правилу выборки диапазона с наложением фильтров ConsultantUserId (владелец)/Kind/Status по «И»; сортировка OwnerUserId, StartAt возр., Id; HasConflicts — per-owner.
  4. Результат. Страница CalendarEventModel → HTTP 200; пустая выборка — 200 с Items = []. Данные — из source of truth calendar, актуальны на момент чтения.

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
VALIDATION_FAILED400From/To отсутствуют; To ≤ From; диапазон > 92 дней; enum вне значений; paging вне границ«Некорректные параметры выборки»no retry
UNAUTHORIZED401нет/просрочен JWTno retry
FORBIDDEN403нет права calendar.team.view в scope компании ПИН / актор не сотрудник ПИНno retry

Совместимость и наблюдаемость

  • Контракт модели — по дому list-events.md; правила additive/breaking — там же.
  • Logs: актор, ConsultantUserId-фильтр, диапазон, TotalCount (без содержимого событий); metrics: calendar_api_request_duration_seconds{route}; traces — сквозной traceparent.

Acceptance Criteria

  • AC-1 (загрузка консультантов). Дано: у двух консультантов ПИН консультации в диапазоне недели. Когда: GET с From/To. Тогда: 200, события обоих, сгруппированы по OwnerUserId; менеджер видит свободные и занятые интервалы.
  • AC-2 (один консультант). Дано: ConsultantUserId консультанта ПИН. Тогда: только его события.
  • AC-3 (не сотрудник ПИН). Дано: руководитель агентства с calendar.team.view своего агентства. Тогда: 403 FORBIDDEN для этой области (его команда — agency-область).
  • AC-4 (календари агентств недоступны). Дано: ConsultantUserId агента стороннего агентства. Тогда: 200, Items = [] — события чужого tenant не раскрываются.
  • AC-5 (read-only). Дано: менеджер ПИН. Тогда: операций изменения чужих событий в pin-manager-области нет; событиями управляет консультант-владелец.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы