Leadera — Публичный доступ к диаграмме Ганта

📁 ~/Projects/docs-a2v/content/leadera/leadera-gantt-public-access.md

Публичный доступ к диаграмме Ганта (Share)

Дата: 09.04.2026 Статус: Требования Проект: Leadera


Общее описание

Пользователь может создать публичную ссылку на фрагмент диаграммы Ганта, доступную для просмотра без авторизации. Открывший ссылку видит диаграмму в read-only режиме с возможностью масштабирования таймлайна, но без каких-либо элементов управления (создание, редактирование, удаление задач/секций/вех).


Пользовательский сценарий (создатель ссылки)

  1. Пользователь открывает диаграмму Ганта проекта
  2. Нажимает кнопку «Экспорт» / «Общий доступ»
  3. Указывает диапазон дат, который должен отображаться на диаграмме
  4. Система генерирует уникальную ссылку (UUID) и показывает её пользователю
  5. Пользователь копирует ссылку и передаёт заинтересованным лицам

Управление ссылками

  • Вызывается через меню экспорта → модальное окно «Общий доступ»
  • В модальном окне отображается список созданных ссылок с указанием диапазона дат
  • Каждую ссылку можно удалить (полное удаление из БД, не soft delete)
  • Ссылки нельзя редактировать — только создавать и удалять
  • Ограничений на количество активных ссылок нет
  • Статистика просмотров (сколько раз открывали) — не нужна

Пользовательский сценарий (зритель по ссылке)

  1. Зритель переходит по ссылке (без авторизации)
  2. Открывается отдельная страница с диаграммой Ганта
  3. Зритель видит:
    • Задачи и вехи, попадающие в заданный диапазон
    • Секции (заголовки группировок)
    • Таймлайн с цветовой раскраской задач
  4. Зритель может:
    • Масштабировать таймлайн
    • Переключать отображение «по ячейкам» / «по дням»
  5. Зритель не может:
    • Создавать, редактировать, удалять задачи / секции / вехи
    • Видеть любые контролы управления (кнопки создания, контекстные меню, drag-and-drop и т.д.)
    • Авторизоваться через эту страницу

Данные и фильтрация

Что попадает в представление

Задачи и вехи, у которых хотя бы одно из условий верно:

  • Дата начала попадает в диапазон ссылки
  • Дата конца попадает в диапазон ссылки
  • Задача начинается до диапазона и заканчивается после (полностью перекрывает)

Секции включаются, если в них есть хотя бы одна попавшая задача.

API возвращает

  • Только задачи и вехи, попадающие в диапазон (не всю диаграмму)
  • Информацию о секциях, содержащих попавшие задачи
  • Минимальный набор полей, необходимый для отрисовки (без внутренних ID пользователей и т.п.)

Технические требования

Ссылки

  • Формат: UUID v4 (каждый раз новый)
  • Срок действия: бессрочно (пока не удалена)
  • Удаление: жёсткое (hard delete из БД)

Backend (Go API)

  • id (UUID, PK)
  • project_id (FK → projects)
  • date_from (date)
  • date_to (date)
  • created_by (FK → users)
  • created_at (timestamp)

Endpoints

  • POST /api/v1/gantt/:projectId/public-links — создать ссылку (авторизован, участник проекта)
    • Body: { dateFrom, dateTo }
    • Response: { url: "https://leadera.pro/share/<uuid>" }
  • GET /api/v1/gantt/:projectId/public-links — список ссылок проекта (авторизован, участник)
  • DELETE /api/v1/gantt/public-links/:uuid — удалить ссылку (авторизован, создатель)
  • GET /api/v1/public/gantt/:uuid — получить данные диаграммы по ссылке (без авторизации)
    • Response: задачи, вехи, секции в рамках диапазона

Rate limiting

  • На публичный endpoint GET /api/v1/public/gantt/:uuid — rate limiting для защиты от перебора
  • Рекомендация: 60 запросов в минуту на IP

Frontend (Angular)

Модальное окно «Общий доступ»

  • Вызывается из меню экспорта
  • Содержит:
    • Форму создания ссылки (диапазон дат + кнопка «Создать»)
    • Список существующих ссылок (диапазон + URL + кнопка «Копировать» + кнопка «Удалить»)

Публичная страница /share/:uuid

  • Отдельный route, не требует авторизации
  • Отображает диаграмму Ганта в read-only режиме
  • Доступны только: масштабирование таймлайна, переключение ячейки/дни
  • Все контролы управления скрыты (удалены из шаблона, не просто disabled)
  • Минимальный layout — без навигации проекта, без сайдбара

Открытые вопросы

(Нет)