Passed
Push — main ( e933de...5ef56a )
by Daniel
03:35
created

ApiApplication::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 0
c 1
b 0
f 0
dl 0
loc 4
ccs 1
cts 1
cp 1
rs 10
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Uxmp\Core\Api;
6
7
use Monolog\Handler\RotatingFileHandler;
8
use Monolog\Logger;
9
use Slim\App;
10
use Tuupola\Middleware\CorsMiddleware;
11
use Tuupola\Middleware\JwtAuthentication;
12
use Usox\HyperSonic\HyperSonicInterface;
13
use Uxmp\Core\Api\Album\AlbumApplication;
14
use Uxmp\Core\Api\Album\AlbumFavoriteApplication;
15
use Uxmp\Core\Api\Album\AlbumListApplication;
16
use Uxmp\Core\Api\Album\AlbumListByGenreApplication;
17
use Uxmp\Core\Api\Album\AlbumRecentApplication;
18
use Uxmp\Core\Api\Album\AlbumSongsApplication;
19
use Uxmp\Core\Api\Art\ArtApplication;
20
use Uxmp\Core\Api\Artist\ArtistApplication;
21
use Uxmp\Core\Api\Artist\ArtistListApplication;
22
use Uxmp\Core\Api\Artist\ArtistSongsApplication;
23
use Uxmp\Core\Api\Artist\ArtistTopSongsApplication;
24
use Uxmp\Core\Api\Common\LoginApplication;
25
use Uxmp\Core\Api\Common\LogoutApplication;
26
use Uxmp\Core\Api\Genre\GenreListApplication;
27
use Uxmp\Core\Api\Lib\Middleware\MiddlewareFactoryInterface;
28
use Uxmp\Core\Api\Playback\MostPlayedApplication;
29
use Uxmp\Core\Api\Playback\NowPlayingUpdate;
30
use Uxmp\Core\Api\Playback\PlaybackHistoryApplication;
31
use Uxmp\Core\Api\Playback\PlaySongApplication;
32
use Uxmp\Core\Api\Playlist\PlaylistAddMediaApplication;
33
use Uxmp\Core\Api\Playlist\PlaylistCreationApplication;
34
use Uxmp\Core\Api\Playlist\PlaylistDeletionApplication;
35
use Uxmp\Core\Api\Playlist\PlaylistEditApplication;
36
use Uxmp\Core\Api\Playlist\PlaylistListApplication;
37
use Uxmp\Core\Api\Playlist\PlaylistListByUserApplication;
38
use Uxmp\Core\Api\Playlist\PlaylistRetrieveApplication;
39
use Uxmp\Core\Api\Playlist\PlaylistSongListApplication;
40
use Uxmp\Core\Api\PlaylistTypes\PlaylistTypesApplication;
41
use Uxmp\Core\Api\RadioStation\RadioStationCreationApplication;
42
use Uxmp\Core\Api\RadioStation\RadioStationDeletionApplication;
43
use Uxmp\Core\Api\RadioStation\RadioStationEditApplication;
44
use Uxmp\Core\Api\RadioStation\RadioStationListApplication;
45
use Uxmp\Core\Api\RadioStation\RadioStationRetrieveApplication;
46
use Uxmp\Core\Api\Random\RandomFavoriteSongsApplication;
47
use Uxmp\Core\Api\Random\RandomSongsApplication;
48
use Uxmp\Core\Api\Settings\UserCreationApplication;
49
use Uxmp\Core\Api\Settings\UserListApplication;
50
use Uxmp\Core\Api\Settings\UserPasswordUpdateApplication;
51
use Uxmp\Core\Api\Settings\UserRetrieveApplication;
52
use Uxmp\Core\Api\TemporaryPlaylist\TemporaryPlaylistRetrieveApplication;
53
use Uxmp\Core\Api\TemporaryPlaylist\TemporaryPlaylistRetrieveSongsApplication;
54
use Uxmp\Core\Api\TemporaryPlaylist\TemporaryPlaylistUpdateApplication;
55
use Uxmp\Core\Api\User\FavoriteAddApplication;
56
use Uxmp\Core\Api\User\FavoriteListApplication;
57
use Uxmp\Core\Api\User\FavoriteRemoveApplication;
58
use Uxmp\Core\Api\User\SubSonic\SubSonicSettingsCreateApplication;
59
use Uxmp\Core\Api\User\SubSonic\SubSonicSettingsDeleteApplication;
60
use Uxmp\Core\Api\User\SubSonic\SubSonicSettingsRetrieveApplication;
61
use Uxmp\Core\Api\User\UserAclRetrieveApplication;
62
use Uxmp\Core\Api\User\UserSettingsEditApplication;
63
use Uxmp\Core\Api\User\UserSettingsPasswordUpdateApplication;
64
use Uxmp\Core\Api\User\UserSettingsRetrieveApplication;
65
use Uxmp\Core\Component\Config\ConfigProviderInterface;
66
67
/**
68
 * Registers all api routes
69
 */
