Skip to main content

Обзор

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

Возможности

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

Настройка

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

Модуль новостей использует настройки медиа-загрузки:
ПеременнаяТипПо умолчаниюОписание
MEDIA_UPLOAD_DIRstr./uploadsДиректория для загрузок
MEDIA_MAX_IMAGE_SIZE_MBint10Макс. размер изображения (МБ)
MEDIA_MAX_VIDEO_SIZE_MBint50Макс. размер видео (МБ)
MEDIA_IMAGE_MAX_DIMENSIONint2048Макс. сторона изображения (пиксели)
MEDIA_JPEG_QUALITYint85Качество JPEG-сжатия (1-100)

Docker

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

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

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

Admin Cabinet → НовостиСоздать статью
ПолеОписаниеОграничения
ЗаголовокЗаголовок статьи1-500 символов, обязательно
SlugURL-идентификаторАвто из заголовка, уникальный, [a-zA-Z0-9_-]
КонтентHTML-содержимое (WYSIWYG)До 500 000 символов
ПревьюКороткий текст для спискаДо 1000 символов
КатегорияВыбор из управляемого спискаОбязательно
ТегВыбор из управляемого спискаОпционально
ОбложкаURL изображения-баннераhttp/https, до 2000 символов
Время чтенияОценка в минутах1-60, по умолчанию 1
ОпубликоватьВидимость для пользователейПо умолчанию — черновик
ИзбраннаяЗакреплённая статья (одна)Снимается с остальных автоматически

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

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

Публикация

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

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

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

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

Категории

Управляемые категории с цветовой маркировкой. Используются для фильтрации ленты новостей.
ПолеОписаниеОграничения
НазваниеНазвание категории1-100 символов, уникальное (без учёта регистра)
ЦветHEX-цвет для бейджаПо умолчанию #00e5a0
При удалении категории все статьи с ней теряют привязку (category_id=NULL).

Теги

Управляемые теги с цветовой маркировкой. Одна статья может иметь один тег.
ПолеОписаниеОграничения
НазваниеНазвание тега1-50 символов, уникальное (без учёта регистра)
ЦветHEX-цвет для бейджаПо умолчанию #94a3b8
При удалении тега все статьи с ним теряют привязку (tag_id=NULL).

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

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

ФорматТипыМакс. размерОбработка
ИзображенияJPEG, PNG, WebP10 МБКонвертация в JPEG, ресайз до 2048px, thumbnail 400x400
ВидеоMP4, WebM50 МБСохраняется как есть

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

  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, для управления новостями требуются права:
ПравоОписание
news:readПросмотр статей, категорий, тегов
news:createСоздание статей, категорий, тегов
news:editРедактирование статей, категорий, тегов; загрузка медиа
news:deleteУдаление статей, категорий, тегов; удаление медиа
Настройка прав: RBAC

API эндпоинты

Админские

МетодПутьОписание
GET/admin/newsСписок статей (включая черновики)
GET/admin/news/{id}Детали статьи
POST/admin/newsСоздать статью
PUT/admin/news/{id}Обновить статью
DELETE/admin/news/{id}Удалить статью
POST/admin/news/{id}/publishПереключить публикацию
POST/admin/news/{id}/featureПереключить избранную
GET/admin/news/categoriesСписок категорий
POST/admin/news/categoriesСоздать категорию
PUT/admin/news/categories/{id}Обновить категорию
DELETE/admin/news/categories/{id}Удалить категорию
GET/admin/news/tagsСписок тегов
POST/admin/news/tagsСоздать тег
PUT/admin/news/tags/{id}Обновить тег
DELETE/admin/news/tags/{id}Удалить тег
POST/admin/news/media/uploadЗагрузить медиа
DELETE/admin/news/media/{filename}Удалить медиа

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

МетодПутьОписание
GET/newsЛента опубликованных статей
GET/news/categoriesСписок категорий
GET/news/{slug}Полная статья по slug