Skip to content

Добавить bounded context "News" #116

Description

@KarlsonComplete

Контекст

Целевой релиз: 0.8.0.

Нужен новый bounded context News — простой агрегат контента: новости, которые
админ приложения добавляет в админке и которые показываются внутри приложения.
Согласно уточнению ревьювера, у новости есть заголовок, тело (markdown) и статус
(в т.ч. черновик).

Вне зоны ответственности (явно)

  • Пуш/доставка в колокольчик Битрикс24 (im.notify.system.add) или в чаты
    (im.message.add). Это зона приложения, не этой библиотеки. Данный issue
    покрывает только контекст контента/хранения.
  • Привязка автора (bitrix24AccountId / contactPersonId). Новость — контент
    уровня приложения, без принадлежности конкретному порталу или контакту.

Предлагаемое решение

Реализовать bounded context целиком внутри библиотеки (без контракта в SDK —
в отличие от Bitrix24Accounts/ApplicationInstallations, контракта
Bitrix24\SDK\Application\Contracts\News нет и мы оставляем его локально),
по образцу существующих Bitrix24Partners / Bitrix24Accounts.

Сущность — src/News/Entity/News.php

Aggregate root, расширяет Bitrix24\Lib\AggregateRoot.

Поля:

  • idUuid
  • title — непустая строка
  • text — markdown (text)
  • status — enum NewsStatus (draft | published | archived)
  • createdAtCarbonImmutable (readonly)
  • updatedAtCarbonImmutable

Поведение + guard'ы (по стилю Bitrix24Partner):

  • changeTitle(string) — отклонять пустое
  • changeText(string) — отклонять пустое
  • publish()draftpublished (отклонять, если уже published/archived)
  • archive()*archived
  • revertToDraft()publisheddraft
  • генерировать доменные события на каждое изменение (NewsCreatedEvent,
    NewsPublishedEvent, NewsTitleChangedEvent и т.д.)

Инфраструктура

  • src/News/Infrastructure/Doctrine/NewsRepository.php (+ интерфейс)
  • Doctrine XML-маппинг: config/xml/Bitrix24.Lib.News.Entity.News.dcm.xml
  • Таблица: b24lib_news
  • Типы полей — как в существующих маппингах:
    carbon_immutable для временных меток, enum-тип для status.

UseCases (CQRS)

  • Create (title, text, status)
  • Update (изменить title/text)
  • Publish / Archive / RevertToDraft (переходы статусов)
  • GetList — read model: список опубликованных новостей (с пагинацией) для ленты

Тесты

  • Unit: tests/Unit/News/ — guard'ы сущности, переходы статусов, генерация событий
  • Functional: tests/Functional/News/ — CRUD репозитория на реальной БД

Критерии приёмки

  • News aggregate root с полями выше и неизменяемым createdAt
  • enum NewsStatus с guard'ами переходов (нельзя сделать недопустимый переход)
  • Доменные события на create/publish/archive/change-title (через AggregateRoot)
  • Doctrine XML-маппинг + таблица b24lib_news; make schema-create её создаёт
  • Интерфейс репозитория + Doctrine-реализация (save, findById, findPublished со списком)
  • CQRS UseCases: Create, Update, Publish, Archive, RevertToDraft, GetList
  • Unit + functional тесты зелёные (make test-unit, make test-functional)
  • make lint-all зелёный (phpstan/cs-fixer/rector)
  • Запись в CHANGELOG.md под 0.8.0
  • Доставка в колокольчик/чат явно исключена (зафиксировать в src/News/Docs/)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions