b02e532563
Move flat docs/diagrams/*.puml into a hierarchy matching the source
package structure:
docs/diagrams/
├── bootstrap-sequence.puml (cross-cutting)
├── events-diagram.puml (cross-feature)
├── util/
│ ├── command-class-diagram.puml
│ ├── database-diagram.puml
│ ├── messages-class-diagram.puml
│ ├── broadcasts-class-diagram.puml
│ └── gui-class-diagram.puml
└── features/
├── team/
│ ├── team-class-diagram.puml
│ ├── team-config-class-diagram.puml
│ ├── builtin-commands-diagram.puml
│ ├── team-create-sequence.puml
│ ├── team-create-activity.puml
│ └── team-join-sequence.puml
├── player/
│ └── player-class-diagram.puml
└── moderation/
└── moderation-class-diagram.puml
README.md diagram index split into 4 sections (overview, util,
features/team, features/player, features/moderation) for readability;
all links updated. features.md auto-updated by sed for the new paths.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
63 lines
1.7 KiB
Plaintext
63 lines
1.7 KiB
Plaintext
@startuml team-join-sequence
|
|
title CR-Core — Player joins a public team (sequence diagram)
|
|
|
|
actor Player
|
|
participant "BaseCommand\n(TeamCommand)" as Base
|
|
participant "SubCommand\n(TeamJoinSub)" as Sub
|
|
participant "TeamService" as Service
|
|
participant "TeamRepository" as Repo
|
|
participant "Team" as Team
|
|
|
|
Player -> Base : /team join <name>
|
|
activate Base
|
|
|
|
Base -> Base : route args[0]="join" → TeamJoinSub
|
|
Base -> Sub : execute(ctx)
|
|
activate Sub
|
|
|
|
Sub -> Service : getTeamByName(name)
|
|
activate Service
|
|
Service -> Repo : findByName(name)
|
|
activate Repo
|
|
Repo --> Service : Optional<Team>
|
|
deactivate Repo
|
|
Service --> Sub : Optional<Team>
|
|
deactivate Service
|
|
|
|
alt team not found
|
|
Sub --> Base : CommandResult.failure("Team not found")
|
|
else team found
|
|
Sub -> Service : joinTeam(team.id, playerId)
|
|
activate Service
|
|
|
|
Service -> Service : validateJoinable(team, playerId)
|
|
alt team is PRIVATE
|
|
Service --> Sub : throw TeamAccessException
|
|
Sub --> Base : CommandResult.failure(ex.message)
|
|
else player already in a team
|
|
Service --> Sub : throw TeamAccessException
|
|
Sub --> Base : CommandResult.failure(ex.message)
|
|
else allowed
|
|
Service -> Team : addMember(playerId)
|
|
activate Team
|
|
Team --> Service : member
|
|
deactivate Team
|
|
Service -> Repo : save(team)
|
|
activate Repo
|
|
Repo --> Service : team
|
|
deactivate Repo
|
|
Service -> Service : onMemberAdded(team, member)
|
|
Service -> Service : onPlayerJoined(team, member)
|
|
Service --> Sub : true
|
|
Sub --> Base : CommandResult.success("Joined " + team.name)
|
|
end
|
|
deactivate Service
|
|
end
|
|
|
|
deactivate Sub
|
|
Base -> Base : handleResult → sender.sendMessage
|
|
Base --> Player : reply
|
|
deactivate Base
|
|
|
|
@enduml
|