70
final class ApiApplication
71
{
72 1
    public function __construct(
73
        private readonly ConfigProviderInterface $config,
74
        private readonly MiddlewareFactoryInterface $middlewareFactory,
75
    ) {
76 1
    }
77
78 1
    public function run(
79
        App $app,
80
        Logger $logger,
81
    ): void {
82 1
        $apiBasePath = $this->config->getApiBasePath();
83
84 1
        $rotating = new RotatingFileHandler(
85 1
            sprintf(
86 1
                '%s/router.log',
87 1
                $this->config->getLogFilePath(),
88 1
            ),
89 1
            10,
90 1
            $this->config->getLogLevel()
91 1
        );
92 1
        $logger->pushHandler($rotating);
93
94 1
        $app->addBodyParsingMiddleware();
95 1
        $app->addErrorMiddleware(
96 1
            $this->config->getDebugMode(),
97 1
            true,
98 1
            true,
99 1
            $logger
100 1
        );
101 1
        $app->setBasePath($apiBasePath);
102
103 1
        $app->add($this->middlewareFactory->createRequestLoggingMiddleware($logger));
104 1
        $app->add($this->middlewareFactory->createSessionValidatorMiddleware());
105
106 1
        $app->add(new JwtAuthentication([
107 1
            'ignore' => [$apiBasePath . '/common/login', $apiBasePath . '/art', $apiBasePath . '/rest'],
108 1
            'cookie' => $this->config->getCookieName(),
109 1
            'secret' => $this->config->getJwtSecret(),
110 1
            'logger' => $logger,
111 1
        ]));
112 1
        $app->add(new CorsMiddleware([
113 1
            'methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
114 1
            'headers.allow' => ['Authorization', 'Content-Type'],
115 1
            'origin' => $this->config->getCorsOrigin(),
116 1
            'logger' => $logger,
117 1
            'credentials' => true,
118 1
        ]));
119
120
        // common
121 1
        $app->post('/common/login', LoginApplication::class);
122 1
        $app->post('/common/logout', LogoutApplication::class);
123
124
        // playback
125 1
        $app->get('/play/history', PlaybackHistoryApplication::class);
126 1
        $app->get('/play/mostplayed', MostPlayedApplication::class);
127 1
        $app->get('/play/{id}', PlaySongApplication::class);
128 1
        $app->post('/play/nowplaying', NowPlayingUpdate::class);
129
130
        // artists
131 1
        $app->get('/artists', ArtistListApplication::class);
132 1
        $app->get('/artist/{artistId}', ArtistApplication::class);
133 1
        $app->get('/artist/{artistId}/songs', ArtistSongsApplication::class);
134 1
        $app->get('/artist/{artistId}/top_songs', ArtistTopSongsApplication::class);
135
136
        // albums
137 1
        $app->get('/albums/recent', AlbumRecentApplication::class);
138 1
        $app->get('/albums/favorite', AlbumFavoriteApplication::class);
139 1
        $app->get('/albums/genre/{genreId}', AlbumListByGenreApplication::class);
140 1
        $app->get('/albums[/{artistId}]', AlbumListApplication::class);
141 1
        $app->get('/album/{albumId}', AlbumApplication::class);
142 1
        $app->get('/album/{albumId}/songs', AlbumSongsApplication::class);
143
144
        // random
145 1
        $app->get('/random/songs[/{limit}]', RandomSongsApplication::class);
146 1
        $app->get('/random/favorite[/{limit}]', RandomFavoriteSongsApplication::class);
147
148
        // art
149 1
        $app->get('/art/{type}/{id}', ArtApplication::class);
150
151
        // user favorites
152 1
        $app->get('/user/favorite', FavoriteListApplication::class);
153 1
        $app->post('/user/favorite/{type}/add', FavoriteAddApplication::class);
154 1
        $app->post('/user/favorite/{type}/remove', FavoriteRemoveApplication::class);
155
156
        // radio stations
157 1
        $app->get('/radiostations', RadioStationListApplication::class);
158 1
        $app->post('/radiostation', RadioStationCreationApplication::class);
159 1
        $app->delete('/radiostation/{stationId}', RadioStationDeletionApplication::class);
160 1
        $app->get('/radiostation/{stationId}', RadioStationRetrieveApplication::class);
161 1
        $app->put('/radiostation/{stationId}', RadioStationEditApplication::class);
162
163
        // user settings
164 1
        $app->get('/usersettings', UserSettingsRetrieveApplication::class);
165 1
        $app->put('/usersettings', UserSettingsEditApplication::class);
166 1
        $app->get('/usersettings/subsonic', SubSonicSettingsRetrieveApplication::class);
167 1
        $app->post('/usersettings/subsonic', SubSonicSettingsCreateApplication::class);
168 1
        $app->delete('/usersettings/subsonic', SubSonicSettingsDeleteApplication::class);
169 1
        $app->put('/usersettings/password', UserSettingsPasswordUpdateApplication::class);
170 1
        $app->get('/usersettings/acl', UserAclRetrieveApplication::class);
171
172
        // playlist
173 1
        $app->get('/playlists', PlaylistListApplication::class);
174 1
        $app->get('/playlists/user', PlaylistListByUserApplication::class);
175 1
        $app->post('/playlist', PlaylistCreationApplication::class);
176 1
        $app->put('/playlist/{playlistId}', PlaylistEditApplication::class);
177 1
        $app->get('/playlist/{playlistId}', PlaylistRetrieveApplication::class);
178 1
        $app->delete('/playlist/{playlistId}', PlaylistDeletionApplication::class);
179 1
        $app->post('/playlist/{playlistId}/songs', PlaylistAddMediaApplication::class);
180 1
        $app->get('/playlist/{playlistId}/songs', PlaylistSongListApplication::class);
181
182
        // temporary playlist
183 1
        $app->get('/temporary_playlist', TemporaryPlaylistRetrieveApplication::class);
184 1
        $app->get('/temporary_playlist/{temporaryPlaylistId}', TemporaryPlaylistRetrieveSongsApplication::class);
185 1
        $app->post('/temporary_playlist', TemporaryPlaylistUpdateApplication::class);
186
187
        // playlist types
188 1
        $app->get('/playlist_types', PlaylistTypesApplication::class);
189
190
        // genres
191 1
        $app->get('/genres', GenreListApplication::class);
192
193
        // settings
194 1
        $app->get('/settings/user', UserListApplication::class);
195 1
        $app->get('/settings/user/{userId}', UserRetrieveApplication::class);
196 1
        $app->post('/settings/user', UserCreationApplication::class);
197 1
        $app->put('/settings/user/password', UserPasswordUpdateApplication::class);
198
199
        // subsonic api
200 1
        $app->get('/rest/{methodName}', HyperSonicInterface::class);
201
202 1
        $app->run();
203
    }
204
}
205