Skip to main content

Обзор

Модуль новостей позволяет публиковать статьи для пользователей прямо в Cabinet. Администраторы создают статьи с WYSIWYG-редактором, загружают медиа, управляют категориями и тегами. Пользователи видят ленту новостей в Cabinet с фильтрацией по категориям.

Возможности

  • Полноценный WYSIWYG-редактор (TipTap) с поддержкой изображений и видео
  • Управляемые категории и теги с цветовой маркировкой
  • Загрузка медиа: drag-drop, вставка из буфера, файловый пикер
  • Избранная статья — автоматически снимается с остальных при назначении
  • Счётчик просмотров с дедупликацией (5 мин на пользователя)
  • Автогенерация slug из заголовка (транслитерация кириллицы)
  • Серверная санитизация HTML-контента (XSS-защита)
  • RBAC-права: news:read, news:create, news:edit, news:delete

Настройка

Переменные окружения

Модуль новостей использует настройки медиа-загрузки:

Docker

В Dockerfile автоматически создаются поддиректории: uploads/images/, uploads/videos/, uploads/thumbnails/.
При использовании Docker убедитесь, что volume ./uploads примонтирован для сохранения медиа между перезапусками.

Управление статьями

Создание статьи

Admin Cabinet → НовостиСоздать статью

Редактор контента

Редактор построен на TipTap (Prosemirror) и поддерживает:
  • Форматирование: жирный, курсив, подчёркивание, зачёркнутый
  • Заголовки H1-H3
  • Списки (нумерованные и маркированные)
  • Ссылки
  • Изображения и видео (через загрузку медиа)
  • Блоки кода

Публикация

При первой публикации автоматически устанавливается published_at — дата, по которой сортируется лента. Повторное снятие и публикация не меняют эту дату.

Избранная статья

Только одна статья может быть отмечена как избранная. При назначении новой избранной все остальные автоматически теряют этот статус (атомарная транзакция).

Категории и теги

Категории

Управляемые категории с цветовой маркировкой. Используются для фильтрации ленты новостей. При удалении категории все статьи с ней теряют привязку (category_id=NULL).

Теги

Управляемые теги с цветовой маркировкой. Одна статья может иметь один тег. При удалении тега все статьи с ним теряют привязку (tag_id=NULL).

Загрузка медиа

Поддерживаемые форматы

Обработка изображений

  1. Определение формата по magic bytes (не по расширению)
  2. Исправление EXIF-ориентации (фотографии с телефона)
  3. Нормализация в RGB
  4. Ресайз если сторона > 2048 px (с сохранением пропорций, LANCZOS)
  5. Сжатие JPEG с заданным качеством
  6. Генерация thumbnail 400×400 px

Безопасность загрузки

  • Определение типа по magic bytes (не MIME sniffing)
  • Защита от decompression bomb (макс. 25M пикселей)
  • UUID-имена файлов (без пользовательского ввода)
  • Атомарная запись (.tmprename)
  • Защита от path traversal при удалении
  • HEIC/HEIF отклоняются (формат изображений, не видео)

Лента новостей (для пользователей)

Пользователи видят ленту опубликованных статей в Cabinet:
  • Сортировка по дате публикации (новые сверху)
  • Фильтрация по категориям
  • Пагинация (до 100 статей на страницу)
  • Счётчик просмотров (с дедупликацией: 1 просмотр на пользователя за 5 минут)
  • Полный контент статьи при открытии по slug
Счётчик просмотров скрыт от обычных пользователей и виден только администраторам.

RBAC права

Если включён RBAC, для управления новостями требуются права: Настройка прав: RBAC

API эндпоинты

Админские

Публичные (для пользователей)