Контекст
Целевой релиз: 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.
Поля:
id — Uuid
title — непустая строка
text — markdown (text)
status — enum NewsStatus (draft | published | archived)
createdAt — CarbonImmutable (readonly)
updatedAt — CarbonImmutable
Поведение + guard'ы (по стилю Bitrix24Partner):
changeTitle(string) — отклонять пустое
changeText(string) — отклонять пустое
publish() — draft → published (отклонять, если уже published/archived)
archive() — * → archived
revertToDraft() — published → draft
- генерировать доменные события на каждое изменение (
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 репозитория на реальной БД
Критерии приёмки
Контекст
Целевой релиз: 0.8.0.
Нужен новый bounded context
News— простой агрегат контента: новости, которыеадмин приложения добавляет в админке и которые показываются внутри приложения.
Согласно уточнению ревьювера, у новости есть заголовок, тело (markdown) и статус
(в т.ч. черновик).
Вне зоны ответственности (явно)
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.phpAggregate root, расширяет
Bitrix24\Lib\AggregateRoot.Поля:
id—Uuidtitle— непустая строкаtext— markdown (text)status— enumNewsStatus(draft|published|archived)createdAt—CarbonImmutable(readonly)updatedAt—CarbonImmutableПоведение + guard'ы (по стилю
Bitrix24Partner):changeTitle(string)— отклонять пустоеchangeText(string)— отклонять пустоеpublish()—draft→published(отклонять, если уже published/archived)archive()—*→archivedrevertToDraft()—published→draftNewsCreatedEvent,NewsPublishedEvent,NewsTitleChangedEventи т.д.)Инфраструктура
src/News/Infrastructure/Doctrine/NewsRepository.php(+ интерфейс)config/xml/Bitrix24.Lib.News.Entity.News.dcm.xmlb24lib_newscarbon_immutableдля временных меток, enum-тип дляstatus.UseCases (CQRS)
Create(title, text, status)Update(изменить title/text)Publish/Archive/RevertToDraft(переходы статусов)GetList— read model: список опубликованных новостей (с пагинацией) для лентыТесты
tests/Unit/News/— guard'ы сущности, переходы статусов, генерация событийtests/Functional/News/— CRUD репозитория на реальной БДКритерии приёмки
Newsaggregate root с полями выше и неизменяемымcreatedAtNewsStatusс guard'ами переходов (нельзя сделать недопустимый переход)AggregateRoot)b24lib_news;make schema-createеё создаётmake test-unit,make test-functional)make lint-allзелёный (phpstan/cs-fixer/rector)CHANGELOG.mdпод 0.8.0src/News/Docs/)