-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharchitecture-guide.html
More file actions
43 lines (38 loc) · 13.5 KB
/
architecture-guide.html
File metadata and controls
43 lines (38 loc) · 13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Architecture Guide — Bånder Docs</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<nav>
<a href="index.html">Bånder Docs</a>
<a href="api-reference.html">API Reference</a>
<a href="domain-models.html">Domain Models</a>
<a href="architecture-guide.html">Architecture</a>
<a href=".phpdoc/build/index.html">API Docs</a>
</nav>
<main>
<h1>Architecture Guide</h1>
<h2>Bounded Context Layer Structure</h2>
<p>Bånder follows Domain-Driven Design with strict bounded contexts. Each context contains up to four layers:</p>
<ul>
<li><strong>Domain</strong> — Business rules, entities, value objects, repository interfaces</li>
<li><strong>Application</strong> — Use cases, command/query handlers, port interfaces</li>
<li><strong>Infrastructure</strong> — Doctrine repositories, external adapters, storage</li>
<li><strong>Interface</strong> — Controllers, request DTOs, API resources</li>
</ul>
<table>
<thead><tr><th>Context</th><th>Layers</th><th>Classes</th></tr></thead>
<tbody><tr><td>Activity</td><td>Interface, Application, Infrastructure, Domain</td><td>12</td></tr><tr><td>Auth</td><td>Interface, Application, Infrastructure, Domain</td><td>153</td></tr><tr><td>Catalog</td><td>Interface, Application, Infrastructure, Domain</td><td>64</td></tr><tr><td>Command</td><td>ExportOpenApiSpecCommand.php</td><td>1</td></tr><tr><td>Filesystem</td><td>Watcher, Mime, Application, Command</td><td>5</td></tr><tr><td>Library</td><td>Interface, Application, Infrastructure, Domain</td><td>29</td></tr><tr><td>Lyrics</td><td>Infrastructure, Domain</td><td>3</td></tr><tr><td>Media</td><td>Interface, Application, Infrastructure, Domain</td><td>17</td></tr><tr><td>Metadata</td><td>Interface, Application, Infrastructure, Domain</td><td>51</td></tr><tr><td>Notification</td><td>Interface, Application, Infrastructure, Domain, Console</td><td>37</td></tr><tr><td>Party</td><td>Interface, Application, Infrastructure, Domain</td><td>46</td></tr><tr><td>Playlist</td><td>Interface, Application, Infrastructure, Domain</td><td>23</td></tr><tr><td>Recommendation</td><td>Interface, Application, Infrastructure, Domain</td><td>24</td></tr><tr><td>Shared</td><td>Interface, Application, Infrastructure, Domain</td><td>95</td></tr><tr><td>Transcode</td><td>Interface, Application, Infrastructure, Domain</td><td>73</td></tr><tr><td>UserPreference</td><td>Interface, Application, Infrastructure, Domain</td><td>16</td></tr></tbody>
</table>
<h2>CQRS Flow</h2>
<p>Commands and queries are dispatched via Symfony Messenger. Each command has a dedicated handler marked with <code>#[AsMessageHandler]</code>.</p>
<h3>Activity</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>RecordPlayCommand</code></td><td><a href=".phpdoc/build/classes/App-Activity-Application-CommandHandler-RecordPlayHandler.html">RecordPlayHandler</a></td></tr><tr><td><code>ToggleLoveCommand</code></td><td><a href=".phpdoc/build/classes/App-Activity-Application-CommandHandler-ToggleLoveHandler.html">ToggleLoveHandler</a></td></tr></tbody></table><h3>Auth</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>LoginUserCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-LoginUserHandler.html">LoginUserHandler</a></td></tr><tr><td><code>RequestPasswordResetCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-RequestPasswordResetHandler.html">RequestPasswordResetHandler</a></td></tr><tr><td><code>ApproveDeviceCodeCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-ApproveDeviceCodeHandler.html">ApproveDeviceCodeHandler</a></td></tr><tr><td><code>EnableTotpCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-EnableTotpHandler.html">EnableTotpHandler</a></td></tr><tr><td><code>CreateUserCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-CreateUserHandler.html">CreateUserHandler</a></td></tr><tr><td><code>RevokeTokenCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-RevokeTokenHandler.html">RevokeTokenHandler</a></td></tr><tr><td><code>IssueTokenCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-IssueTokenHandler.html">IssueTokenHandler</a></td></tr><tr><td><code>DisableTotpCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-DisableTotpHandler.html">DisableTotpHandler</a></td></tr><tr><td><code>RegisterUserCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-RegisterUserHandler.html">RegisterUserHandler</a></td></tr><tr><td><code>RefreshTokenCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-RefreshTokenHandler.html">RefreshTokenHandler</a></td></tr><tr><td><code>RegisterPasskeyCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-RegisterPasskeyHandler.html">RegisterPasskeyHandler</a></td></tr><tr><td><code>AuthenticatePasskeyCommand</code></td><td><a href=".phpdoc/build/classes/App-Auth-Application-CommandHandler-AuthenticatePasskeyHandler.html">AuthenticatePasskeyHandler</a></td></tr></tbody></table><h3>Catalog</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>BatchExtractCoversCommand</code></td><td><a href=".phpdoc/build/classes/App-Catalog-Application-CommandHandler-BatchExtractCoversHandler.html">BatchExtractCoversHandler</a></td></tr></tbody></table><h3>Library</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>ScanLibraryCommand</code></td><td><a href=".phpdoc/build/classes/App-Library-Application-CommandHandler-ScanLibraryHandler.html">ScanLibraryHandler</a></td></tr><tr><td><code>CreateLibraryCommand</code></td><td><a href=".phpdoc/build/classes/App-Library-Application-CommandHandler-CreateLibraryHandler.html">CreateLibraryHandler</a></td></tr></tbody></table><h3>Metadata</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>ExtractAlbumCoverCommand</code></td><td><a href=".phpdoc/build/classes/App-Metadata-Application-CommandHandler-ExtractAlbumCoverHandler.html">ExtractAlbumCoverHandler</a></td></tr><tr><td><code>SyncSongMessage</code></td><td><a href=".phpdoc/build/classes/App-Metadata-Application-MessageHandler-SyncSongHandler.html">SyncSongHandler</a></td></tr><tr><td><code>SyncAlbumMessage</code></td><td><a href=".phpdoc/build/classes/App-Metadata-Application-MessageHandler-SyncAlbumHandler.html">SyncAlbumHandler</a></td></tr><tr><td><code>SyncArtistMessage</code></td><td><a href=".phpdoc/build/classes/App-Metadata-Application-MessageHandler-SyncArtistHandler.html">SyncArtistHandler</a></td></tr><tr><td><code>SyncLibraryMessage</code></td><td><a href=".phpdoc/build/classes/App-Metadata-Application-MessageHandler-SyncLibraryHandler.html">SyncLibraryHandler</a></td></tr></tbody></table><h3>Notification</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>SendWebhookCommand</code></td><td><a href=".phpdoc/build/classes/App-Notification-Application-Handler-SendWebhookHandler.html">SendWebhookHandler</a></td></tr><tr><td><code>SendEmailCommand</code></td><td><a href=".phpdoc/build/classes/App-Notification-Application-Handler-SendEmailHandler.html">SendEmailHandler</a></td></tr><tr><td><code>SendPushCommand</code></td><td><a href=".phpdoc/build/classes/App-Notification-Application-Handler-SendPushHandler.html">SendPushHandler</a></td></tr><tr><td><code>SeedDefaultPreferencesCommand</code></td><td><a href=".phpdoc/build/classes/App-Notification-Application-Handler-SeedDefaultPreferencesHandler.html">SeedDefaultPreferencesHandler</a></td></tr><tr><td><code>CreateNotificationCommand</code></td><td><a href=".phpdoc/build/classes/App-Notification-Application-Handler-CreateNotificationHandler.html">CreateNotificationHandler</a></td></tr></tbody></table><h3>Party</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>LeavePartySessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-LeavePartySessionHandler.html">LeavePartySessionHandler</a></td></tr><tr><td><code>CreatePartySessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-CreatePartySessionHandler.html">CreatePartySessionHandler</a></td></tr><tr><td><code>StartPlaybackCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-StartPlaybackHandler.html">StartPlaybackHandler</a></td></tr><tr><td><code>EndPartySessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-EndPartySessionHandler.html">EndPartySessionHandler</a></td></tr><tr><td><code>SyncPlaybackCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-SyncPlaybackHandler.html">SyncPlaybackHandler</a></td></tr><tr><td><code>TransferHostCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-TransferHostHandler.html">TransferHostHandler</a></td></tr><tr><td><code>PausePlaybackCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-PausePlaybackHandler.html">PausePlaybackHandler</a></td></tr><tr><td><code>SeekPlaybackCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-SeekPlaybackHandler.html">SeekPlaybackHandler</a></td></tr><tr><td><code>JoinPartySessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Party-Application-CommandHandler-JoinPartySessionHandler.html">JoinPartySessionHandler</a></td></tr></tbody></table><h3>Playlist</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>RemoveSongCommand</code></td><td><a href=".phpdoc/build/classes/App-Playlist-Application-CommandHandler-RemoveSongHandler.html">RemoveSongHandler</a></td></tr><tr><td><code>UpdatePlaylistCommand</code></td><td><a href=".phpdoc/build/classes/App-Playlist-Application-CommandHandler-UpdatePlaylistHandler.html">UpdatePlaylistHandler</a></td></tr><tr><td><code>CreatePlaylistCommand</code></td><td><a href=".phpdoc/build/classes/App-Playlist-Application-CommandHandler-CreatePlaylistHandler.html">CreatePlaylistHandler</a></td></tr><tr><td><code>AddSongCommand</code></td><td><a href=".phpdoc/build/classes/App-Playlist-Application-CommandHandler-AddSongHandler.html">AddSongHandler</a></td></tr></tbody></table><h3>Recommendation</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>GetRecommendationsForUserQuery</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-QueryHandler-GetRecommendationsForUserHandler.html">GetRecommendationsForUserHandler</a></td></tr><tr><td><code>GetRecommendationQuery</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-QueryHandler-GetRecommendationHandler.html">GetRecommendationHandler</a></td></tr><tr><td><code>GetRecommendationsBySourceQuery</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-QueryHandler-GetRecommendationsBySourceHandler.html">GetRecommendationsBySourceHandler</a></td></tr><tr><td><code>GetTargetingRecommendationsQuery</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-QueryHandler-GetTargetingRecommendationsHandler.html">GetTargetingRecommendationsHandler</a></td></tr><tr><td><code>DeleteRecommendationCommand</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-CommandHandler-DeleteRecommendationHandler.html">DeleteRecommendationHandler</a></td></tr><tr><td><code>SaveRecommendationCommand</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-CommandHandler-SaveRecommendationHandler.html">SaveRecommendationHandler</a></td></tr><tr><td><code>DeleteRecommendationsBySourceCommand</code></td><td><a href=".phpdoc/build/classes/App-Recommendation-Application-CommandHandler-DeleteRecommendationsBySourceHandler.html">DeleteRecommendationsBySourceHandler</a></td></tr></tbody></table><h3>Transcode</h3><table><thead><tr><th>Command</th><th>Handler</th></tr></thead><tbody><tr><td><code>CleanupOrphanedJobsCommand</code></td><td><a href=".phpdoc/build/classes/App-Transcode-Application-CommandHandler-CleanupOrphanedJobsHandler.html">CleanupOrphanedJobsHandler</a></td></tr><tr><td><code>CreateTranscodeSessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Transcode-Application-CommandHandler-CreateTranscodeSessionHandler.html">CreateTranscodeSessionHandler</a></td></tr><tr><td><code>CancelTranscodeSessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Transcode-Application-CommandHandler-CancelTranscodeSessionHandler.html">CancelTranscodeSessionHandler</a></td></tr><tr><td><code>PauseTranscodeSessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Transcode-Application-CommandHandler-PauseTranscodeSessionHandler.html">PauseTranscodeSessionHandler</a></td></tr><tr><td><code>ResumeTranscodeSessionCommand</code></td><td><a href=".phpdoc/build/classes/App-Transcode-Application-CommandHandler-ResumeTranscodeSessionHandler.html">ResumeTranscodeSessionHandler</a></td></tr></tbody></table>
<h2>Port Pattern</h2>
<p>Controllers depend on <strong>port interfaces</strong> defined in <code>Application/Port/</code>, not on repositories directly. This keeps the Interface layer decoupled from Infrastructure.</p>
</main>
</body>
</html>