Команды и запросы модуля projects
Полный справочник CQRS-команд и запросов модуля: параметры, логика, исключения.
1. Проекты
1.1. CreateProjectCommand → CreateProjectHandler
Параметры: name: string, type: string, ownerId: int, settings: array = [].
Логика:
- Проверка права
IProjectAccess::canCreateProject($ownerId)(лимит проектов на владельца). - Создание сущности
Project, сохранение. - Диспатч
ProjectCreatedEvent. - (Событие обрабатывает
AddOwnerAsMemberListener— владелец становится участником.)
1.2. UpdateProjectCommand → UpdateProjectHandler
Параметры: id: int, updatedBy: int, name: ?string = null, settings: ?array = null.
Логика:
- Проверка права
canManageProject($updatedBy, $id)(owner или admin). - Найти проект (
findById), иначе — ошибка not found. rename()/changeSettings().- Сохранение, возврат
ProjectDto.
1.3. DeleteProjectCommand → DeleteProjectHandler
Параметры: id: int, userId: int.
Логика:
- Проверка
canDeleteProject($userId, $id)(только owner, personal-проект удалить нельзя). - Удаление проекта (вместе с досками — см. FK).
1.4. GetProjectQuery → GetProjectHandler
Параметры: id: int, userId: int.
Логика: проверка canViewProject → возврат ProjectDto.
1.5. ListUserProjectsQuery → ListUserProjectsHandler
Параметры: userId: int.
Логика: список проектов, где пользователь — участник (включая владельца).
2. Доски
2.1. CreateBoardCommand → CreateBoardHandler
Параметры: projectId: int, name: string, createdBy: int, description: ?string, settings: array = [].
Проверка canCreateBoard($createdBy, $projectId) (лимит досок на проект — MAX_PROJECT_BOARDS = 4).
2.2. UpdateBoardCommand → UpdateBoardHandler
Параметры: id: int, updatedBy: int, name, description, settings.
Проверка canManageBoard.
2.3. DeleteBoardCommand → DeleteBoardHandler
Параметры: id: int, userId: int.
Проверка canDeleteBoard (только владелец проекта).
2.4. GetBoardQuery → GetBoardHandler
Параметры: id: int, userId: int.
2.5. ListProjectBoardsQuery → ListProjectBoardsHandler
Параметры: projectId: int, userId: int.
Проверка доступа к проекту; возврат списка BoardDto.
3. Участники
3.1. AddProjectMemberCommand → AddProjectMemberHandler
Параметры: projectId, userId, role: string, addedBy.
Проверка canAddMember($addedBy, $userId, $projectId). Personal/collaborative — false (нельзя добавлять напрямую); corporate — только в пределах компании.
3.2. ChangeMemberRoleCommand → ChangeMemberRoleHandler
Параметры: projectId, userId, newRole, changedBy.
Проверка canManageUser. Нельзя менять роль владельца; нельзя снять последнего админа.
3.3. RemoveProjectMemberCommand → RemoveProjectMemberHandler
Параметры: projectId, userId, removedBy.
Проверка canRemoveUser. Нельзя удалить владельца; нельзя удалить последнего админа.
3.4. ListProjectMembersQuery → ListProjectMembersHandler
Параметры: projectId, userId (запрашивающий).
Проверка доступа к проекту; возврат списка ProjectUserDto.
4. Приглашения
4.1. InviteUserCommand → InviteUserHandler
Параметры: projectId, invitedBy, email: ?string, userId: ?int.
Логика:
- Если
emailпустой иuserIdпустой — ошибка валидации. - Проверка прав (
canInviteUser). - Создание приглашения с токеном, статус
pending. - Диспатч
InvitationCreatedEvent→SendInvitationEmailListenerотправляет письмо.
4.2. AcceptInvitationCommand → AcceptInvitationHandler
Параметры: token: string, userId: int.
Логика:
- Найти приглашение по токену (иначе 404).
- Проверить, что пользователь — получатель (email совпадает или userId).
- Создать
ProjectUser(роль из приглашения), статус приглашения →accepted. - Диспатч
InvitationAcceptedEvent.
4.3. CancelInvitationCommand → CancelInvitationHandler
Параметры: projectId, email, userId (кто отменяет).
Проверка прав; статус приглашения → cancelled. Диспатч InvitationCancelledEvent.
5. Сводная таблица
| Объект | Команда/Запрос | Хендлер | Право |
|---|---|---|---|
| Проект | Create | CreateProjectHandler | canCreateProject |
| Проект | Update | UpdateProjectHandler | canManageProject |
| Проект | Delete | DeleteProjectHandler | canDeleteProject (owner) |
| Проект | Get | GetProjectHandler | canViewProject |
| Проект | List (мои) | ListUserProjectsHandler | участник |
| Доска | Create | CreateBoardHandler | canCreateBoard |
| Доска | Update | UpdateBoardHandler | canManageBoard |
| Доска | Delete | DeleteBoardHandler | canDeleteBoard (owner) |
| Доска | Get | GetBoardHandler | canViewBoard |
| Доска | List | ListProjectBoardsHandler | canViewProject |
| Участник | Add | AddProjectMemberHandler | canAddMember |
| Участник | ChangeRole | ChangeMemberRoleHandler | canManageUser |
| Участник | Remove | RemoveProjectMemberHandler | canRemoveUser |
| Участник | List | ListProjectMembersHandler | canViewProject |
| Приглашение | Invite | InviteUserHandler | canInviteUser |
| Приглашение | Accept | AcceptInvitationHandler | — (владелец токена) |
| Приглашение | Cancel | CancelInvitationHandler | canManageProject / владелец |