--- title: "Leadera — Публичный доступ к диаграмме Ганта" date: 2026-04-09 lastmod: 2026-04-09 tags: ["leadera", "gantt", "public-access", "sharing"] weight: 130 --- # Публичный доступ к диаграмме Ганта (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) #### Таблица БД: `gantt_public_links` - `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/" }` - `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 — без навигации проекта, без сайдбара --- ## Открытые вопросы _(Нет)_