Skip to content

Commit b84c1eb

Browse files
committed
refactor(core): Switch to attribute based routing
Signed-off-by: provokateurin <kate@provokateurin.de>
1 parent 1f7b103 commit b84c1eb

40 files changed

Lines changed: 2001 additions & 1999 deletions

core/Controller/AppPasswordController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use OC\Authentication\Token\IToken;
3434
use OC\User\Session;
3535
use OCP\AppFramework\Http;
36+
use OCP\AppFramework\Http\Attribute\ApiRoute;
3637
use OCP\AppFramework\Http\Attribute\UseSession;
3738
use OCP\AppFramework\Http\DataResponse;
3839
use OCP\AppFramework\OCS\OCSForbiddenException;
@@ -74,6 +75,7 @@ public function __construct(
7475
*
7576
* 200: App password returned
7677
*/
78+
#[ApiRoute(verb: 'GET', url: '/getapppassword', root: '/core')]
7779
public function getAppPassword(): DataResponse {
7880
// We do not allow the creation of new tokens if this is an app password
7981
if ($this->session->exists('app_password')) {
@@ -125,6 +127,7 @@ public function getAppPassword(): DataResponse {
125127
*
126128
* 200: App password deleted successfully
127129
*/
130+
#[ApiRoute(verb: 'DELETE', url: '/apppassword', root: '/core')]
128131
public function deleteAppPassword(): DataResponse {
129132
if (!$this->session->exists('app_password')) {
130133
throw new OCSForbiddenException('no app password in use');
@@ -152,6 +155,7 @@ public function deleteAppPassword(): DataResponse {
152155
*
153156
* 200: App password returned
154157
*/
158+
#[ApiRoute(verb: 'POST', url: '/apppassword/rotate', root: '/core')]
155159
public function rotateAppPassword(): DataResponse {
156160
if (!$this->session->exists('app_password')) {
157161
throw new OCSForbiddenException('no app password in use');
@@ -187,6 +191,7 @@ public function rotateAppPassword(): DataResponse {
187191
* 403: Password confirmation failed
188192
*/
189193
#[UseSession]
194+
#[ApiRoute(verb: 'PUT', url: '/apppassword/confirm', root: '/core')]
190195
public function confirmUserPassword(string $password): DataResponse {
191196
$loginName = $this->userSession->getLoginName();
192197
$loginResult = $this->userManager->checkPassword($loginName, $password);

core/Controller/AutoCompleteController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
use OCA\Core\ResponseDefinitions;
3434
use OCP\AppFramework\Http;
35+
use OCP\AppFramework\Http\Attribute\ApiRoute;
3536
use OCP\AppFramework\Http\DataResponse;
3637
use OCP\AppFramework\OCSController;
3738
use OCP\Collaboration\AutoComplete\AutoCompleteEvent;
@@ -72,6 +73,7 @@ public function __construct(
7273
*
7374
* 200: Autocomplete results returned
7475
*/
76+
#[ApiRoute(verb: 'GET', url: '/autocomplete/get', root: '/core')]
7577
public function get(string $search, ?string $itemType, ?string $itemId, ?string $sorter = null, array $shareTypes = [IShare::TYPE_USER], int $limit = 10): DataResponse {
7678
// if enumeration/user listings are disabled, we'll receive an empty
7779
// result from search() – thus nothing else to do here.

core/Controller/AvatarController.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use OC\AppFramework\Utility\TimeFactory;
3535
use OCP\AppFramework\Controller;
3636
use OCP\AppFramework\Http;
37+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3738
use OCP\AppFramework\Http\DataDisplayResponse;
3839
use OCP\AppFramework\Http\FileDisplayResponse;
3940
use OCP\AppFramework\Http\JSONResponse;
@@ -82,6 +83,7 @@ public function __construct(
8283
* 200: Avatar returned
8384
* 404: Avatar not found
8485
*/
86+
#[FrontpageRoute(verb: 'GET', url: '/avatar/{userId}/{size}/dark')]
8587
public function getAvatarDark(string $userId, int $size) {
8688
if ($size <= 64) {
8789
if ($size !== 64) {
@@ -128,6 +130,7 @@ public function getAvatarDark(string $userId, int $size) {
128130
* 200: Avatar returned
129131
* 404: Avatar not found
130132
*/
133+
#[FrontpageRoute(verb: 'GET', url: '/avatar/{userId}/{size}')]
131134
public function getAvatar(string $userId, int $size) {
132135
if ($size <= 64) {
133136
if ($size !== 64) {
@@ -161,6 +164,7 @@ public function getAvatar(string $userId, int $size) {
161164
/**
162165
* @NoAdminRequired
163166
*/
167+
#[FrontpageRoute(verb: 'POST', url: '/avatar/')]
164168
public function postAvatar(?string $path = null): JSONResponse {
165169
$files = $this->request->getUploadedFile('files');
166170

@@ -283,6 +287,7 @@ public function postAvatar(?string $path = null): JSONResponse {
283287
/**
284288
* @NoAdminRequired
285289
*/
290+
#[FrontpageRoute(verb: 'DELETE', url: '/avatar/')]
286291
public function deleteAvatar(): JSONResponse {
287292
try {
288293
$avatar = $this->avatarManager->getAvatar($this->userId);
@@ -299,6 +304,7 @@ public function deleteAvatar(): JSONResponse {
299304
*
300305
* @return JSONResponse|DataDisplayResponse
301306
*/
307+
#[FrontpageRoute(verb: 'GET', url: '/avatar/tmp')]
302308
public function getTmpAvatar() {
303309
$tmpAvatar = $this->cache->get('tmpAvatar');
304310
if (is_null($tmpAvatar)) {
@@ -325,6 +331,7 @@ public function getTmpAvatar() {
325331
/**
326332
* @NoAdminRequired
327333
*/
334+
#[FrontpageRoute(verb: 'POST', url: '/avatar/cropped')]
328335
public function postCroppedAvatar(?array $crop = null): JSONResponse {
329336
if (is_null($crop)) {
330337
return new JSONResponse(['data' => ['message' => $this->l10n->t("No crop data provided")]],

core/Controller/CSRFTokenController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use OC\Security\CSRF\CsrfTokenManager;
3131
use OCP\AppFramework\Controller;
3232
use OCP\AppFramework\Http;
33+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3334
use OCP\AppFramework\Http\Attribute\OpenAPI;
3435
use OCP\AppFramework\Http\JSONResponse;
3536
use OCP\IRequest;
@@ -49,6 +50,7 @@ public function __construct(
4950
* @NoCSRFRequired
5051
* @PublicPage
5152
*/
53+
#[FrontpageRoute(verb: 'GET', url: '/csrftoken')]
5254
public function index(): JSONResponse {
5355
if (!$this->request->passesStrictCookieCheck()) {
5456
return new JSONResponse([], Http::STATUS_FORBIDDEN);

core/Controller/ClientFlowLoginController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
use OCA\OAuth2\Db\ClientMapper;
4242
use OCP\AppFramework\Controller;
4343
use OCP\AppFramework\Http;
44+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
4445
use OCP\AppFramework\Http\Attribute\OpenAPI;
4546
use OCP\AppFramework\Http\Attribute\UseSession;
4647
use OCP\AppFramework\Http\Response;
@@ -113,6 +114,7 @@ private function stateTokenForbiddenResponse(): StandaloneTemplateResponse {
113114
* @NoCSRFRequired
114115
*/
115116
#[UseSession]
117+
#[FrontpageRoute(verb: 'GET', url: '/login/flow')]
116118
public function showAuthPickerPage(string $clientIdentifier = '', string $user = '', int $direct = 0): StandaloneTemplateResponse {
117119
$clientName = $this->getClientName();
118120
$client = null;
@@ -180,6 +182,7 @@ public function showAuthPickerPage(string $clientIdentifier = '', string $user =
180182
* @NoSameSiteCookieRequired
181183
*/
182184
#[UseSession]
185+
#[FrontpageRoute(verb: 'GET', url: '/login/flow/grant')]
183186
public function grantPage(string $stateToken = '',
184187
string $clientIdentifier = '',
185188
int $direct = 0): StandaloneTemplateResponse {
@@ -232,6 +235,7 @@ public function grantPage(string $stateToken = '',
232235
* @return Http\RedirectResponse|Response
233236
*/
234237
#[UseSession]
238+
#[FrontpageRoute(verb: 'POST', url: '/login/flow')]
235239
public function generateAppPassword(string $stateToken,
236240
string $clientIdentifier = '') {
237241
if (!$this->isValidToken($stateToken)) {
@@ -323,6 +327,7 @@ public function generateAppPassword(string $stateToken,
323327
/**
324328
* @PublicPage
325329
*/
330+
#[FrontpageRoute(verb: 'POST', url: '/login/flow/apptoken')]
326331
public function apptokenRedirect(string $stateToken, string $user, string $password): Response {
327332
if (!$this->isValidToken($stateToken)) {
328333
return $this->stateTokenForbiddenResponse();

core/Controller/ClientFlowLoginV2Controller.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use OCA\Core\ResponseDefinitions;
3434
use OCP\AppFramework\Controller;
3535
use OCP\AppFramework\Http;
36+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3637
use OCP\AppFramework\Http\Attribute\OpenAPI;
3738
use OCP\AppFramework\Http\Attribute\UseSession;
3839
use OCP\AppFramework\Http\JSONResponse;
@@ -84,6 +85,7 @@ public function __construct(
8485
* 200: Login flow credentials returned
8586
* 404: Login flow not found or completed
8687
*/
88+
#[FrontpageRoute(verb: 'POST', url: '/login/v2/poll')]
8789
public function poll(string $token): JSONResponse {
8890
try {
8991
$creds = $this->loginFlowV2Service->poll($token);
@@ -100,6 +102,7 @@ public function poll(string $token): JSONResponse {
100102
*/
101103
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
102104
#[UseSession]
105+
#[FrontpageRoute(verb: 'GET', url: '/login/v2/flow/{token}')]
103106
public function landing(string $token, $user = ''): Response {
104107
if (!$this->loginFlowV2Service->startLoginFlow($token)) {
105108
return $this->loginTokenForbiddenResponse();
@@ -118,6 +121,7 @@ public function landing(string $token, $user = ''): Response {
118121
*/
119122
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
120123
#[UseSession]
124+
#[FrontpageRoute(verb: 'GET', url: '/login/v2/flow')]
121125
public function showAuthPickerPage($user = ''): StandaloneTemplateResponse {
122126
try {
123127
$flow = $this->getFlowByLoginToken();
@@ -152,6 +156,7 @@ public function showAuthPickerPage($user = ''): StandaloneTemplateResponse {
152156
*/
153157
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
154158
#[UseSession]
159+
#[FrontpageRoute(verb: 'GET', url: '/login/v2/grant')]
155160
public function grantPage(?string $stateToken): StandaloneTemplateResponse {
156161
if ($stateToken === null) {
157162
return $this->stateTokenMissingResponse();
@@ -187,6 +192,7 @@ public function grantPage(?string $stateToken): StandaloneTemplateResponse {
187192
/**
188193
* @PublicPage
189194
*/
195+
#[FrontpageRoute(verb: 'POST', url: '/login/v2/apptoken')]
190196
public function apptokenRedirect(?string $stateToken, string $user, string $password) {
191197
if ($stateToken === null) {
192198
return $this->stateTokenMissingResponse();
@@ -234,6 +240,7 @@ public function apptokenRedirect(?string $stateToken, string $user, string $pass
234240
* @NoAdminRequired
235241
*/
236242
#[UseSession]
243+
#[FrontpageRoute(verb: 'POST', url: '/login/v2/grant')]
237244
public function generateAppPassword(?string $stateToken): Response {
238245
if ($stateToken === null) {
239246
return $this->stateTokenMissingResponse();
@@ -291,6 +298,7 @@ private function handleFlowDone(bool $result): StandaloneTemplateResponse {
291298
*
292299
* 200: Login flow init returned
293300
*/
301+
#[FrontpageRoute(verb: 'POST', url: '/login/v2')]
294302
public function init(): JSONResponse {
295303
// Get client user agent
296304
$userAgent = $this->request->getHeader('USER_AGENT');

core/Controller/CollaborationResourcesController.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use Exception;
3333
use OCA\Core\ResponseDefinitions;
3434
use OCP\AppFramework\Http;
35+
use OCP\AppFramework\Http\Attribute\ApiRoute;
3536
use OCP\AppFramework\Http\DataResponse;
3637
use OCP\AppFramework\OCSController;
3738
use OCP\Collaboration\Resources\CollectionException;
@@ -84,6 +85,7 @@ protected function getCollection(int $collectionId): ICollection {
8485
* 200: Collection returned
8586
* 404: Collection not found
8687
*/
88+
#[ApiRoute(verb: 'GET', url: '/resources/collections/{collectionId}', root: '/collaboration')]
8789
public function listCollection(int $collectionId): DataResponse {
8890
try {
8991
$collection = $this->getCollection($collectionId);
@@ -105,6 +107,7 @@ public function listCollection(int $collectionId): DataResponse {
105107
* 200: Collections returned
106108
* 404: Collection not found
107109
*/
110+
#[ApiRoute(verb: 'GET', url: '/resources/collections/search/{filter}', root: '/collaboration')]
108111
public function searchCollections(string $filter): DataResponse {
109112
try {
110113
$collections = $this->manager->searchCollections($this->userSession->getUser(), $filter);
@@ -128,6 +131,7 @@ public function searchCollections(string $filter): DataResponse {
128131
* 200: Collection returned
129132
* 404: Collection not found or resource inaccessible
130133
*/
134+
#[ApiRoute(verb: 'POST', url: '/resources/collections/{collectionId}', root: '/collaboration')]
131135
public function addResource(int $collectionId, string $resourceType, string $resourceId): DataResponse {
132136
try {
133137
$collection = $this->getCollection($collectionId);
@@ -162,6 +166,7 @@ public function addResource(int $collectionId, string $resourceType, string $res
162166
* 200: Collection returned
163167
* 404: Collection or resource not found
164168
*/
169+
#[ApiRoute(verb: 'DELETE', url: '/resources/collections/{collectionId}', root: '/collaboration')]
165170
public function removeResource(int $collectionId, string $resourceType, string $resourceId): DataResponse {
166171
try {
167172
$collection = $this->getCollection($collectionId);
@@ -192,6 +197,7 @@ public function removeResource(int $collectionId, string $resourceType, string $
192197
* 200: Collections returned
193198
* 404: Resource not accessible
194199
*/
200+
#[ApiRoute(verb: 'GET', url: '/resources/{resourceType}/{resourceId}', root: '/collaboration')]
195201
public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse {
196202
try {
197203
$resource = $this->manager->getResourceForUser($resourceType, $resourceId, $this->userSession->getUser());
@@ -220,6 +226,7 @@ public function getCollectionsByResource(string $resourceType, string $resourceI
220226
* 400: Creating collection is not possible
221227
* 404: Resource inaccessible
222228
*/
229+
#[ApiRoute(verb: 'POST', url: '/resources/{baseResourceType}/{baseResourceId}', root: '/collaboration')]
223230
public function createCollectionOnResource(string $baseResourceType, string $baseResourceId, string $name): DataResponse {
224231
if (!isset($name[0]) || isset($name[64])) {
225232
return new DataResponse([], Http::STATUS_BAD_REQUEST);
@@ -253,6 +260,7 @@ public function createCollectionOnResource(string $baseResourceType, string $bas
253260
* 200: Collection returned
254261
* 404: Collection not found
255262
*/
263+
#[ApiRoute(verb: 'PUT', url: '/resources/collections/{collectionId}', root: '/collaboration')]
256264
public function renameCollection(int $collectionId, string $collectionName): DataResponse {
257265
try {
258266
$collection = $this->getCollection($collectionId);

core/Controller/ContactsMenuController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use OC\Contacts\ContactsMenu\Manager;
2929
use OCP\AppFramework\Controller;
3030
use OCP\AppFramework\Http;
31+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3132
use OCP\AppFramework\Http\JSONResponse;
3233
use OCP\IRequest;
3334
use OCP\IUserSession;
@@ -47,6 +48,7 @@ public function __construct(
4748
* @return \JsonSerializable[]
4849
* @throws Exception
4950
*/
51+
#[FrontpageRoute(verb: 'POST', url: '/contactsmenu/contacts')]
5052
public function index(?string $filter = null): array {
5153
return $this->manager->getEntries($this->userSession->getUser(), $filter);
5254
}
@@ -57,6 +59,7 @@ public function index(?string $filter = null): array {
5759
* @return JSONResponse|\JsonSerializable
5860
* @throws Exception
5961
*/
62+
#[FrontpageRoute(verb: 'POST', url: '/contactsmenu/findOne')]
6063
public function findOne(int $shareType, string $shareWith) {
6164
$contact = $this->manager->findOne($this->userSession->getUser(), $shareType, $shareWith);
6265

core/Controller/CssController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use OC\Files\AppData\Factory;
3535
use OCP\AppFramework\Controller;
3636
use OCP\AppFramework\Http;
37+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3738
use OCP\AppFramework\Http\Attribute\OpenAPI;
3839
use OCP\AppFramework\Http\FileDisplayResponse;
3940
use OCP\AppFramework\Http\NotFoundResponse;
@@ -69,6 +70,7 @@ public function __construct(
6970
* @param string $appName css folder name
7071
* @return FileDisplayResponse|NotFoundResponse
7172
*/
73+
#[FrontpageRoute(verb: 'GET', url: '/css/{appName}/{fileName}')]
7274
public function getCss(string $fileName, string $appName): Response {
7375
try {
7476
$folder = $this->appData->getFolder($appName);

core/Controller/ErrorController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
namespace OC\Core\Controller;
2929

3030
use OCP\AppFramework\Http;
31+
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
3132
use OCP\AppFramework\Http\Attribute\OpenAPI;
3233
use OCP\AppFramework\Http\TemplateResponse;
3334

@@ -37,6 +38,7 @@ class ErrorController extends \OCP\AppFramework\Controller {
3738
* @PublicPage
3839
* @NoCSRFRequired
3940
*/
41+
#[FrontpageRoute(verb: 'GET', url: 'error/403')]
4042
public function error403(): TemplateResponse {
4143
$response = new TemplateResponse(
4244
'core',
@@ -52,6 +54,7 @@ public function error403(): TemplateResponse {
5254
* @PublicPage
5355
* @NoCSRFRequired
5456
*/
57+
#[FrontpageRoute(verb: 'GET', url: 'error/404')]
5558
public function error404(): TemplateResponse {
5659
$response = new TemplateResponse(
5760
'core',

0 commit comments

Comments
 (0)