Сущности, события и листенеры модуля projects

Документ описывает доменные сущности, события и реакцию на них (листенеры).

1. Сущности

1.1. Project (entity/Project.php)

Поля:

Методы: rename(name), changeSettings(array), isOwner(UserId): bool, setId() (для репозитория).

1.2. Board (entity/Board.php)

Поля: id, projectId, name, description, createdBy: UserId, settings, createdAt, updatedAt.

1.3. ProjectUser (entity/ProjectUser.php)

Поля: projectId, userId, role: UserRole, invitedBy, invitedAt, acceptedAt, joinedAt.

Роли участника (VO UserRole): owner, admin, member.

1.4. Invitation (entity/Invitation.php)

Поля: id, projectId, email, token, status: InvitationStatus, invitedBy, createdAt, updatedAt (+ acceptedAt/cancelledAt по реализации).

Статусы (VO InvitationStatus): pending, accepted, cancelled.

2. События

Все события — в modules/projects/domain/event/:

СобытиеКогдаДанные
ProjectCreatedEventСоздан проектprojectId, ownerId
ProjectMemberAddedEventДобавлен участникprojectId, userId
ProjectMemberRemovedEventУдалён участникprojectId, userId
BoardCreatedEventСоздана доскаboardId, projectId
InvitationCreatedEventСоздано приглашениеinvitationId, email
InvitationAcceptedEventПриглашение принятоinvitationId, userId
InvitationCancelledEventПриглашение отмененоinvitationId

3. Листенеры

3.1. AddOwnerAsMemberListener

3.2. SendInvitationEmailListener

3.3. CreatePersonalProjectOnUserFirstLogin

3.4. ProjectLoggerListener

4. Распространение событий

sequenceDiagram
    autonumber
    participant H as Хендлер
    participant M as ModuleEventDispatcher (проекты)
    participant L as Листенер проекта
    participant G as GlobalEventDispatcher (ядро)

    H->>M: dispatch(ProjectCreatedEvent)
    M->>L: AddOwnerAsMemberListener::handleProjectCreated
    M->>G: DispatchingEventDecorator → dispatch (forwardEvents)

5. Глобальная подписка

В modules/projects/config/di.php:

$globalDispatcher = Yii::$container->get(GlobalEventDispatcher::class);
$globalDispatcher->addListener(UserFirstLoginEvent::class, CreatePersonalProjectOnUserFirstLogin::class);

Это связывает проекты с ядром: при первом входе любого нового пользователя ему создаётся личный проект.

6. Миграции модуля

МиграцияТаблица
m260317_174252_create_project_table.phpproject
m260317_174349_create_board_table.phpboard
m260317_174437_create_project_user_table.phpproject_user
m260331_035731_create_project_invitation_table.phpproject_invitation