diff options
109 files changed, 698 insertions, 448 deletions
diff --git a/apps/cloud_federation_api/lib/Capabilities.php b/apps/cloud_federation_api/lib/Capabilities.php index d5cb30bdc3f..ca4ea928cb8 100644 --- a/apps/cloud_federation_api/lib/Capabilities.php +++ b/apps/cloud_federation_api/lib/Capabilities.php @@ -31,11 +31,11 @@ class Capabilities implements ICapability { * enabled: bool, * apiVersion: string, * endPoint: string, - * resourceTypes: array{ + * resourceTypes: list<array{ * name: string, - * shareTypes: string[], + * shareTypes: list<string>, * protocols: array<string, string> - * }[], + * }>, * }, * } * @throws OCMArgumentException diff --git a/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php b/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php index 4cd668c29a0..a7b17f010ce 100644 --- a/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php +++ b/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php @@ -67,7 +67,7 @@ class RequestHandlerController extends Controller { * @param string|null $ownerDisplayName Display name of the user who shared the item * @param string|null $sharedBy Provider specific UID of the user who shared the resource * @param string|null $sharedByDisplayName Display name of the user who shared the resource - * @param array{name: string[], options: array<string, mixed>} $protocol e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]] + * @param array{name: list<string>, options: array<string, mixed>} $protocol e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]] * @param string $shareType 'group' or 'user' share * @param string $resourceType 'file', 'calendar',... * diff --git a/apps/cloud_federation_api/lib/ResponseDefinitions.php b/apps/cloud_federation_api/lib/ResponseDefinitions.php index 80195c54137..b17f5aadc1d 100644 --- a/apps/cloud_federation_api/lib/ResponseDefinitions.php +++ b/apps/cloud_federation_api/lib/ResponseDefinitions.php @@ -20,10 +20,10 @@ namespace OCA\CloudFederationAPI; * } * * @psalm-type CloudFederationAPIValidationError = CloudFederationAPIError&array{ - * validationErrors: array{ + * validationErrors: list<array{ * name: string, * message: string|null, - * }[], + * }>, * } */ class ResponseDefinitions { diff --git a/apps/dashboard/lib/Controller/DashboardApiController.php b/apps/dashboard/lib/Controller/DashboardApiController.php index c3d91fd9d34..d31cede85b7 100644 --- a/apps/dashboard/lib/Controller/DashboardApiController.php +++ b/apps/dashboard/lib/Controller/DashboardApiController.php @@ -74,8 +74,8 @@ class DashboardApiController extends OCSController { * @param array<string, string> $sinceIds Array indexed by widget Ids, contains date/id from which we want the new items * @param int $limit Limit number of result items per widget * @psalm-param int<1, 30> $limit - * @param string[] $widgets Limit results to specific widgets - * @return DataResponse<Http::STATUS_OK, array<string, DashboardWidgetItem[]>, array{}> + * @param list<string> $widgets Limit results to specific widgets + * @return DataResponse<Http::STATUS_OK, array<string, list<DashboardWidgetItem>>, array{}> * * 200: Widget items returned */ @@ -102,7 +102,7 @@ class DashboardApiController extends OCSController { * @param array<string, string> $sinceIds Array indexed by widget Ids, contains date/id from which we want the new items * @param int $limit Limit number of result items per widget, not more than 30 are allowed * @psalm-param int<1, 30> $limit - * @param string[] $widgets Limit results to specific widgets + * @param list<string> $widgets Limit results to specific widgets * @return DataResponse<Http::STATUS_OK, array<string, DashboardWidgetItems>, array{}> * * 200: Widget items returned diff --git a/apps/dashboard/lib/ResponseDefinitions.php b/apps/dashboard/lib/ResponseDefinitions.php index df76efdab5a..be5a4d56883 100644 --- a/apps/dashboard/lib/ResponseDefinitions.php +++ b/apps/dashboard/lib/ResponseDefinitions.php @@ -18,13 +18,13 @@ namespace OCA\Dashboard; * icon_url: string, * widget_url: ?string, * item_icons_round: bool, - * item_api_versions: int[], + * item_api_versions: list<int>, * reload_interval: int, - * buttons?: array{ + * buttons?: list<array{ * type: string, * text: string, * link: string, - * }[], + * }>, * } * * @psalm-type DashboardWidgetItem = array{ @@ -37,7 +37,7 @@ namespace OCA\Dashboard; * } * * @psalm-type DashboardWidgetItems = array{ - * items: DashboardWidgetItem[], + * items: list<DashboardWidgetItem>, * emptyContentMessage: string, * halfEmptyContentMessage: string, * } diff --git a/apps/dav/lib/Controller/UpcomingEventsController.php b/apps/dav/lib/Controller/UpcomingEventsController.php index c8eb39abb17..a5d54f44754 100644 --- a/apps/dav/lib/Controller/UpcomingEventsController.php +++ b/apps/dav/lib/Controller/UpcomingEventsController.php @@ -35,7 +35,7 @@ class UpcomingEventsController extends OCSController { * Get information about upcoming events * * @param string|null $location location/URL to filter by - * @return DataResponse<Http::STATUS_OK, array{events: DAVUpcomingEvent[]}, array{}>|DataResponse<Http::STATUS_UNAUTHORIZED, null, array{}> + * @return DataResponse<Http::STATUS_OK, array{events: list<DAVUpcomingEvent>}, array{}>|DataResponse<Http::STATUS_UNAUTHORIZED, null, array{}> * * 200: Upcoming events * 401: When not authenticated @@ -47,10 +47,10 @@ class UpcomingEventsController extends OCSController { } return new DataResponse([ - 'events' => array_map(fn (UpcomingEvent $e) => $e->jsonSerialize(), $this->service->getEvents( + 'events' => array_values(array_map(fn (UpcomingEvent $e) => $e->jsonSerialize(), $this->service->getEvents( $this->userId, $location, - )), + ))), ]); } diff --git a/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php b/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php index 222c6490b83..63de8ff605e 100644 --- a/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php +++ b/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php @@ -72,7 +72,7 @@ class RequestHandlerController extends OCSController { * @param int|null $remoteId ID of the remote * @param string|null $sharedByFederatedId Federated ID of the sender * @param string|null $ownerFederatedId Federated ID of the receiver - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Share created successfully @@ -186,7 +186,7 @@ class RequestHandlerController extends OCSController { * * @param int $id ID of the remote share * @param string|null $token Shared secret between servers - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * @throws ShareNotFound * @throws HintException @@ -221,7 +221,7 @@ class RequestHandlerController extends OCSController { * * @param int $id ID of the remote share * @param string|null $token Shared secret between servers - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Share declined successfully @@ -254,7 +254,7 @@ class RequestHandlerController extends OCSController { * * @param int $id ID of the share * @param string|null $token Shared secret between servers - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Share unshared successfully @@ -290,7 +290,7 @@ class RequestHandlerController extends OCSController { * * @param int $id ID of the share * @param string|null $token Shared secret between servers - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSBadRequestException Revoking the share is not possible * * 200: Share revoked successfully @@ -332,7 +332,7 @@ class RequestHandlerController extends OCSController { * @param int $id ID of the share * @param string|null $token Shared secret between servers * @param int|null $permissions New permissions - * @return Http\DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return Http\DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSBadRequestException Updating permissions is not possible * * 200: Permissions updated successfully diff --git a/apps/federation/lib/Controller/OCSAuthAPIController.php b/apps/federation/lib/Controller/OCSAuthAPIController.php index 0aa3f8bd148..44725fa0dba 100644 --- a/apps/federation/lib/Controller/OCSAuthAPIController.php +++ b/apps/federation/lib/Controller/OCSAuthAPIController.php @@ -52,7 +52,7 @@ class OCSAuthAPIController extends OCSController { * * @param string $url URL of the server * @param string $token Token of the server - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSForbiddenException Requesting shared secret is not allowed * * 200: Shared secret requested successfully @@ -87,7 +87,7 @@ class OCSAuthAPIController extends OCSController { * * @param string $url URL of the server * @param string $token Token of the server - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSForbiddenException Requesting shared secret is not allowed * * 200: Shared secret requested successfully diff --git a/apps/files/lib/Capabilities.php b/apps/files/lib/Capabilities.php index d20d348a9f5..16ea42eae22 100644 --- a/apps/files/lib/Capabilities.php +++ b/apps/files/lib/Capabilities.php @@ -21,7 +21,7 @@ class Capabilities implements ICapability { /** * Return this classes capabilities * - * @return array{files: array{'$comment': ?string, bigfilechunking: bool, blacklisted_files: array<mixed>, forbidden_filenames: list<string>, forbidden_filename_basenames: list<string>, forbidden_filename_characters: list<string>, forbidden_filename_extensions: list<string>, chunked_upload: array{max_size: int, max_parallel_count: int}}} + * @return array{files: array{'$comment': ?string, bigfilechunking: bool, blacklisted_files: list<mixed>, forbidden_filenames: list<string>, forbidden_filename_basenames: list<string>, forbidden_filename_characters: list<string>, forbidden_filename_extensions: list<string>, chunked_upload: array{max_size: int, max_parallel_count: int}}} */ public function getCapabilities(): array { return [ diff --git a/apps/files/lib/Controller/DirectEditingController.php b/apps/files/lib/Controller/DirectEditingController.php index 63f29d3ba2a..2c910006df5 100644 --- a/apps/files/lib/Controller/DirectEditingController.php +++ b/apps/files/lib/Controller/DirectEditingController.php @@ -36,7 +36,7 @@ class DirectEditingController extends OCSController { /** * Get the direct editing capabilities - * @return DataResponse<Http::STATUS_OK, array{editors: array<string, array{id: string, name: string, mimetypes: string[], optionalMimetypes: string[], secure: bool}>, creators: array<string, array{id: string, editor: string, name: string, extension: string, templates: bool, mimetypes: string[]}>}, array{}> + * @return DataResponse<Http::STATUS_OK, array{editors: array<string, array{id: string, name: string, mimetypes: list<string>, optionalMimetypes: list<string>, secure: bool}>, creators: array<string, array{id: string, editor: string, name: string, extension: string, templates: bool, mimetypes: list<string>}>}, array{}> * * 200: Direct editing capabilities returned */ diff --git a/apps/files/lib/Controller/OpenLocalEditorController.php b/apps/files/lib/Controller/OpenLocalEditorController.php index dae321ae437..b000304eef6 100644 --- a/apps/files/lib/Controller/OpenLocalEditorController.php +++ b/apps/files/lib/Controller/OpenLocalEditorController.php @@ -46,7 +46,7 @@ class OpenLocalEditorController extends OCSController { * * @param string $path Path of the file * - * @return DataResponse<Http::STATUS_OK, array{userId: ?string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{userId: ?string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Local editor returned */ @@ -91,7 +91,7 @@ class OpenLocalEditorController extends OCSController { * @param string $path Path of the file * @param string $token Token of the local editor * - * @return DataResponse<Http::STATUS_OK, array{userId: string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{userId: string, pathHash: string, expirationTime: int, token: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Local editor validated successfully * 404: Local editor not found diff --git a/apps/files/lib/Controller/TemplateController.php b/apps/files/lib/Controller/TemplateController.php index 551c9c54c4b..3321fb5f119 100644 --- a/apps/files/lib/Controller/TemplateController.php +++ b/apps/files/lib/Controller/TemplateController.php @@ -16,13 +16,16 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCSController; use OCP\Files\GenericFileException; use OCP\Files\Template\ITemplateManager; +use OCP\Files\Template\Template; use OCP\Files\Template\TemplateFileCreator; use OCP\IRequest; /** * @psalm-import-type FilesTemplateFile from ResponseDefinitions * @psalm-import-type FilesTemplateFileCreator from ResponseDefinitions + * @psalm-import-type FilesTemplateFileCreatorWithTemplates from ResponseDefinitions * @psalm-import-type FilesTemplateField from ResponseDefinitions + * @psalm-import-type FilesTemplate from ResponseDefinitions */ class TemplateController extends OCSController { public function __construct( @@ -36,13 +39,17 @@ class TemplateController extends OCSController { /** * List the available templates * - * @return DataResponse<Http::STATUS_OK, array<FilesTemplateFileCreator>, array{}> + * @return DataResponse<Http::STATUS_OK, list<FilesTemplateFileCreatorWithTemplates>, array{}> * * 200: Available templates returned */ #[NoAdminRequired] public function list(): DataResponse { - return new DataResponse($this->templateManager->listTemplates()); + /* Convert embedded Template instances to arrays to match return type */ + return new DataResponse(array_map(static function (array $templateFileCreator) { + $templateFileCreator['templates'] = array_map(static fn (Template $template) => $template->jsonSerialize(), $templateFileCreator['templates']); + return $templateFileCreator; + }, $this->templateManager->listTemplates())); } /** @@ -51,7 +58,7 @@ class TemplateController extends OCSController { * @param string $filePath Path of the file * @param string $templatePath Name of the template * @param string $templateType Type of the template - * @param FilesTemplateField[] $templateFields Fields of the template + * @param list<FilesTemplateField> $templateFields Fields of the template * * @return DataResponse<Http::STATUS_OK, FilesTemplateFile, array{}> * @throws OCSForbiddenException Creating template is not allowed @@ -82,7 +89,7 @@ class TemplateController extends OCSController { * @param string $templatePath Path of the template directory * @param bool $copySystemTemplates Whether to copy the system templates to the template directory * - * @return DataResponse<Http::STATUS_OK, array{template_path: string, templates: FilesTemplateFileCreator[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{template_path: string, templates: list<FilesTemplateFileCreator>}, array{}> * @throws OCSForbiddenException Initializing the template directory is not allowed * * 200: Template directory initialized successfully @@ -94,7 +101,7 @@ class TemplateController extends OCSController { $templatePath = $this->templateManager->initializeTemplateDirectory($templatePath, null, $copySystemTemplates); return new DataResponse([ 'template_path' => $templatePath, - 'templates' => array_map(fn (TemplateFileCreator $creator) => $creator->jsonSerialize(), $this->templateManager->listCreators()), + 'templates' => array_values(array_map(fn (TemplateFileCreator $creator) => $creator->jsonSerialize(), $this->templateManager->listCreators())), ]); } catch (\Exception $e) { throw new OCSForbiddenException($e->getMessage()); diff --git a/apps/files/lib/Controller/TransferOwnershipController.php b/apps/files/lib/Controller/TransferOwnershipController.php index 1420e57e987..51a25400efb 100644 --- a/apps/files/lib/Controller/TransferOwnershipController.php +++ b/apps/files/lib/Controller/TransferOwnershipController.php @@ -47,7 +47,7 @@ class TransferOwnershipController extends OCSController { * @param string $recipient Username of the recipient * @param string $path Path of the file * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN, list<empty>, array{}> * * 200: Ownership transferred successfully * 400: Transferring ownership is not possible @@ -101,7 +101,7 @@ class TransferOwnershipController extends OCSController { * * @param int $id ID of the ownership transfer * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Ownership transfer accepted successfully * 403: Accepting ownership transfer is not allowed @@ -136,7 +136,7 @@ class TransferOwnershipController extends OCSController { * * @param int $id ID of the ownership transfer * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Ownership transfer rejected successfully * 403: Rejecting ownership transfer is not allowed diff --git a/apps/files/lib/Helper.php b/apps/files/lib/Helper.php index ce33bbb80a6..b66dc9a2056 100644 --- a/apps/files/lib/Helper.php +++ b/apps/files/lib/Helper.php @@ -192,37 +192,34 @@ class Helper { /** * Populate the result set with file tags * - * @param array $fileList - * @param string $fileIdentifier identifier attribute name for values in $fileList - * @param ITagManager $tagManager - * @return array file list populated with tags + * @psalm-template T of array{tags?: list<string>, file_source: int, ...array<string, mixed>} + * @param list<T> $fileList + * @return list<T> file list populated with tags */ - public static function populateTags(array $fileList, $fileIdentifier, ITagManager $tagManager) { - $ids = []; - foreach ($fileList as $fileData) { - $ids[] = $fileData[$fileIdentifier]; - } + public static function populateTags(array $fileList, ITagManager $tagManager) { $tagger = $tagManager->load('files'); - $tags = $tagger->getTagsForObjects($ids); + $tags = $tagger->getTagsForObjects(array_map(static fn (array $fileData) => $fileData['file_source'], $fileList)); if (!is_array($tags)) { throw new \UnexpectedValueException('$tags must be an array'); } // Set empty tag array - foreach ($fileList as $key => $fileData) { - $fileList[$key]['tags'] = []; + foreach ($fileList as &$fileData) { + $fileData['tags'] = []; } + unset($fileData); if (!empty($tags)) { foreach ($tags as $fileId => $fileTags) { - foreach ($fileList as $key => $fileData) { - if ($fileId !== $fileData[$fileIdentifier]) { + foreach ($fileList as &$fileData) { + if ($fileId !== $fileData['file_source']) { continue; } - $fileList[$key]['tags'] = $fileTags; + $fileData['tags'] = $fileTags; } + unset($fileData); } } diff --git a/apps/files/lib/ResponseDefinitions.php b/apps/files/lib/ResponseDefinitions.php index a05cbb75b21..c5d094e7bd8 100644 --- a/apps/files/lib/ResponseDefinitions.php +++ b/apps/files/lib/ResponseDefinitions.php @@ -22,21 +22,45 @@ namespace OCA\Files; * hasPreview: bool, * } * + * @psalm-type FilesTemplateField = array{ + * index: string, + * type: string, + * alias: ?string, + * tag: ?string, + * id: ?int, + * content?: string, + * checked?: bool, + * } + * + * @psalm-type FilesTemplate = array{ + * templateType: string, + * templateId: string, + * basename: string, + * etag: string, + * fileid: int, + * filename: string, + * lastmod: int, + * mime: string, + * size: int|float, + * type: string, + * hasPreview: bool, + * previewUrl: ?string, + * fields: list<FilesTemplateField>, + * } + * * @psalm-type FilesTemplateFileCreator = array{ * app: string, * label: string, * extension: string, * iconClass: ?string, * iconSvgInline: ?string, - * mimetypes: string[], + * mimetypes: list<string>, * ratio: ?float, * actionLabel: string, * } * - * @psalm-type FilesTemplateField = array{ - * index: string, - * content: string, - * type: string, + * @psalm-type FilesTemplateFileCreatorWithTemplates = FilesTemplateFileCreator&array{ + * templates: list<FilesTemplate>, * } * * @psalm-type FilesFolderTree = list<array{ diff --git a/apps/files/openapi.json b/apps/files/openapi.json index ded6ebd95e2..2c33097438f 100644 --- a/apps/files/openapi.json +++ b/apps/files/openapi.json @@ -170,22 +170,114 @@ } } }, + "Template": { + "type": "object", + "required": [ + "templateType", + "templateId", + "basename", + "etag", + "fileid", + "filename", + "lastmod", + "mime", + "size", + "type", + "hasPreview", + "previewUrl", + "fields" + ], + "properties": { + "templateType": { + "type": "string" + }, + "templateId": { + "type": "string" + }, + "basename": { + "type": "string" + }, + "etag": { + "type": "string" + }, + "fileid": { + "type": "integer", + "format": "int64" + }, + "filename": { + "type": "string" + }, + "lastmod": { + "type": "integer", + "format": "int64" + }, + "mime": { + "type": "string" + }, + "size": { + "anyOf": [ + { + "type": "integer", + "format": "int64" + }, + { + "type": "number", + "format": "double" + } + ] + }, + "type": { + "type": "string" + }, + "hasPreview": { + "type": "boolean" + }, + "previewUrl": { + "type": "string", + "nullable": true + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateField" + } + } + } + }, "TemplateField": { "type": "object", "required": [ "index", - "content", - "type" + "type", + "alias", + "tag", + "id" ], "properties": { "index": { "type": "string" }, - "content": { + "type": { "type": "string" }, - "type": { + "alias": { + "type": "string", + "nullable": true + }, + "tag": { + "type": "string", + "nullable": true + }, + "id": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "content": { "type": "string" + }, + "checked": { + "type": "boolean" } } }, @@ -281,6 +373,27 @@ "type": "string" } } + }, + "TemplateFileCreatorWithTemplates": { + "allOf": [ + { + "$ref": "#/components/schemas/TemplateFileCreator" + }, + { + "type": "object", + "required": [ + "templates" + ], + "properties": { + "templates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Template" + } + } + } + } + ] } } }, @@ -1075,7 +1188,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/TemplateFileCreator" + "$ref": "#/components/schemas/TemplateFileCreatorWithTemplates" } } } diff --git a/apps/files/tests/HelperTest.php b/apps/files/tests/HelperTest.php index 27b1de1322f..0cf2812f816 100644 --- a/apps/files/tests/HelperTest.php +++ b/apps/files/tests/HelperTest.php @@ -104,9 +104,9 @@ class HelperTest extends \Test\TestCase { ->willReturn($tagger); $data = [ - ['id' => 10], - ['id' => 22, 'foo' => 'bar'], - ['id' => 42, 'x' => 'y'], + ['file_source' => 10], + ['file_source' => 22, 'foo' => 'bar'], + ['file_source' => 42, 'x' => 'y'], ]; $tags = [ @@ -118,12 +118,12 @@ class HelperTest extends \Test\TestCase { ->with([10, 22, 42]) ->willReturn($tags); - $result = Helper::populateTags($data, 'id', $tagManager); + $result = Helper::populateTags($data, $tagManager); $this->assertSame([ - ['id' => 10, 'tags' => ['tag3']], - ['id' => 22, 'foo' => 'bar', 'tags' => []], - ['id' => 42, 'x' => 'y', 'tags' => ['tag1', 'tag2']], + ['file_source' => 10, 'tags' => ['tag3']], + ['file_source' => 22, 'foo' => 'bar', 'tags' => []], + ['file_source' => 42, 'x' => 'y', 'tags' => ['tag1', 'tag2']], ], $result); } } diff --git a/apps/files_external/lib/Controller/ApiController.php b/apps/files_external/lib/Controller/ApiController.php index 5a7eddf1540..49547357e6b 100644 --- a/apps/files_external/lib/Controller/ApiController.php +++ b/apps/files_external/lib/Controller/ApiController.php @@ -74,7 +74,7 @@ class ApiController extends OCSController { /** * Get the mount points visible for this user * - * @return DataResponse<Http::STATUS_OK, Files_ExternalMount[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_ExternalMount>, array{}> * * 200: User mounts returned */ diff --git a/apps/files_external/lib/Lib/StorageConfig.php b/apps/files_external/lib/Lib/StorageConfig.php index 12523937071..a9a03528b8f 100644 --- a/apps/files_external/lib/Lib/StorageConfig.php +++ b/apps/files_external/lib/Lib/StorageConfig.php @@ -82,14 +82,14 @@ class StorageConfig implements \JsonSerializable { /** * List of users who have access to this storage * - * @var string[] + * @var list<string> */ private $applicableUsers = []; /** * List of groups that have access to this storage * - * @var string[] + * @var list<string> */ private $applicableGroups = []; @@ -256,7 +256,7 @@ class StorageConfig implements \JsonSerializable { /** * Returns the users for which to mount this storage * - * @return string[] applicable users + * @return list<string> applicable users */ public function getApplicableUsers() { return $this->applicableUsers; @@ -265,7 +265,7 @@ class StorageConfig implements \JsonSerializable { /** * Sets the users for which to mount this storage * - * @param string[]|null $applicableUsers applicable users + * @param list<string>|null $applicableUsers applicable users */ public function setApplicableUsers($applicableUsers) { if (is_null($applicableUsers)) { @@ -277,7 +277,7 @@ class StorageConfig implements \JsonSerializable { /** * Returns the groups for which to mount this storage * - * @return string[] applicable groups + * @return list<string> applicable groups */ public function getApplicableGroups() { return $this->applicableGroups; @@ -286,7 +286,7 @@ class StorageConfig implements \JsonSerializable { /** * Sets the groups for which to mount this storage * - * @param string[]|null $applicableGroups applicable groups + * @param list<string>|null $applicableGroups applicable groups */ public function setApplicableGroups($applicableGroups) { if (is_null($applicableGroups)) { diff --git a/apps/files_external/lib/ResponseDefinitions.php b/apps/files_external/lib/ResponseDefinitions.php index e84b985b448..26a0965f1fc 100644 --- a/apps/files_external/lib/ResponseDefinitions.php +++ b/apps/files_external/lib/ResponseDefinitions.php @@ -11,8 +11,8 @@ namespace OCA\Files_External; /** * @psalm-type Files_ExternalStorageConfig = array{ - * applicableGroups?: string[], - * applicableUsers?: string[], + * applicableGroups?: list<string>, + * applicableUsers?: list<string>, * authMechanism: string, * backend: string, * backendOptions: array<string, mixed>, diff --git a/apps/files_reminders/lib/Controller/ApiController.php b/apps/files_reminders/lib/Controller/ApiController.php index a7d02b936c9..dbc340610b2 100644 --- a/apps/files_reminders/lib/Controller/ApiController.php +++ b/apps/files_reminders/lib/Controller/ApiController.php @@ -39,7 +39,7 @@ class ApiController extends OCSController { * Get a reminder * * @param int $fileId ID of the file - * @return DataResponse<Http::STATUS_OK, array{dueDate: ?string}, array{}>|DataResponse<Http::STATUS_UNAUTHORIZED, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{dueDate: ?string}, array{}>|DataResponse<Http::STATUS_UNAUTHORIZED, list<empty>, array{}> * * 200: Reminder returned * 401: Account not found @@ -71,7 +71,7 @@ class ApiController extends OCSController { * @param int $fileId ID of the file * @param string $dueDate ISO 8601 formatted date time string * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_CREATED|Http::STATUS_BAD_REQUEST|Http::STATUS_UNAUTHORIZED|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_CREATED|Http::STATUS_BAD_REQUEST|Http::STATUS_UNAUTHORIZED|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Reminder updated * 201: Reminder created successfully @@ -109,7 +109,7 @@ class ApiController extends OCSController { * * @param int $fileId ID of the file * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_UNAUTHORIZED|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_UNAUTHORIZED|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Reminder deleted successfully * 401: Account not found diff --git a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php index 9f80d285d4d..8d93afa4e04 100644 --- a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php +++ b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php @@ -135,7 +135,7 @@ class DeletedShareAPIController extends OCSController { /** * Get a list of all deleted shares * - * @return DataResponse<Http::STATUS_OK, Files_SharingDeletedShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingDeletedShare>, array{}> * * 200: Deleted shares returned */ @@ -148,9 +148,9 @@ class DeletedShareAPIController extends OCSController { $shares = array_merge($groupShares, $roomShares, $deckShares, $sciencemeshShares); - $shares = array_map(function (IShare $share) { + $shares = array_values(array_map(function (IShare $share) { return $this->formatShare($share); - }, $shares); + }, $shares)); return new DataResponse($shares); } @@ -159,7 +159,7 @@ class DeletedShareAPIController extends OCSController { * Undelete a deleted share * * @param string $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * @throws OCSNotFoundException Share not found * diff --git a/apps/files_sharing/lib/Controller/PublicPreviewController.php b/apps/files_sharing/lib/Controller/PublicPreviewController.php index da71aca904c..8e8ee3768cb 100644 --- a/apps/files_sharing/lib/Controller/PublicPreviewController.php +++ b/apps/files_sharing/lib/Controller/PublicPreviewController.php @@ -62,7 +62,7 @@ class PublicPreviewController extends PublicShareController { * @param int $x Width of the preview * @param int $y Height of the preview * @param bool $a Whether to not crop the preview - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Preview returned * 400: Getting preview is not possible @@ -134,7 +134,7 @@ class PublicPreviewController extends PublicShareController { * Get a direct link preview for a shared file * * @param string $token Token of the share - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Preview returned * 400: Getting preview is not possible diff --git a/apps/files_sharing/lib/Controller/RemoteController.php b/apps/files_sharing/lib/Controller/RemoteController.php index cdac35e0d9c..e23ae51f219 100644 --- a/apps/files_sharing/lib/Controller/RemoteController.php +++ b/apps/files_sharing/lib/Controller/RemoteController.php @@ -41,7 +41,7 @@ class RemoteController extends OCSController { /** * Get list of pending remote shares * - * @return DataResponse<Http::STATUS_OK, Files_SharingRemoteShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingRemoteShare>, array{}> * * 200: Pending remote shares returned */ @@ -54,7 +54,7 @@ class RemoteController extends OCSController { * Accept a remote share * * @param int $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSNotFoundException Share not found * * 200: Share accepted successfully @@ -75,7 +75,7 @@ class RemoteController extends OCSController { * Decline a remote share * * @param int $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSNotFoundException Share not found * * 200: Share declined successfully @@ -116,14 +116,14 @@ class RemoteController extends OCSController { /** * Get a list of accepted remote shares * - * @return DataResponse<Http::STATUS_OK, Files_SharingRemoteShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingRemoteShare>, array{}> * * 200: Accepted remote shares returned */ #[NoAdminRequired] public function getShares() { $shares = $this->externalManager->getAcceptedShares(); - $shares = array_map('self::extendShareInfo', $shares); + $shares = array_map(self::extendShareInfo(...), $shares); return new DataResponse($shares); } @@ -153,7 +153,7 @@ class RemoteController extends OCSController { * Unshare a remote share * * @param int $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSNotFoundException Share not found * @throws OCSForbiddenException Unsharing is not possible * diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index 077eb4b35a3..71f73f777a5 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -351,10 +351,10 @@ class ShareAPIController extends OCSController { /** - * @param array $shares - * @param array|null $updatedDisplayName + * @param list<Files_SharingShare> $shares + * @param array<string, string>|null $updatedDisplayName * - * @return array + * @return list<Files_SharingShare> */ private function fixMissingDisplayName(array $shares, ?array $updatedDisplayName = null): array { $userIds = $updated = []; @@ -450,7 +450,7 @@ class ShareAPIController extends OCSController { * * @param string $id ID of the share * @param bool $include_tags Include tags in the share - * @return DataResponse<Http::STATUS_OK, Files_SharingShare, array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingShare>, array{}> * @throws OCSNotFoundException Share not found * * 200: Share returned @@ -468,7 +468,7 @@ class ShareAPIController extends OCSController { $share = $this->formatShare($share); if ($include_tags) { - $share = Helper::populateTags([$share], 'file_source', \OC::$server->getTagManager()); + $share = Helper::populateTags([$share], \OC::$server->getTagManager()); } else { $share = [$share]; } @@ -486,7 +486,7 @@ class ShareAPIController extends OCSController { * Delete a share * * @param string $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSNotFoundException Share not found * @throws OCSForbiddenException Missing permissions to delete the share * @@ -828,7 +828,7 @@ class ShareAPIController extends OCSController { * @param null|Node $node * @param boolean $includeTags * - * @return Files_SharingShare[] + * @return list<Files_SharingShare> */ private function getSharedWithMe($node, bool $includeTags): array { $userShares = $this->shareManager->getSharedWith($this->userId, IShare::TYPE_USER, $node, -1, 0); @@ -856,7 +856,7 @@ class ShareAPIController extends OCSController { } if ($includeTags) { - $formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager()); + $formatted = Helper::populateTags($formatted, \OC::$server->getTagManager()); } return $formatted; @@ -865,7 +865,7 @@ class ShareAPIController extends OCSController { /** * @param Node $folder * - * @return Files_SharingShare[] + * @return list<Files_SharingShare> * @throws OCSBadRequestException * @throws NotFoundException */ @@ -925,7 +925,7 @@ class ShareAPIController extends OCSController { * @param string $path Get shares for a specific path * @param string $include_tags Include tags in the share * - * @return DataResponse<Http::STATUS_OK, Files_SharingShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingShare>, array{}> * @throws OCSNotFoundException The folder was not found or is inaccessible * * 200: Shares returned @@ -974,7 +974,7 @@ class ShareAPIController extends OCSController { * @param bool $subFiles * @param bool $includeTags * - * @return Files_SharingShare[] + * @return list<Files_SharingShare> * @throws NotFoundException * @throws OCSBadRequestException */ @@ -1045,7 +1045,7 @@ class ShareAPIController extends OCSController { if ($includeTags) { $formatted = - Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager()); + Helper::populateTags($formatted, \OC::$server->getTagManager()); } return $formatted; @@ -1057,7 +1057,7 @@ class ShareAPIController extends OCSController { * * @param string $path Path all shares will be relative to * - * @return DataResponse<Http::STATUS_OK, Files_SharingShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingShare>, array{}> * @throws InvalidPathException * @throws NotFoundException * @throws OCSNotFoundException The given path is invalid @@ -1371,7 +1371,7 @@ class ShareAPIController extends OCSController { /** * Get all shares that are still pending * - * @return DataResponse<Http::STATUS_OK, Files_SharingShare[], array{}> + * @return DataResponse<Http::STATUS_OK, list<Files_SharingShare>, array{}> * * 200: Pending shares returned */ @@ -1394,7 +1394,7 @@ class ShareAPIController extends OCSController { } } - $result = array_filter(array_map(function (IShare $share) { + $result = array_values(array_filter(array_map(function (IShare $share) { $userFolder = $this->rootFolder->getUserFolder($share->getSharedBy()); $node = $userFolder->getFirstNodeById($share->getNodeId()); if (!$node) { @@ -1415,7 +1415,7 @@ class ShareAPIController extends OCSController { } }, $pendingShares), function ($entry) { return $entry !== null; - }); + })); return new DataResponse($result); } @@ -1424,7 +1424,7 @@ class ShareAPIController extends OCSController { * Accept a share * * @param string $id ID of the share - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSNotFoundException Share not found * @throws OCSException * @throws OCSBadRequestException Share could not be accepted @@ -2095,7 +2095,7 @@ class ShareAPIController extends OCSController { * @throws OCSForbiddenException You are not allowed to send mail notifications * @throws OCSBadRequestException Invalid request or wrong password * @throws OCSException Error while sending mail notification - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * * 200: The email notification was sent successfully */ diff --git a/apps/files_sharing/lib/Controller/ShareInfoController.php b/apps/files_sharing/lib/Controller/ShareInfoController.php index 05816a986f7..7805973f3c5 100644 --- a/apps/files_sharing/lib/Controller/ShareInfoController.php +++ b/apps/files_sharing/lib/Controller/ShareInfoController.php @@ -48,7 +48,7 @@ class ShareInfoController extends ApiController { * @param string|null $password Password of the share * @param string|null $dir Subdirectory to get info about * @param int $depth Maximum depth to get info about - * @return JSONResponse<Http::STATUS_OK, Files_SharingShareInfo, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return JSONResponse<Http::STATUS_OK, Files_SharingShareInfo, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Share info returned * 403: Getting share info is not allowed diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index 606a3d11de6..3a04dda72a1 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -94,7 +94,7 @@ class ShareesAPIController extends OCSController { * @param string|null $itemType Limit to specific item types * @param int $page Page offset for searching * @param int $perPage Limit amount of search results per page - * @param int|int[]|null $shareType Limit to specific share types + * @param int|list<int>|null $shareType Limit to specific share types * @param bool $lookup If a global lookup should be performed too * @return DataResponse<Http::STATUS_OK, Files_SharingShareesSearchResult, array{Link?: string}> * @throws OCSBadRequestException Invalid search parameters @@ -300,7 +300,7 @@ class ShareesAPIController extends OCSController { * Find recommended sharees * * @param string $itemType Limit to specific item types - * @param int|int[]|null $shareType Limit to specific share types + * @param int|list<int>|null $shareType Limit to specific share types * @return DataResponse<Http::STATUS_OK, Files_SharingShareesRecommendedResult, array{}> * * 200: Recommended sharees returned diff --git a/apps/files_sharing/lib/External/Manager.php b/apps/files_sharing/lib/External/Manager.php index e0d7f96cb90..e10b6c1c91f 100644 --- a/apps/files_sharing/lib/External/Manager.php +++ b/apps/files_sharing/lib/External/Manager.php @@ -11,6 +11,7 @@ use Doctrine\DBAL\Driver\Exception; use OC\Files\Filesystem; use OCA\FederatedFileSharing\Events\FederatedShareAddedEvent; use OCA\Files_Sharing\Helper; +use OCA\Files_Sharing\ResponseDefinitions; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\EventDispatcher\IEventDispatcher; use OCP\Federation\ICloudFederationFactory; @@ -30,6 +31,9 @@ use OCP\Share; use OCP\Share\IShare; use Psr\Log\LoggerInterface; +/** + * @psalm-import-type Files_SharingRemoteShare from ResponseDefinitions + */ class Manager { public const STORAGE = '\OCA\Files_Sharing\External\Storage'; @@ -686,7 +690,7 @@ class Manager { /** * return a list of shares which are not yet accepted by the user * - * @return array list of open server-to-server shares + * @return list<Files_SharingRemoteShare> list of open server-to-server shares */ public function getOpenShares() { return $this->getShares(false); @@ -695,7 +699,7 @@ class Manager { /** * return a list of shares which are accepted by the user * - * @return array list of accepted server-to-server shares + * @return list<Files_SharingRemoteShare> list of accepted server-to-server shares */ public function getAcceptedShares() { return $this->getShares(true); @@ -707,7 +711,7 @@ class Manager { * @param bool|null $accepted True for accepted only, * false for not accepted, * null for all shares of the user - * @return array list of open server-to-server shares + * @return list<Files_SharingRemoteShare> list of open server-to-server shares */ private function getShares($accepted) { $user = $this->userManager->get($this->uid); diff --git a/apps/files_sharing/lib/ResponseDefinitions.php b/apps/files_sharing/lib/ResponseDefinitions.php index d412b93a135..0edf67fe042 100644 --- a/apps/files_sharing/lib/ResponseDefinitions.php +++ b/apps/files_sharing/lib/ResponseDefinitions.php @@ -178,38 +178,38 @@ namespace OCA\Files_Sharing; * * @psalm-type Files_SharingShareesSearchResult = array{ * exact: array{ - * circles: Files_SharingShareeCircle[], - * emails: Files_SharingShareeEmail[], - * groups: Files_SharingSharee[], - * remote_groups: Files_SharingShareeRemoteGroup[], - * remotes: Files_SharingShareeRemote[], - * rooms: Files_SharingSharee[], - * users: Files_SharingShareeUser[], + * circles: list<Files_SharingShareeCircle>, + * emails: list<Files_SharingShareeEmail>, + * groups: list<Files_SharingSharee>, + * remote_groups: list<Files_SharingShareeRemoteGroup>, + * remotes: list<Files_SharingShareeRemote>, + * rooms: list<Files_SharingSharee>, + * users: list<Files_SharingShareeUser>, * }, - * circles: Files_SharingShareeCircle[], - * emails: Files_SharingShareeEmail[], - * groups: Files_SharingSharee[], - * lookup: Files_SharingShareeLookup[], - * remote_groups: Files_SharingShareeRemoteGroup[], - * remotes: Files_SharingShareeRemote[], - * rooms: Files_SharingSharee[], - * users: Files_SharingShareeUser[], + * circles: list<Files_SharingShareeCircle>, + * emails: list<Files_SharingShareeEmail>, + * groups: list<Files_SharingSharee>, + * lookup: list<Files_SharingShareeLookup>, + * remote_groups: list<Files_SharingShareeRemoteGroup>, + * remotes: list<Files_SharingShareeRemote>, + * rooms: list<Files_SharingSharee>, + * users: list<Files_SharingShareeUser>, * lookupEnabled: bool, * } * * @psalm-type Files_SharingShareesRecommendedResult = array{ * exact: array{ - * emails: Files_SharingShareeEmail[], - * groups: Files_SharingSharee[], - * remote_groups: Files_SharingShareeRemoteGroup[], - * remotes: Files_SharingShareeRemote[], - * users: Files_SharingShareeUser[], + * emails: list<Files_SharingShareeEmail>, + * groups: list<Files_SharingSharee>, + * remote_groups: list<Files_SharingShareeRemoteGroup>, + * remotes: list<Files_SharingShareeRemote>, + * users: list<Files_SharingShareeUser>, * }, - * emails: Files_SharingShareeEmail[], - * groups: Files_SharingSharee[], - * remote_groups: Files_SharingShareeRemoteGroup[], - * remotes: Files_SharingShareeRemote[], - * users: Files_SharingShareeUser[], + * emails: list<Files_SharingShareeEmail>, + * groups: list<Files_SharingSharee>, + * remote_groups: list<Files_SharingShareeRemoteGroup>, + * remotes: list<Files_SharingShareeRemote>, + * users: list<Files_SharingShareeUser>, * } * * @psalm-type Files_SharingShareInfo = array{ @@ -222,7 +222,7 @@ namespace OCA\Files_Sharing; * size: int|float, * type: string, * etag: string, - * children?: array<string, mixed>[], + * children?: list<array<string, mixed>>, * } */ class ResponseDefinitions { diff --git a/apps/files_sharing/openapi.json b/apps/files_sharing/openapi.json index 848b6293cc8..76063ad3f93 100644 --- a/apps/files_sharing/openapi.json +++ b/apps/files_sharing/openapi.json @@ -2170,7 +2170,10 @@ "$ref": "#/components/schemas/OCSMeta" }, "data": { - "$ref": "#/components/schemas/Share" + "type": "array", + "items": { + "$ref": "#/components/schemas/Share" + } } } } diff --git a/apps/files_trashbin/lib/Controller/PreviewController.php b/apps/files_trashbin/lib/Controller/PreviewController.php index d376ce80fda..a71bc4f01c7 100644 --- a/apps/files_trashbin/lib/Controller/PreviewController.php +++ b/apps/files_trashbin/lib/Controller/PreviewController.php @@ -46,7 +46,7 @@ class PreviewController extends Controller { * @param int $y Height of the preview * @param bool $a Whether to not crop the preview * - * @return Http\FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return Http\FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Preview returned * 400: Getting preview is not possible diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php index e1d87b4b9f5..fe984376d29 100644 --- a/apps/files_versions/lib/Controller/PreviewController.php +++ b/apps/files_versions/lib/Controller/PreviewController.php @@ -38,7 +38,7 @@ class PreviewController extends Controller { * @param int $x Width of the preview * @param int $y Height of the preview * @param string $version Version of the file to get the preview for - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Preview returned * 400: Getting preview is not possible diff --git a/apps/provisioning_api/lib/Controller/AUserData.php b/apps/provisioning_api/lib/Controller/AUserData.php index 603c6306227..61459e40b8b 100644 --- a/apps/provisioning_api/lib/Controller/AUserData.php +++ b/apps/provisioning_api/lib/Controller/AUserData.php @@ -222,7 +222,7 @@ abstract class AUserData extends OCSController { * Get the groups a user is a subadmin of * * @param string $userId - * @return string[] + * @return list<string> * @throws OCSException */ protected function getUserSubAdminGroupsData(string $userId): array { diff --git a/apps/provisioning_api/lib/Controller/AppConfigController.php b/apps/provisioning_api/lib/Controller/AppConfigController.php index bb161f6cb8c..d8af1f38d95 100644 --- a/apps/provisioning_api/lib/Controller/AppConfigController.php +++ b/apps/provisioning_api/lib/Controller/AppConfigController.php @@ -44,7 +44,7 @@ class AppConfigController extends OCSController { /** * Get a list of apps * - * @return DataResponse<Http::STATUS_OK, array{data: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{data: list<string>}, array{}> * * 200: Apps returned */ @@ -58,7 +58,7 @@ class AppConfigController extends OCSController { * Get the config keys of an app * * @param string $app ID of the app - * @return DataResponse<Http::STATUS_OK, array{data: string[]}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> + * @return DataResponse<Http::STATUS_OK, array{data: list<string>}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> * * 200: Keys returned * 403: App is not allowed @@ -105,7 +105,7 @@ class AppConfigController extends OCSController { * @param string $app ID of the app * @param string $key Key to update * @param string $value New value for the key - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> * * 200: Value updated successfully * 403: App or key is not allowed @@ -154,7 +154,7 @@ class AppConfigController extends OCSController { * * @param string $app ID of the app * @param string $key Key to delete - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array{data: array{message: string}}, array{}> * * 200: Key deleted successfully * 403: App or key is not allowed diff --git a/apps/provisioning_api/lib/Controller/AppsController.php b/apps/provisioning_api/lib/Controller/AppsController.php index ae08a9cade0..04dfd8f29b1 100644 --- a/apps/provisioning_api/lib/Controller/AppsController.php +++ b/apps/provisioning_api/lib/Controller/AppsController.php @@ -31,18 +31,18 @@ class AppsController extends OCSController { * Get a list of installed apps * * @param ?string $filter Filter for enabled or disabled apps - * @return DataResponse<Http::STATUS_OK, array{apps: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{apps: list<string>}, array{}> * @throws OCSException * * 200: Installed apps returned */ public function getApps(?string $filter = null): DataResponse { $apps = (new OC_App())->listAllApps(); + /** @var list<string> $list */ $list = []; foreach ($apps as $app) { $list[] = $app['id']; } - /** @var string[] $list */ if ($filter) { switch ($filter) { case 'enabled': @@ -50,7 +50,7 @@ class AppsController extends OCSController { break; case 'disabled': $enabled = OC_App::getEnabledApps(); - return new DataResponse(['apps' => array_diff($list, $enabled)]); + return new DataResponse(['apps' => array_values(array_diff($list, $enabled))]); break; default: // Invalid filter variable @@ -83,7 +83,7 @@ class AppsController extends OCSController { * Enable an app * * @param string $app ID of the app - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: App enabled successfully @@ -102,7 +102,7 @@ class AppsController extends OCSController { * Disable an app * * @param string $app ID of the app - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * * 200: App disabled successfully */ diff --git a/apps/provisioning_api/lib/Controller/GroupsController.php b/apps/provisioning_api/lib/Controller/GroupsController.php index 0b16c319f1d..87544cc8992 100644 --- a/apps/provisioning_api/lib/Controller/GroupsController.php +++ b/apps/provisioning_api/lib/Controller/GroupsController.php @@ -68,17 +68,17 @@ class GroupsController extends AUserData { * @param string $search Text to search for * @param ?int $limit Limit the amount of groups returned * @param int $offset Offset for searching for groups - * @return DataResponse<Http::STATUS_OK, array{groups: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{groups: list<string>}, array{}> * * 200: Groups returned */ #[NoAdminRequired] public function getGroups(string $search = '', ?int $limit = null, int $offset = 0): DataResponse { $groups = $this->groupManager->search($search, $limit, $offset); - $groups = array_map(function ($group) { + $groups = array_values(array_map(function ($group) { /** @var IGroup $group */ return $group->getGID(); - }, $groups); + }, $groups)); return new DataResponse(['groups' => $groups]); } @@ -89,7 +89,7 @@ class GroupsController extends AUserData { * @param string $search Text to search for * @param ?int $limit Limit the amount of groups returned * @param int $offset Offset for searching for groups - * @return DataResponse<Http::STATUS_OK, array{groups: Provisioning_APIGroupDetails[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{groups: list<Provisioning_APIGroupDetails>}, array{}> * * 200: Groups details returned */ @@ -97,7 +97,7 @@ class GroupsController extends AUserData { #[AuthorizedAdminSetting(settings: Sharing::class)] public function getGroupsDetails(string $search = '', ?int $limit = null, int $offset = 0): DataResponse { $groups = $this->groupManager->search($search, $limit, $offset); - $groups = array_map(function ($group) { + $groups = array_values(array_map(function ($group) { /** @var IGroup $group */ return [ 'id' => $group->getGID(), @@ -107,7 +107,7 @@ class GroupsController extends AUserData { 'canAdd' => $group->canAddUser(), 'canRemove' => $group->canRemoveUser(), ]; - }, $groups); + }, $groups)); return new DataResponse(['groups' => $groups]); } @@ -116,7 +116,7 @@ class GroupsController extends AUserData { * Get a list of users in the specified group * * @param string $groupId ID of the group - * @return DataResponse<Http::STATUS_OK, array{users: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{users: list<string>}, array{}> * @throws OCSException * * @deprecated 14 Use getGroupUsers @@ -132,7 +132,7 @@ class GroupsController extends AUserData { * Get a list of users in the specified group * * @param string $groupId ID of the group - * @return DataResponse<Http::STATUS_OK, array{users: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{users: list<string>}, array{}> * @throws OCSException * @throws OCSNotFoundException Group not found * @throws OCSForbiddenException Missing permissions to get users in the group @@ -163,7 +163,7 @@ class GroupsController extends AUserData { /** @var IUser $user */ return $user->getUID(); }, $users); - /** @var string[] $users */ + /** @var list<string> $users */ $users = array_values($users); return new DataResponse(['users' => $users]); } @@ -233,7 +233,7 @@ class GroupsController extends AUserData { * * @param string $groupid ID of the group * @param string $displayname Display name of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Group created successfully @@ -266,7 +266,7 @@ class GroupsController extends AUserData { * @param string $groupId ID of the group * @param string $key Key to update, only 'displayname' * @param string $value New value for the key - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Group updated successfully @@ -295,7 +295,7 @@ class GroupsController extends AUserData { * Delete a group * * @param string $groupId ID of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Group deleted successfully @@ -320,7 +320,7 @@ class GroupsController extends AUserData { * Get the list of user IDs that are a subadmin of the group * * @param string $groupId ID of the group - * @return DataResponse<Http::STATUS_OK, string[], array{}> + * @return DataResponse<Http::STATUS_OK, list<string>, array{}> * @throws OCSException * * 200: Sub admins returned @@ -336,7 +336,7 @@ class GroupsController extends AUserData { /** @var IUser[] $subadmins */ $subadmins = $this->groupManager->getSubAdmin()->getGroupsSubAdmins($targetGroup); // New class returns IUser[] so convert back - /** @var string[] $uids */ + /** @var list<string> $uids */ $uids = []; foreach ($subadmins as $user) { $uids[] = $user->getUID(); diff --git a/apps/provisioning_api/lib/Controller/PreferencesController.php b/apps/provisioning_api/lib/Controller/PreferencesController.php index 672aec7756c..8ae64e65b81 100644 --- a/apps/provisioning_api/lib/Controller/PreferencesController.php +++ b/apps/provisioning_api/lib/Controller/PreferencesController.php @@ -40,7 +40,7 @@ class PreferencesController extends OCSController { * @param string $appId ID of the app * @param array<string, string> $configs Key-value pairs of the preferences * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, list<empty>, array{}> * * 200: Preferences updated successfully * 400: Preference invalid @@ -85,7 +85,7 @@ class PreferencesController extends OCSController { * @param string $appId ID of the app * @param string $configKey Key of the preference * @param string $configValue New value - * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, list<empty>, array{}> * * 200: Preference updated successfully * 400: Preference invalid @@ -124,9 +124,9 @@ class PreferencesController extends OCSController { * Delete multiple preferences for an app * * @param string $appId ID of the app - * @param string[] $configKeys Keys to delete + * @param list<string> $configKeys Keys to delete * - * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, list<empty>, array{}> * * 200: Preferences deleted successfully * 400: Preference invalid @@ -168,7 +168,7 @@ class PreferencesController extends OCSController { * * @param string $appId ID of the app * @param string $configKey Key to delete - * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST, list<empty>, array{}> * * 200: Preference deleted successfully * 400: Preference invalid diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index b0cd9bfb448..9363b4ca935 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -97,7 +97,7 @@ class UsersController extends AUserData { * @param string $search Text to search for * @param int|null $limit Limit the amount of groups returned * @param int $offset Offset for searching for groups - * @return DataResponse<Http::STATUS_OK, array{users: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{users: list<string>}, array{}> * * 200: Users returned */ @@ -125,7 +125,7 @@ class UsersController extends AUserData { } } - /** @var string[] $users */ + /** @var list<string> $users */ $users = array_keys($users); return new DataResponse([ @@ -341,8 +341,8 @@ class UsersController extends AUserData { * Search users by their phone numbers * * @param string $location Location of the phone number (for country code) - * @param array<string, string[]> $search Phone numbers to search for - * @return DataResponse<Http::STATUS_OK, array<string, string>, array{}>|DataResponse<Http::STATUS_BAD_REQUEST, array<empty>, array{}> + * @param array<string, list<string>> $search Phone numbers to search for + * @return DataResponse<Http::STATUS_OK, array<string, string>, array{}>|DataResponse<Http::STATUS_BAD_REQUEST, list<empty>, array{}> * * 200: Users returned * 400: Invalid location @@ -433,8 +433,8 @@ class UsersController extends AUserData { * @param string $password Password of the user * @param string $displayName Display name of the user * @param string $email Email of the user - * @param string[] $groups Groups of the user - * @param string[] $subadmin Groups where the user is subadmin + * @param list<string> $groups Groups of the user + * @param list<string> $subadmin Groups where the user is subadmin * @param string $quota Quota of the user * @param string $language Language of the user * @param ?string $manager Manager of the user @@ -689,7 +689,7 @@ class UsersController extends AUserData { * * Get a list of fields that are editable for the current user * - * @return DataResponse<Http::STATUS_OK, string[], array{}> + * @return DataResponse<Http::STATUS_OK, list<string>, array{}> * @throws OCSException * * 200: Editable fields returned @@ -710,7 +710,7 @@ class UsersController extends AUserData { * Get a list of fields that are editable for a user * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, string[], array{}> + * @return DataResponse<Http::STATUS_OK, list<string>, array{}> * @throws OCSException * * 200: Editable fields for user returned @@ -779,7 +779,7 @@ class UsersController extends AUserData { * @param string $collectionName Collection to update * @param string $key Key that will be updated * @param string $value New value for the key - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User values edited successfully @@ -884,7 +884,7 @@ class UsersController extends AUserData { * @param string $userId ID of the user * @param string $key Key that will be updated * @param string $value New value for the key - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User value edited successfully @@ -1222,7 +1222,7 @@ class UsersController extends AUserData { * * @param string $userId ID of the user * - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * * @throws OCSException * @@ -1261,7 +1261,7 @@ class UsersController extends AUserData { * Delete a user * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User deleted successfully @@ -1301,7 +1301,7 @@ class UsersController extends AUserData { * Disable a user * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User disabled successfully @@ -1316,7 +1316,7 @@ class UsersController extends AUserData { * Enable a user * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User enabled successfully @@ -1330,7 +1330,7 @@ class UsersController extends AUserData { /** * @param string $userId * @param bool $value - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException */ private function setEnabled(string $userId, bool $value): DataResponse { @@ -1360,7 +1360,7 @@ class UsersController extends AUserData { * Get a list of groups the user belongs to * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, array{groups: string[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{groups: list<string>}, array{}> * @throws OCSException * * 200: Users groups returned @@ -1387,16 +1387,10 @@ class UsersController extends AUserData { // Looking up someone else if ($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) { // Return the group that the method caller is subadmin of for the user in question - /** @var IGroup[] $getSubAdminsGroups */ - $getSubAdminsGroups = $subAdminManager->getSubAdminsGroups($loggedInUser); - foreach ($getSubAdminsGroups as $key => $group) { - $getSubAdminsGroups[$key] = $group->getGID(); - } - /** @var string[] $groups */ - $groups = array_intersect( - $getSubAdminsGroups, + $groups = array_values(array_intersect( + array_map(static fn (IGroup $group) => $group->getGID(), $subAdminManager->getSubAdminsGroups($loggedInUser)), $this->groupManager->getUserGroupIds($targetUser) - ); + )); return new DataResponse(['groups' => $groups]); } else { // Not permitted @@ -1410,7 +1404,7 @@ class UsersController extends AUserData { * * @param string $userId ID of the user * @param string $groupid ID of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User added to group successfully @@ -1450,7 +1444,7 @@ class UsersController extends AUserData { * * @param string $userId ID of the user * @param string $groupid ID of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User removed from group successfully @@ -1517,7 +1511,7 @@ class UsersController extends AUserData { * * @param string $userId ID of the user * @param string $groupid ID of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User added as group subadmin successfully @@ -1557,7 +1551,7 @@ class UsersController extends AUserData { * * @param string $userId ID of the user * @param string $groupid ID of the group - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: User removed as group subadmin successfully @@ -1591,7 +1585,7 @@ class UsersController extends AUserData { * Get the groups a user is a subadmin of * * @param string $userId ID if the user - * @return DataResponse<Http::STATUS_OK, string[], array{}> + * @return DataResponse<Http::STATUS_OK, list<string>, array{}> * @throws OCSException * * 200: User subadmin groups returned @@ -1606,7 +1600,7 @@ class UsersController extends AUserData { * Resend the welcome message * * @param string $userId ID if the user - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * * 200: Resent welcome message successfully diff --git a/apps/provisioning_api/lib/ResponseDefinitions.php b/apps/provisioning_api/lib/ResponseDefinitions.php index fec68021209..afa725c110a 100644 --- a/apps/provisioning_api/lib/ResponseDefinitions.php +++ b/apps/provisioning_api/lib/ResponseDefinitions.php @@ -21,8 +21,8 @@ namespace OCA\Provisioning_API; * @psalm-type Provisioning_APIUserDetailsScope = 'v2-private'|'v2-local'|'v2-federated'|'v2-published'|'private'|'contacts'|'public' * * @psalm-type Provisioning_APIUserDetails = array{ - * additional_mail: string[], - * additional_mailScope?: Provisioning_APIUserDetailsScope[], + * additional_mail: list<string>, + * additional_mailScope?: list<Provisioning_APIUserDetailsScope>, * address: string, * addressScope?: Provisioning_APIUserDetailsScope, * avatarScope?: Provisioning_APIUserDetailsScope, @@ -41,7 +41,7 @@ namespace OCA\Provisioning_API; * enabled?: bool, * fediverse: string, * fediverseScope?: Provisioning_APIUserDetailsScope, - * groups: string[], + * groups: list<string>, * headline: string, * headlineScope?: Provisioning_APIUserDetailsScope, * id: string, @@ -62,7 +62,7 @@ namespace OCA\Provisioning_API; * role: string, * roleScope?: Provisioning_APIUserDetailsScope, * storageLocation?: string, - * subadmin: string[], + * subadmin: list<string>, * twitter: string, * twitterScope?: Provisioning_APIUserDetailsScope, * website: string, diff --git a/apps/sharebymail/lib/Capabilities.php b/apps/sharebymail/lib/Capabilities.php index 5b489b7d790..67a0ec7a9de 100644 --- a/apps/sharebymail/lib/Capabilities.php +++ b/apps/sharebymail/lib/Capabilities.php @@ -24,7 +24,7 @@ class Capabilities implements ICapability { /** * @return array{ - * files_sharing: array{ + * files_sharing?: array{ * sharebymail: array{ * enabled: bool, * send_password_by_mail: bool, @@ -41,7 +41,7 @@ class Capabilities implements ICapability { * }, * } * } - * }|array<empty> + * } */ public function getCapabilities(): array { if (!$this->appManager->isEnabledForUser('files_sharing')) { diff --git a/apps/sharebymail/openapi.json b/apps/sharebymail/openapi.json index 7bc231c0770..a64013b1924 100644 --- a/apps/sharebymail/openapi.json +++ b/apps/sharebymail/openapi.json @@ -21,87 +21,76 @@ }, "schemas": { "Capabilities": { - "oneOf": [ - { + "type": "object", + "properties": { + "files_sharing": { "type": "object", "required": [ - "files_sharing" + "sharebymail" ], "properties": { - "files_sharing": { + "sharebymail": { "type": "object", "required": [ - "sharebymail" + "enabled", + "send_password_by_mail", + "upload_files_drop", + "password", + "expire_date" ], "properties": { - "sharebymail": { + "enabled": { + "type": "boolean" + }, + "send_password_by_mail": { + "type": "boolean" + }, + "upload_files_drop": { + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean" + } + } + }, + "password": { "type": "object", "required": [ "enabled", - "send_password_by_mail", - "upload_files_drop", - "password", - "expire_date" + "enforced" ], "properties": { "enabled": { "type": "boolean" }, - "send_password_by_mail": { + "enforced": { + "type": "boolean" + } + } + }, + "expire_date": { + "type": "object", + "required": [ + "enabled", + "enforced" + ], + "properties": { + "enabled": { "type": "boolean" }, - "upload_files_drop": { - "type": "object", - "required": [ - "enabled" - ], - "properties": { - "enabled": { - "type": "boolean" - } - } - }, - "password": { - "type": "object", - "required": [ - "enabled", - "enforced" - ], - "properties": { - "enabled": { - "type": "boolean" - }, - "enforced": { - "type": "boolean" - } - } - }, - "expire_date": { - "type": "object", - "required": [ - "enabled", - "enforced" - ], - "properties": { - "enabled": { - "type": "boolean" - }, - "enforced": { - "type": "boolean" - } - } + "enforced": { + "type": "boolean" } } } } } } - }, - { - "type": "array", - "maxItems": 0 } - ] + } } } }, diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 1b02595fa39..d748a6278b4 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -417,7 +417,7 @@ class ThemingController extends Controller { * * @param string $app ID of the app * @psalm-suppress LessSpecificReturnStatement The content of the Manifest doesn't need to be described in the return type - * @return JSONResponse<Http::STATUS_OK, array{name: string, short_name: string, start_url: string, theme_color: string, background_color: string, description: string, icons: array{src: non-empty-string, type: string, sizes: string}[], display: string}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array{}, array{}> + * @return JSONResponse<Http::STATUS_OK, array{name: string, short_name: string, start_url: string, theme_color: string, background_color: string, description: string, icons: list<array{src: non-empty-string, type: string, sizes: string}>, display: string}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array{}, array{}> * * 200: Manifest returned * 404: App not found diff --git a/apps/theming/lib/Controller/UserThemeController.php b/apps/theming/lib/Controller/UserThemeController.php index 9bcf32daa9c..1ead97f5d37 100644 --- a/apps/theming/lib/Controller/UserThemeController.php +++ b/apps/theming/lib/Controller/UserThemeController.php @@ -58,7 +58,7 @@ class UserThemeController extends OCSController { * Enable theme * * @param string $themeId the theme ID - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSBadRequestException Enabling theme is not possible * @throws PreConditionNotMetException * @@ -77,7 +77,7 @@ class UserThemeController extends OCSController { * Disable theme * * @param string $themeId the theme ID - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSBadRequestException Disabling theme is not possible * @throws PreConditionNotMetException * diff --git a/apps/updatenotification/lib/Controller/APIController.php b/apps/updatenotification/lib/Controller/APIController.php index 59643e935d1..6b4f559f650 100644 --- a/apps/updatenotification/lib/Controller/APIController.php +++ b/apps/updatenotification/lib/Controller/APIController.php @@ -62,7 +62,7 @@ class APIController extends OCSController { * * @param string $newVersion Server version to check updates for * - * @return DataResponse<Http::STATUS_OK, array{missing: UpdateNotificationApp[], available: UpdateNotificationApp[]}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, array{appstore_disabled: bool, already_on_latest?: bool}, array{}> + * @return DataResponse<Http::STATUS_OK, array{missing: list<UpdateNotificationApp>, available: list<UpdateNotificationApp>}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, array{appstore_disabled: bool, already_on_latest?: bool}, array{}> * * 200: Apps returned * 404: New versions not found diff --git a/apps/user_ldap/lib/Controller/ConfigAPIController.php b/apps/user_ldap/lib/Controller/ConfigAPIController.php index 8ce2486c153..0a019312e35 100644 --- a/apps/user_ldap/lib/Controller/ConfigAPIController.php +++ b/apps/user_ldap/lib/Controller/ConfigAPIController.php @@ -74,7 +74,7 @@ class ConfigAPIController extends OCSController { * Delete a LDAP configuration * * @param string $configID ID of the config - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * @throws OCSNotFoundException Config not found * @@ -102,7 +102,7 @@ class ConfigAPIController extends OCSController { * * @param string $configID ID of the config * @param array<string, mixed> $configData New config - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException * @throws OCSBadRequestException Modifying config is not possible * @throws OCSNotFoundException Config not found diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php index 2c99fadfcc9..0cd263edec8 100644 --- a/apps/user_ldap/lib/Group_LDAP.php +++ b/apps/user_ldap/lib/Group_LDAP.php @@ -638,6 +638,10 @@ class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDis return false; } + /** + * @param string $uid + * @return list<string> + */ protected function getCachedGroupsForUserId(string $uid): array { $groupStr = $this->config->getUserValue($uid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), '[]'); return json_decode($groupStr, true) ?? []; @@ -650,7 +654,7 @@ class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDis * This function includes groups based on dynamic group membership. * * @param string $uid Name of the user - * @return string[] Group names + * @return list<string> Group names * @throws Exception * @throws ServerNotAvailableException */ diff --git a/apps/user_ldap/lib/Group_Proxy.php b/apps/user_ldap/lib/Group_Proxy.php index 11b7498fbed..8ed3a5dd87d 100644 --- a/apps/user_ldap/lib/Group_Proxy.php +++ b/apps/user_ldap/lib/Group_Proxy.php @@ -133,7 +133,7 @@ class Group_Proxy extends Proxy implements GroupInterface, IGroupLDAP, IGetDispl * Get all groups a user belongs to * * @param string $uid Name of the user - * @return string[] with group names + * @return list<string> with group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. diff --git a/apps/user_status/lib/Controller/HeartbeatController.php b/apps/user_status/lib/Controller/HeartbeatController.php index d1da035329e..30f4af6572a 100644 --- a/apps/user_status/lib/Controller/HeartbeatController.php +++ b/apps/user_status/lib/Controller/HeartbeatController.php @@ -44,7 +44,7 @@ class HeartbeatController extends OCSController { * * @param string $status Only online, away * - * @return DataResponse<Http::STATUS_OK, UserStatusPrivate, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_INTERNAL_SERVER_ERROR|Http::STATUS_NO_CONTENT, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, UserStatusPrivate, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_INTERNAL_SERVER_ERROR|Http::STATUS_NO_CONTENT, list<empty>, array{}> * * 200: Status successfully updated * 204: User has no status to keep alive diff --git a/apps/user_status/lib/Controller/PredefinedStatusController.php b/apps/user_status/lib/Controller/PredefinedStatusController.php index 14300360880..70262d1108a 100644 --- a/apps/user_status/lib/Controller/PredefinedStatusController.php +++ b/apps/user_status/lib/Controller/PredefinedStatusController.php @@ -42,7 +42,7 @@ class PredefinedStatusController extends OCSController { /** * Get all predefined messages * - * @return DataResponse<Http::STATUS_OK, UserStatusPredefined[], array{}> + * @return DataResponse<Http::STATUS_OK, list<UserStatusPredefined>, array{}> * * 200: Predefined statuses returned */ @@ -50,8 +50,8 @@ class PredefinedStatusController extends OCSController { #[ApiRoute(verb: 'GET', url: '/api/v1/predefined_statuses/')] public function findAll():DataResponse { // Filtering out the invisible one, that should only be set by API - return new DataResponse(array_filter($this->predefinedStatusService->getDefaultStatuses(), function (array $status) { + return new DataResponse(array_values(array_filter($this->predefinedStatusService->getDefaultStatuses(), function (array $status) { return !array_key_exists('visible', $status) || $status['visible'] === true; - })); + }))); } } diff --git a/apps/user_status/lib/Controller/StatusesController.php b/apps/user_status/lib/Controller/StatusesController.php index f9c64c075bf..e27a0fabbed 100644 --- a/apps/user_status/lib/Controller/StatusesController.php +++ b/apps/user_status/lib/Controller/StatusesController.php @@ -47,7 +47,7 @@ class StatusesController extends OCSController { * * @param int|null $limit Maximum number of statuses to find * @param int|null $offset Offset for finding statuses - * @return DataResponse<Http::STATUS_OK, UserStatusPublic[], array{}> + * @return DataResponse<Http::STATUS_OK, list<UserStatusPublic>, array{}> * * 200: Statuses returned */ @@ -56,9 +56,9 @@ class StatusesController extends OCSController { public function findAll(?int $limit = null, ?int $offset = null): DataResponse { $allStatuses = $this->service->findAll($limit, $offset); - return new DataResponse(array_map(function ($userStatus) { + return new DataResponse(array_values(array_map(function ($userStatus) { return $this->formatStatus($userStatus); - }, $allStatuses)); + }, $allStatuses))); } /** diff --git a/apps/user_status/lib/Controller/UserStatusController.php b/apps/user_status/lib/Controller/UserStatusController.php index bc2efaf86e6..a65f9a75c9f 100644 --- a/apps/user_status/lib/Controller/UserStatusController.php +++ b/apps/user_status/lib/Controller/UserStatusController.php @@ -155,7 +155,7 @@ class UserStatusController extends OCSController { /** * Clear the message of the current user * - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * * 200: Message cleared successfully */ @@ -171,7 +171,7 @@ class UserStatusController extends OCSController { * * @param string $messageId ID of the message to delete * - * @return DataResponse<Http::STATUS_OK, UserStatusPrivate|array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, UserStatusPrivate|list<empty>, array{}> * * 200: Status reverted */ diff --git a/apps/user_status/lib/Dashboard/UserStatusWidget.php b/apps/user_status/lib/Dashboard/UserStatusWidget.php index 9dce2b1412a..c1091d4bb21 100644 --- a/apps/user_status/lib/Dashboard/UserStatusWidget.php +++ b/apps/user_status/lib/Dashboard/UserStatusWidget.php @@ -143,7 +143,7 @@ class UserStatusWidget implements IAPIWidget, IAPIWidgetV2, IIconWidget, IOption public function getItems(string $userId, ?string $since = null, int $limit = 7): array { $widgetItemsData = $this->getWidgetData($userId, $since, $limit); - return array_map(function (array $widgetData) { + return array_values(array_map(function (array $widgetData) { $formattedDate = $this->dateTimeFormatter->formatTimeSpan($widgetData['timestamp']); return new WidgetItem( $widgetData['displayName'], @@ -157,7 +157,7 @@ class UserStatusWidget implements IAPIWidget, IAPIWidgetV2, IIconWidget, IOption ), (string)$widgetData['timestamp'] ); - }, $widgetItemsData); + }, $widgetItemsData)); } /** diff --git a/apps/weather_status/lib/Controller/WeatherStatusController.php b/apps/weather_status/lib/Controller/WeatherStatusController.php index 953e09f2f2d..c56ea3b97b3 100644 --- a/apps/weather_status/lib/Controller/WeatherStatusController.php +++ b/apps/weather_status/lib/Controller/WeatherStatusController.php @@ -93,7 +93,7 @@ class WeatherStatusController extends OCSController { /** * Get forecast for current location * - * @return DataResponse<Http::STATUS_OK, WeatherStatusForecast[]|array{error: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, WeatherStatusSuccess, array{}> + * @return DataResponse<Http::STATUS_OK, list<WeatherStatusForecast>|array{error: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, WeatherStatusSuccess, array{}> * * 200: Forecast returned * 404: Forecast not found @@ -111,7 +111,7 @@ class WeatherStatusController extends OCSController { /** * Get favorites list * - * @return DataResponse<Http::STATUS_OK, string[], array{}> + * @return DataResponse<Http::STATUS_OK, list<string>, array{}> * * 200: Favorites returned */ @@ -123,7 +123,7 @@ class WeatherStatusController extends OCSController { /** * Set favorites list * - * @param string[] $favorites Favorite addresses + * @param list<string> $favorites Favorite addresses * @return DataResponse<Http::STATUS_OK, WeatherStatusSuccess, array{}> * * 200: Favorites updated diff --git a/apps/weather_status/lib/Service/WeatherStatusService.php b/apps/weather_status/lib/Service/WeatherStatusService.php index 9d9972e84ef..04500cf66a5 100644 --- a/apps/weather_status/lib/Service/WeatherStatusService.php +++ b/apps/weather_status/lib/Service/WeatherStatusService.php @@ -70,7 +70,7 @@ class WeatherStatusService { /** * Get favorites list - * @return string[] + * @return list<string> */ public function getFavorites(): array { $favoritesJson = $this->config->getUserValue($this->userId, Application::APP_ID, 'favorites', ''); @@ -79,7 +79,7 @@ class WeatherStatusService { /** * Set favorites list - * @param string[] $favorites + * @param list<string> $favorites * @return WeatherStatusSuccess success state */ public function setFavorites(array $favorites): array { @@ -287,7 +287,7 @@ class WeatherStatusService { /** * Get forecast for current location * - * @return WeatherStatusForecast[]|array{error: string}|WeatherStatusSuccess which contains success state and filtered forecast data + * @return list<WeatherStatusForecast>|array{error: string}|WeatherStatusSuccess which contains success state and filtered forecast data */ public function getForecast(): array { $lat = $this->config->getUserValue($this->userId, Application::APP_ID, 'lat', ''); @@ -310,7 +310,7 @@ class WeatherStatusService { * @param float $lon Longitude of requested forecast, in decimal degree format * @param float $altitude Altitude of requested forecast, in meter * @param int $nbValues Number of forecast values (hours) - * @return WeatherStatusForecast[]|array{error: string} Filtered forecast data + * @return list<WeatherStatusForecast>|array{error: string} Filtered forecast data */ private function forecastRequest(float $lat, float $lon, float $altitude, int $nbValues = 10): array { $params = [ diff --git a/apps/webhook_listeners/lib/Controller/WebhooksController.php b/apps/webhook_listeners/lib/Controller/WebhooksController.php index 1d5e37cb373..ef8e2e1e244 100644 --- a/apps/webhook_listeners/lib/Controller/WebhooksController.php +++ b/apps/webhook_listeners/lib/Controller/WebhooksController.php @@ -50,7 +50,7 @@ class WebhooksController extends OCSController { * List registered webhooks * * @param string|null $uri The callback URI to filter by - * @return DataResponse<Http::STATUS_OK, WebhookListenersWebhookInfo[], array{}> + * @return DataResponse<Http::STATUS_OK, list<WebhookListenersWebhookInfo>, array{}> * @throws OCSException Other internal error * * 200: Webhook registrations returned @@ -66,12 +66,10 @@ class WebhooksController extends OCSController { $webhookListeners = $this->mapper->getAll(); } - return new DataResponse( - array_map( - fn (WebhookListener $listener): array => $listener->jsonSerialize(), - $webhookListeners - ) - ); + return new DataResponse(array_values(array_map( + fn (WebhookListener $listener): array => $listener->jsonSerialize(), + $webhookListeners + ))); } catch (\Exception $e) { $this->logger->error('Error when listing webhooks', ['exception' => $e]); throw new OCSException('An internal error occurred', Http::STATUS_INTERNAL_SERVER_ERROR, $e); diff --git a/core/Controller/AppPasswordController.php b/core/Controller/AppPasswordController.php index b43f0077507..16ec124e23a 100644 --- a/core/Controller/AppPasswordController.php +++ b/core/Controller/AppPasswordController.php @@ -102,7 +102,7 @@ class AppPasswordController extends \OCP\AppFramework\OCSController { /** * Delete app password * - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSForbiddenException Deleting app password is not allowed * * 200: App password deleted successfully @@ -162,7 +162,7 @@ class AppPasswordController extends \OCP\AppFramework\OCSController { * * @param string $password The password of the user * - * @return DataResponse<Http::STATUS_OK, array{lastLogin: int}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{lastLogin: int}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, list<empty>, array{}> * * 200: Password confirmation succeeded * 403: Password confirmation failed diff --git a/core/Controller/AutoCompleteController.php b/core/Controller/AutoCompleteController.php index 654570e66ec..692fe1b7297 100644 --- a/core/Controller/AutoCompleteController.php +++ b/core/Controller/AutoCompleteController.php @@ -43,10 +43,10 @@ class AutoCompleteController extends OCSController { * @param string|null $itemType Type of the items to search for * @param string|null $itemId ID of the items to search for * @param string|null $sorter can be piped, top prio first, e.g.: "commenters|share-recipients" - * @param int[] $shareTypes Types of shares to search for + * @param list<int> $shareTypes Types of shares to search for * @param int $limit Maximum number of results to return * - * @return DataResponse<Http::STATUS_OK, CoreAutocompleteResult[], array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreAutocompleteResult>, array{}> * * 200: Autocomplete results returned */ @@ -100,7 +100,7 @@ class AutoCompleteController extends OCSController { } /** - * @return CoreAutocompleteResult[] + * @return list<CoreAutocompleteResult> */ protected function prepareResultArray(array $results): array { $output = []; diff --git a/core/Controller/AvatarController.php b/core/Controller/AvatarController.php index 5003d5824e3..4d5e810ddb9 100644 --- a/core/Controller/AvatarController.php +++ b/core/Controller/AvatarController.php @@ -57,7 +57,7 @@ class AvatarController extends Controller { * @param string $userId ID of the user * @param 64|512 $size Size of the avatar * @param bool $guestFallback Fallback to guest avatar if not found - * @return FileDisplayResponse<Http::STATUS_OK|Http::STATUS_CREATED, array{Content-Type: string, X-NC-IsCustomAvatar: int}>|JSONResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}>|Response<Http::STATUS_INTERNAL_SERVER_ERROR, array{}> + * @return FileDisplayResponse<Http::STATUS_OK|Http::STATUS_CREATED, array{Content-Type: string, X-NC-IsCustomAvatar: int}>|JSONResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}>|Response<Http::STATUS_INTERNAL_SERVER_ERROR, array{}> * * 200: Avatar returned * 201: Avatar returned @@ -108,7 +108,7 @@ class AvatarController extends Controller { * @param string $userId ID of the user * @param 64|512 $size Size of the avatar * @param bool $guestFallback Fallback to guest avatar if not found - * @return FileDisplayResponse<Http::STATUS_OK|Http::STATUS_CREATED, array{Content-Type: string, X-NC-IsCustomAvatar: int}>|JSONResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}>|Response<Http::STATUS_INTERNAL_SERVER_ERROR, array{}> + * @return FileDisplayResponse<Http::STATUS_OK|Http::STATUS_CREATED, array{Content-Type: string, X-NC-IsCustomAvatar: int}>|JSONResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}>|Response<Http::STATUS_INTERNAL_SERVER_ERROR, array{}> * * 200: Avatar returned * 201: Avatar returned diff --git a/core/Controller/CSRFTokenController.php b/core/Controller/CSRFTokenController.php index c3d1a7f842b..8ea475941c8 100644 --- a/core/Controller/CSRFTokenController.php +++ b/core/Controller/CSRFTokenController.php @@ -29,7 +29,7 @@ class CSRFTokenController extends Controller { /** * Returns a new CSRF token. * - * @return JSONResponse<Http::STATUS_OK, array{token: string}, array{}>|JSONResponse<Http::STATUS_FORBIDDEN, array<empty>, array{}> + * @return JSONResponse<Http::STATUS_OK, array{token: string}, array{}>|JSONResponse<Http::STATUS_FORBIDDEN, list<empty>, array{}> * * 200: CSRF token returned * 403: Strict cookie check failed diff --git a/core/Controller/ClientFlowLoginV2Controller.php b/core/Controller/ClientFlowLoginV2Controller.php index 43eac012be1..b973a57924e 100644 --- a/core/Controller/ClientFlowLoginV2Controller.php +++ b/core/Controller/ClientFlowLoginV2Controller.php @@ -61,7 +61,7 @@ class ClientFlowLoginV2Controller extends Controller { * Poll the login flow credentials * * @param string $token Token of the flow - * @return JSONResponse<Http::STATUS_OK, CoreLoginFlowV2Credentials, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return JSONResponse<Http::STATUS_OK, CoreLoginFlowV2Credentials, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Login flow credentials returned * 404: Login flow not found or completed diff --git a/core/Controller/CollaborationResourcesController.php b/core/Controller/CollaborationResourcesController.php index 6f27789c566..e160d733176 100644 --- a/core/Controller/CollaborationResourcesController.php +++ b/core/Controller/CollaborationResourcesController.php @@ -59,7 +59,7 @@ class CollaborationResourcesController extends OCSController { * Get a collection * * @param int $collectionId ID of the collection - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Collection returned * 404: Collection not found @@ -80,7 +80,7 @@ class CollaborationResourcesController extends OCSController { * Search for collections * * @param string $filter Filter collections - * @return DataResponse<Http::STATUS_OK, CoreCollection[], array{}>|DataResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreCollection>, array{}>|DataResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Collections returned * 404: Collection not found @@ -103,7 +103,7 @@ class CollaborationResourcesController extends OCSController { * @param int $collectionId ID of the collection * @param string $resourceType Name of the resource * @param string $resourceId ID of the resource - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Collection returned * 404: Collection not found or resource inaccessible @@ -137,7 +137,7 @@ class CollaborationResourcesController extends OCSController { * @param int $collectionId ID of the collection * @param string $resourceType Name of the resource * @param string $resourceId ID of the resource - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Collection returned * 404: Collection or resource not found @@ -167,7 +167,7 @@ class CollaborationResourcesController extends OCSController { * * @param string $resourceType Type of the resource * @param string $resourceId ID of the resource - * @return DataResponse<Http::STATUS_OK, CoreCollection[], array{}>|DataResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreCollection>, array{}>|DataResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Collections returned * 404: Resource not accessible @@ -194,7 +194,7 @@ class CollaborationResourcesController extends OCSController { * @param string $baseResourceType Type of the base resource * @param string $baseResourceId ID of the base resource * @param string $name Name of the collection - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Collection returned * 400: Creating collection is not possible @@ -228,7 +228,7 @@ class CollaborationResourcesController extends OCSController { * * @param int $collectionId ID of the collection * @param string $collectionName New name - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> * * 200: Collection returned * 404: Collection not found @@ -248,7 +248,7 @@ class CollaborationResourcesController extends OCSController { } /** - * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, CoreCollection, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_INTERNAL_SERVER_ERROR, list<empty>, array{}> */ protected function respondCollection(ICollection $collection): DataResponse { try { @@ -262,7 +262,7 @@ class CollaborationResourcesController extends OCSController { } /** - * @return CoreCollection[] + * @return list<CoreCollection> */ protected function prepareCollections(array $collections): array { $result = []; @@ -295,7 +295,7 @@ class CollaborationResourcesController extends OCSController { } /** - * @return CoreResource[] + * @return list<CoreResource> */ protected function prepareResources(array $resources): array { $result = []; diff --git a/core/Controller/HoverCardController.php b/core/Controller/HoverCardController.php index 588cef2a72d..7a816e21d14 100644 --- a/core/Controller/HoverCardController.php +++ b/core/Controller/HoverCardController.php @@ -33,7 +33,7 @@ class HoverCardController extends \OCP\AppFramework\OCSController { * Get the account details for a hovercard * * @param string $userId ID of the user - * @return DataResponse<Http::STATUS_OK, array{userId: string, displayName: string, actions: CoreContactsAction[]}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{userId: string, displayName: string, actions: list<CoreContactsAction>}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Account details returned * 404: Account not found @@ -54,7 +54,7 @@ class HoverCardController extends \OCP\AppFramework\OCSController { array_unshift($actions, $data['topAction']); } - /** @var CoreContactsAction[] $actions */ + /** @var list<CoreContactsAction> $actions */ return new DataResponse([ 'userId' => $userId, 'displayName' => $contact->getFullName(), diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php index a433c3073b4..d4d6a17db79 100644 --- a/core/Controller/LoginController.php +++ b/core/Controller/LoginController.php @@ -381,7 +381,7 @@ class LoginController extends Controller { * * @param string $password The password of the user * - * @return DataResponse<Http::STATUS_OK, array{lastLogin: int}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{lastLogin: int}, array{}>|DataResponse<Http::STATUS_FORBIDDEN, list<empty>, array{}> * * 200: Password confirmation succeeded * 403: Password confirmation failed diff --git a/core/Controller/NavigationController.php b/core/Controller/NavigationController.php index 44c8ef0880b..de72e412945 100644 --- a/core/Controller/NavigationController.php +++ b/core/Controller/NavigationController.php @@ -33,7 +33,7 @@ class NavigationController extends OCSController { * Get the apps navigation * * @param bool $absolute Rewrite URLs to absolute ones - * @return DataResponse<Http::STATUS_OK, CoreNavigationEntry[], array{}>|DataResponse<Http::STATUS_NOT_MODIFIED, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreNavigationEntry>, array{}>|DataResponse<Http::STATUS_NOT_MODIFIED, list<empty>, array{}> * * 200: Apps navigation returned * 304: No apps navigation changed @@ -60,7 +60,7 @@ class NavigationController extends OCSController { * Get the settings navigation * * @param bool $absolute Rewrite URLs to absolute ones - * @return DataResponse<Http::STATUS_OK, CoreNavigationEntry[], array{}>|DataResponse<Http::STATUS_NOT_MODIFIED, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreNavigationEntry>, array{}>|DataResponse<Http::STATUS_NOT_MODIFIED, list<empty>, array{}> * * 200: Apps navigation returned * 304: No apps navigation changed diff --git a/core/Controller/OCMController.php b/core/Controller/OCMController.php index b53dc08fecf..59529b66e12 100644 --- a/core/Controller/OCMController.php +++ b/core/Controller/OCMController.php @@ -43,7 +43,7 @@ class OCMController extends Controller { * * @psalm-suppress MoreSpecificReturnType * @psalm-suppress LessSpecificReturnStatement - * @return DataResponse<Http::STATUS_OK, array{enabled: bool, apiVersion: string, endPoint: string, resourceTypes: array{name: string, shareTypes: string[], protocols: array{webdav: string}}[]}, array{X-NEXTCLOUD-OCM-PROVIDERS: true, Content-Type: 'application/json'}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> + * @return DataResponse<Http::STATUS_OK, array{enabled: bool, apiVersion: string, endPoint: string, resourceTypes: list<array{name: string, shareTypes: list<string>, protocols: array{webdav: string}}>}, array{X-NEXTCLOUD-OCM-PROVIDERS: true, Content-Type: 'application/json'}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> * * 200: OCM Provider details returned * 500: OCM not supported diff --git a/core/Controller/PreviewController.php b/core/Controller/PreviewController.php index 807df4a2ebc..2720da671be 100644 --- a/core/Controller/PreviewController.php +++ b/core/Controller/PreviewController.php @@ -47,7 +47,7 @@ class PreviewController extends Controller { * @param bool $forceIcon Force returning an icon * @param 'fill'|'cover' $mode How to crop the image * @param bool $mimeFallback Whether to fallback to the mime icon if no preview is available - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> * * 200: Preview returned * 303: Redirect to the mime icon url if mimeFallback is true @@ -90,7 +90,7 @@ class PreviewController extends Controller { * @param bool $forceIcon Force returning an icon * @param 'fill'|'cover' $mode How to crop the image * @param bool $mimeFallback Whether to fallback to the mime icon if no preview is available - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> * * 200: Preview returned * 303: Redirect to the mime icon url if mimeFallback is true @@ -124,7 +124,7 @@ class PreviewController extends Controller { } /** - * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, list<empty>, array{}>|RedirectResponse<Http::STATUS_SEE_OTHER, array{}> */ private function fetchPreview( Node $node, diff --git a/core/Controller/ProfileApiController.php b/core/Controller/ProfileApiController.php index bbfb9cc4153..c807ecb72d4 100644 --- a/core/Controller/ProfileApiController.php +++ b/core/Controller/ProfileApiController.php @@ -44,7 +44,7 @@ class ProfileApiController extends OCSController { * @param string $targetUserId ID of the user * @param string $paramId ID of the parameter * @param string $visibility New visibility - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSBadRequestException Updating visibility is not possible * @throws OCSForbiddenException Not allowed to edit other users visibility * @throws OCSNotFoundException Account not found diff --git a/core/Controller/ReferenceApiController.php b/core/Controller/ReferenceApiController.php index cba91b976e2..0d34e6244f5 100644 --- a/core/Controller/ReferenceApiController.php +++ b/core/Controller/ReferenceApiController.php @@ -141,7 +141,7 @@ class ReferenceApiController extends \OCP\AppFramework\OCSController { /** * Resolve multiple references * - * @param string[] $references References to resolve + * @param list<string> $references References to resolve * @param int $limit Maximum amount of references to resolve * @return DataResponse<Http::STATUS_OK, array{references: array<string, CoreReference|null>}, array{}> * @@ -168,7 +168,7 @@ class ReferenceApiController extends \OCP\AppFramework\OCSController { /** * Resolve multiple references from a public page * - * @param string[] $references References to resolve + * @param list<string> $references References to resolve * @param string $sharingToken Token of the public share * @param int $limit Maximum amount of references to resolve, limited to 15 * @return DataResponse<Http::STATUS_OK, array{references: array<string, CoreReference|null>}, array{}> @@ -197,7 +197,7 @@ class ReferenceApiController extends \OCP\AppFramework\OCSController { /** * Get the providers * - * @return DataResponse<Http::STATUS_OK, CoreReferenceProvider[], array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreReferenceProvider>, array{}> * * 200: Providers returned */ @@ -205,9 +205,9 @@ class ReferenceApiController extends \OCP\AppFramework\OCSController { #[ApiRoute(verb: 'GET', url: '/providers', root: '/references')] public function getProvidersInfo(): DataResponse { $providers = $this->referenceManager->getDiscoverableProviders(); - $jsonProviders = array_map(static function (IDiscoverableReferenceProvider $provider) { + $jsonProviders = array_values(array_map(static function (IDiscoverableReferenceProvider $provider) { return $provider->jsonSerialize(); - }, $providers); + }, $providers)); return new DataResponse($jsonProviders); } diff --git a/core/Controller/TaskProcessingApiController.php b/core/Controller/TaskProcessingApiController.php index 7ee5e7068af..e41c178f44d 100644 --- a/core/Controller/TaskProcessingApiController.php +++ b/core/Controller/TaskProcessingApiController.php @@ -68,30 +68,30 @@ class TaskProcessingApiController extends \OCP\AppFramework\OCSController { #[ApiRoute(verb: 'GET', url: '/tasktypes', root: '/taskprocessing')] public function taskTypes(): DataResponse { $taskTypes = array_map(function (array $tt) { - $tt['inputShape'] = array_map(function ($descriptor) { + $tt['inputShape'] = array_values(array_map(function ($descriptor) { return $descriptor->jsonSerialize(); - }, $tt['inputShape']); - $tt['outputShape'] = array_map(function ($descriptor) { + }, $tt['inputShape'])); + $tt['outputShape'] = array_values(array_map(function ($descriptor) { return $descriptor->jsonSerialize(); - }, $tt['outputShape']); - $tt['optionalInputShape'] = array_map(function ($descriptor) { + }, $tt['outputShape'])); + $tt['optionalInputShape'] = array_values(array_map(function ($descriptor) { return $descriptor->jsonSerialize(); - }, $tt['optionalInputShape']); - $tt['optionalOutputShape'] = array_map(function ($descriptor) { + }, $tt['optionalInputShape'])); + $tt['optionalOutputShape'] = array_values(array_map(function ($descriptor) { return $descriptor->jsonSerialize(); - }, $tt['optionalOutputShape']); - $tt['inputShapeEnumValues'] = array_map(function (array $enumValues) { - return array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues); - }, $tt['inputShapeEnumValues']); - $tt['optionalInputShapeEnumValues'] = array_map(function (array $enumValues) { - return array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues); - }, $tt['optionalInputShapeEnumValues']); - $tt['outputShapeEnumValues'] = array_map(function (array $enumValues) { - return array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues); - }, $tt['outputShapeEnumValues']); - $tt['optionalOutputShapeEnumValues'] = array_map(function (array $enumValues) { - return array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues); - }, $tt['optionalOutputShapeEnumValues']); + }, $tt['optionalOutputShape'])); + $tt['inputShapeEnumValues'] = array_values(array_map(function (array $enumValues) { + return array_values(array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues)); + }, $tt['inputShapeEnumValues'])); + $tt['optionalInputShapeEnumValues'] = array_values(array_map(function (array $enumValues) { + return array_values(array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues)); + }, $tt['optionalInputShapeEnumValues'])); + $tt['outputShapeEnumValues'] = array_values(array_map(function (array $enumValues) { + return array_values(array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues)); + }, $tt['outputShapeEnumValues'])); + $tt['optionalOutputShapeEnumValues'] = array_values(array_map(function (array $enumValues) { + return array_values(array_map(fn (ShapeEnumValue $enumValue) => $enumValue->jsonSerialize(), $enumValues)); + }, $tt['optionalOutputShapeEnumValues'])); return $tt; }, $this->taskProcessingManager->getAvailableTaskTypes()); return new DataResponse([ @@ -208,7 +208,7 @@ class TaskProcessingApiController extends \OCP\AppFramework\OCSController { * * @param string $appId ID of the app * @param string|null $customId An arbitrary identifier for the task - * @return DataResponse<Http::STATUS_OK, array{tasks: CoreTaskProcessingTask[]}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> + * @return DataResponse<Http::STATUS_OK, array{tasks: list<CoreTaskProcessingTask>}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> * * 200: Tasks returned */ @@ -217,7 +217,6 @@ class TaskProcessingApiController extends \OCP\AppFramework\OCSController { public function listTasksByApp(string $appId, ?string $customId = null): DataResponse { try { $tasks = $this->taskProcessingManager->getUserTasksByApp($this->userId, $appId, $customId); - /** @var CoreTaskProcessingTask[] $json */ $json = array_map(static function (Task $task) { return $task->jsonSerialize(); }, $tasks); @@ -235,7 +234,7 @@ class TaskProcessingApiController extends \OCP\AppFramework\OCSController { * * @param string|null $taskType The task type to filter by * @param string|null $customId An arbitrary identifier for the task - * @return DataResponse<Http::STATUS_OK, array{tasks: CoreTaskProcessingTask[]}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> + * @return DataResponse<Http::STATUS_OK, array{tasks: list<CoreTaskProcessingTask>}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> * * 200: Tasks returned */ @@ -244,7 +243,6 @@ class TaskProcessingApiController extends \OCP\AppFramework\OCSController { public function listTasks(?string $taskType, ?string $customId = null): DataResponse { try { $tasks = $this->taskProcessingManager->getUserTasks($this->userId, $taskType, $customId); - /** @var CoreTaskProcessingTask[] $json */ $json = array_map(static function (Task $task) { return $task->jsonSerialize(); }, $tasks); diff --git a/core/Controller/TeamsApiController.php b/core/Controller/TeamsApiController.php index a27f6deff76..36685555d4d 100644 --- a/core/Controller/TeamsApiController.php +++ b/core/Controller/TeamsApiController.php @@ -36,7 +36,7 @@ class TeamsApiController extends \OCP\AppFramework\OCSController { * Get all resources of a team * * @param string $teamId Unique id of the team - * @return DataResponse<Http::STATUS_OK, array{resources: CoreTeamResource[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{resources: list<CoreTeamResource>}, array{}> * * 200: Resources returned */ @@ -44,7 +44,7 @@ class TeamsApiController extends \OCP\AppFramework\OCSController { #[ApiRoute(verb: 'GET', url: '/{teamId}/resources', root: '/teams')] public function resolveOne(string $teamId): DataResponse { /** - * @var CoreTeamResource[] $resolvedResources + * @var list<CoreTeamResource> $resolvedResources * @psalm-suppress PossiblyNullArgument The route is limited to logged-in users */ $resolvedResources = $this->teamManager->getSharedWith($teamId, $this->userId); @@ -57,7 +57,7 @@ class TeamsApiController extends \OCP\AppFramework\OCSController { * * @param string $providerId Identifier of the provider (e.g. deck, talk, collectives) * @param string $resourceId Unique id of the resource to list teams for (e.g. deck board id) - * @return DataResponse<Http::STATUS_OK, array{teams: CoreTeam[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{teams: list<CoreTeam>}, array{}> * * 200: Teams returned */ @@ -66,13 +66,13 @@ class TeamsApiController extends \OCP\AppFramework\OCSController { public function listTeams(string $providerId, string $resourceId): DataResponse { /** @psalm-suppress PossiblyNullArgument The route is limited to logged-in users */ $teams = $this->teamManager->getTeamsForResource($providerId, $resourceId, $this->userId); - /** @var CoreTeam[] $teams */ - $teams = array_map(function (Team $team) { + /** @var list<CoreTeam> $teams */ + $teams = array_values(array_map(function (Team $team) { $response = $team->jsonSerialize(); /** @psalm-suppress PossiblyNullArgument The route is limited to logged in users */ $response['resources'] = $this->teamManager->getSharedWith($team->getId(), $this->userId); return $response; - }, $teams); + }, $teams)); return new DataResponse([ 'teams' => $teams, diff --git a/core/Controller/TextProcessingApiController.php b/core/Controller/TextProcessingApiController.php index a0acf193289..cdf39563167 100644 --- a/core/Controller/TextProcessingApiController.php +++ b/core/Controller/TextProcessingApiController.php @@ -52,7 +52,7 @@ class TextProcessingApiController extends \OCP\AppFramework\OCSController { /** * This endpoint returns all available LanguageModel task types * - * @return DataResponse<Http::STATUS_OK, array{types: array{id: string, name: string, description: string}[]}, array{}> + * @return DataResponse<Http::STATUS_OK, array{types: list<array{id: string, name: string, description: string}>}, array{}> * * 200: Task types returned */ @@ -191,7 +191,7 @@ class TextProcessingApiController extends \OCP\AppFramework\OCSController { * * @param string $appId ID of the app * @param string|null $identifier An arbitrary identifier for the task - * @return DataResponse<Http::STATUS_OK, array{tasks: CoreTextProcessingTask[]}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> + * @return DataResponse<Http::STATUS_OK, array{tasks: list<CoreTextProcessingTask>}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> * * 200: Task list returned */ @@ -200,10 +200,9 @@ class TextProcessingApiController extends \OCP\AppFramework\OCSController { public function listTasksByApp(string $appId, ?string $identifier = null): DataResponse { try { $tasks = $this->textProcessingManager->getUserTasksByApp($this->userId, $appId, $identifier); - /** @var CoreTextProcessingTask[] $json */ - $json = array_map(static function (Task $task) { + $json = array_values(array_map(static function (Task $task) { return $task->jsonSerialize(); - }, $tasks); + }, $tasks)); return new DataResponse([ 'tasks' => $json, diff --git a/core/Controller/TextToImageApiController.php b/core/Controller/TextToImageApiController.php index 241c752ea01..3ffc868e80f 100644 --- a/core/Controller/TextToImageApiController.php +++ b/core/Controller/TextToImageApiController.php @@ -212,7 +212,7 @@ class TextToImageApiController extends \OCP\AppFramework\OCSController { * * @param string $appId ID of the app * @param string|null $identifier An arbitrary identifier for the task - * @return DataResponse<Http::STATUS_OK, array{tasks: CoreTextToImageTask[]}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> + * @return DataResponse<Http::STATUS_OK, array{tasks: list<CoreTextToImageTask>}, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}> * * 200: Task list returned */ @@ -222,10 +222,9 @@ class TextToImageApiController extends \OCP\AppFramework\OCSController { public function listTasksByApp(string $appId, ?string $identifier = null): DataResponse { try { $tasks = $this->textToImageManager->getUserTasksByApp($this->userId, $appId, $identifier); - /** @var CoreTextToImageTask[] $json */ - $json = array_map(static function (Task $task) { + $json = array_values(array_map(static function (Task $task) { return $task->jsonSerialize(); - }, $tasks); + }, $tasks)); return new DataResponse([ 'tasks' => $json, diff --git a/core/Controller/TranslationApiController.php b/core/Controller/TranslationApiController.php index 81ed190277b..294251baa47 100644 --- a/core/Controller/TranslationApiController.php +++ b/core/Controller/TranslationApiController.php @@ -36,7 +36,7 @@ class TranslationApiController extends \OCP\AppFramework\OCSController { /** * Get the list of supported languages * - * @return DataResponse<Http::STATUS_OK, array{languages: array{from: string, fromLabel: string, to: string, toLabel: string}[], languageDetection: bool}, array{}> + * @return DataResponse<Http::STATUS_OK, array{languages: list<array{from: string, fromLabel: string, to: string, toLabel: string}>, languageDetection: bool}, array{}> * * 200: Supported languages returned */ @@ -44,7 +44,7 @@ class TranslationApiController extends \OCP\AppFramework\OCSController { #[ApiRoute(verb: 'GET', url: '/languages', root: '/translation')] public function languages(): DataResponse { return new DataResponse([ - 'languages' => array_map(fn ($lang) => $lang->jsonSerialize(), $this->translationManager->getLanguages()), + 'languages' => array_values(array_map(fn ($lang) => $lang->jsonSerialize(), $this->translationManager->getLanguages())), 'languageDetection' => $this->translationManager->canDetectLanguage(), ]); } diff --git a/core/Controller/UnifiedSearchController.php b/core/Controller/UnifiedSearchController.php index 20d6fb5e59c..c770c6240df 100644 --- a/core/Controller/UnifiedSearchController.php +++ b/core/Controller/UnifiedSearchController.php @@ -45,7 +45,7 @@ class UnifiedSearchController extends OCSController { * Get the providers for unified search * * @param string $from the url the user is currently at - * @return DataResponse<Http::STATUS_OK, CoreUnifiedSearchProvider[], array{}> + * @return DataResponse<Http::STATUS_OK, list<CoreUnifiedSearchProvider>, array{}> * * 200: Providers returned */ diff --git a/core/Controller/WhatsNewController.php b/core/Controller/WhatsNewController.php index 98c5e77964b..86192d8f466 100644 --- a/core/Controller/WhatsNewController.php +++ b/core/Controller/WhatsNewController.php @@ -41,7 +41,7 @@ class WhatsNewController extends OCSController { /** * Get the changes * - * @return DataResponse<Http::STATUS_OK, array{changelogURL: string, product: string, version: string, whatsNew?: array{regular: string[], admin: string[]}}, array{}>|DataResponse<Http::STATUS_NO_CONTENT, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, array{changelogURL: string, product: string, version: string, whatsNew?: array{regular: list<string>, admin: list<string>}}, array{}>|DataResponse<Http::STATUS_NO_CONTENT, list<empty>, array{}> * * 200: Changes returned * 204: No changes @@ -87,7 +87,7 @@ class WhatsNewController extends OCSController { * * @param string $version Version to dismiss the changes for * - * @return DataResponse<Http::STATUS_OK, array<empty>, array{}> + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws \OCP\PreConditionNotMetException * @throws DoesNotExistException * diff --git a/core/Controller/WipeController.php b/core/Controller/WipeController.php index fe9ee79f3b4..d364e6399d9 100644 --- a/core/Controller/WipeController.php +++ b/core/Controller/WipeController.php @@ -33,7 +33,7 @@ class WipeController extends Controller { * * @param string $token App password * - * @return JSONResponse<Http::STATUS_OK, array{wipe: bool}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return JSONResponse<Http::STATUS_OK, array{wipe: bool}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Device should be wiped * 404: Device should not be wiped @@ -62,7 +62,7 @@ class WipeController extends Controller { * * @param string $token App password * - * @return JSONResponse<Http::STATUS_OK|Http::STATUS_NOT_FOUND, array<empty>, array{}> + * @return JSONResponse<Http::STATUS_OK|Http::STATUS_NOT_FOUND, list<empty>, array{}> * * 200: Wipe finished successfully * 404: Device should not be wiped diff --git a/core/ResponseDefinitions.php b/core/ResponseDefinitions.php index 4edde2dde36..7dfd3b7da9b 100644 --- a/core/ResponseDefinitions.php +++ b/core/ResponseDefinitions.php @@ -63,7 +63,7 @@ namespace OC\Core; * @psalm-type CoreCollection = array{ * id: int, * name: string, - * resources: CoreResource[], + * resources: list<CoreResource>, * } * * @psalm-type CoreReference = array{ @@ -78,7 +78,7 @@ namespace OC\Core; * title: string, * icon_url: string, * order: int, - * search_providers_ids: ?string[] + * search_providers_ids: ?list<string>, * } * * @psalm-type CoreUnifiedSearchProvider = array{ @@ -87,7 +87,7 @@ namespace OC\Core; * name: string, * icon: string, * order: int, - * triggers: string[], + * triggers: list<string>, * filters: array<string, string>, * inAppSearch: bool, * } @@ -99,13 +99,13 @@ namespace OC\Core; * resourceUrl: string, * icon: string, * rounded: bool, - * attributes: string[], + * attributes: list<string>, * } * * @psalm-type CoreUnifiedSearchResult = array{ * name: string, * isPaginated: bool, - * entries: CoreUnifiedSearchResultEntry[], + * entries: list<CoreUnifiedSearchResultEntry>, * cursor: int|string|null, * } * @@ -171,16 +171,16 @@ namespace OC\Core; * @psalm-type CoreTaskProcessingTaskType = array{ * name: string, * description: string, - * inputShape: CoreTaskProcessingShape[], - * inputShapeEnumValues: array{name: string, value: string}[][], + * inputShape: list<CoreTaskProcessingShape>, + * inputShapeEnumValues: list<list<array{name: string, value: string}>>, * inputShapeDefaults: array<string, numeric|string>, - * optionalInputShape: CoreTaskProcessingShape[], - * optionalInputShapeEnumValues: array{name: string, value: string}[][], + * optionalInputShape: list<CoreTaskProcessingShape>, + * optionalInputShapeEnumValues: list<list<array{name: string, value: string}>>, * optionalInputShapeDefaults: array<string, numeric|string>, - * outputShape: CoreTaskProcessingShape[], - * outputShapeEnumValues: array{name: string, value: string}[][], - * optionalOutputShape: CoreTaskProcessingShape[], - * optionalOutputShapeEnumValues: array{name: string, value: string}[][]} + * outputShape: list<CoreTaskProcessingShape>, + * outputShapeEnumValues: list<list<array{name: string, value: string}>>, + * optionalOutputShape: list<CoreTaskProcessingShape>, + * optionalOutputShapeEnumValues: list<list<array{name: string, value: string}>>, * } * * @psalm-type CoreTaskProcessingIO = array<string, numeric|list<numeric>|string|list<string>> @@ -196,7 +196,10 @@ namespace OC\Core; * output: null|CoreTaskProcessingIO, * customId: ?string, * completionExpectedAt: ?int, - * progress: ?float + * progress: ?float, + * scheduledAt: ?int, + * startedAt: ?int, + * endedAt: ?int, * } * */ diff --git a/core/openapi-ex_app.json b/core/openapi-ex_app.json index cc4a53e10b1..95a86e8e112 100644 --- a/core/openapi-ex_app.json +++ b/core/openapi-ex_app.json @@ -142,7 +142,10 @@ "output", "customId", "completionExpectedAt", - "progress" + "progress", + "scheduledAt", + "startedAt", + "endedAt" ], "properties": { "id": { @@ -194,6 +197,21 @@ "type": "number", "format": "double", "nullable": true + }, + "scheduledAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "startedAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "endedAt": { + "type": "integer", + "format": "int64", + "nullable": true } } } diff --git a/core/openapi-full.json b/core/openapi-full.json index 36ff35d55b9..d6f9837b1c6 100644 --- a/core/openapi-full.json +++ b/core/openapi-full.json @@ -538,7 +538,10 @@ "output", "customId", "completionExpectedAt", - "progress" + "progress", + "scheduledAt", + "startedAt", + "endedAt" ], "properties": { "id": { @@ -590,6 +593,21 @@ "type": "number", "format": "double", "nullable": true + }, + "scheduledAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "startedAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "endedAt": { + "type": "integer", + "format": "int64", + "nullable": true } } }, diff --git a/core/openapi.json b/core/openapi.json index 582b01fd050..bf8f2478fbd 100644 --- a/core/openapi.json +++ b/core/openapi.json @@ -538,7 +538,10 @@ "output", "customId", "completionExpectedAt", - "progress" + "progress", + "scheduledAt", + "startedAt", + "endedAt" ], "properties": { "id": { @@ -590,6 +593,21 @@ "type": "number", "format": "double", "nullable": true + }, + "scheduledAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "startedAt": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "endedAt": { + "type": "integer", + "format": "int64", + "nullable": true } } }, diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php index 312b6973403..a0e5d7e28e8 100644 --- a/lib/private/AppConfig.php +++ b/lib/private/AppConfig.php @@ -76,7 +76,7 @@ class AppConfig implements IAppConfig { /** * @inheritDoc * - * @return string[] list of app ids + * @return list<string> list of app ids * @since 7.0.0 */ public function getApps(): array { @@ -92,7 +92,7 @@ class AppConfig implements IAppConfig { * * @param string $app id of the app * - * @return string[] list of stored config keys + * @return list<string> list of stored config keys * @since 29.0.0 */ public function getKeys(string $app): array { diff --git a/lib/private/Files/Template/TemplateManager.php b/lib/private/Files/Template/TemplateManager.php index 865af4eb90c..47011f875ae 100644 --- a/lib/private/Files/Template/TemplateManager.php +++ b/lib/private/Files/Template/TemplateManager.php @@ -118,11 +118,11 @@ class TemplateManager implements ITemplateManager { } public function listTemplates(): array { - return array_map(function (TemplateFileCreator $entry) { + return array_values(array_map(function (TemplateFileCreator $entry) { return array_merge($entry->jsonSerialize(), [ 'templates' => $this->getTemplateFiles($entry) ]); - }, $this->listCreators()); + }, $this->listCreators())); } /** @@ -180,6 +180,9 @@ class TemplateManager implements ITemplateManager { throw new NotFoundException(); } + /** + * @return list<Template> + */ private function getTemplateFiles(TemplateFileCreator $type): array { $templates = []; foreach ($this->getRegisteredProviders() as $provider) { diff --git a/lib/private/Group/Backend.php b/lib/private/Group/Backend.php index f6844308a15..f4a90018b5a 100644 --- a/lib/private/Group/Backend.php +++ b/lib/private/Group/Backend.php @@ -71,7 +71,7 @@ abstract class Backend implements \OCP\GroupInterface { /** * Get all groups a user belongs to * @param string $uid Name of the user - * @return array an array of group names + * @return list<string> an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php index 095cbe24316..0cb571a3935 100644 --- a/lib/private/Group/Database.php +++ b/lib/private/Group/Database.php @@ -194,7 +194,7 @@ class Database extends ABackend implements /** * Get all groups a user belongs to * @param string $uid Name of the user - * @return array an array of group names + * @return list<string> an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php index bd46780a602..e58a1fe6585 100644 --- a/lib/private/Group/Manager.php +++ b/lib/private/Group/Manager.php @@ -361,7 +361,7 @@ class Manager extends PublicEmitter implements IGroupManager { * get a list of group ids for a user * * @param IUser $user - * @return string[] with group ids + * @return list<string> with group ids */ public function getUserGroupIds(IUser $user): array { return $this->getUserIdGroupIds($user->getUID()); @@ -369,7 +369,7 @@ class Manager extends PublicEmitter implements IGroupManager { /** * @param string $uid the user id - * @return string[] + * @return list<string> */ private function getUserIdGroupIds(string $uid): array { if (!isset($this->cachedUserGroups[$uid])) { diff --git a/lib/private/OCM/Model/OCMProvider.php b/lib/private/OCM/Model/OCMProvider.php index 9bda95ebc17..73002ae668d 100644 --- a/lib/private/OCM/Model/OCMProvider.php +++ b/lib/private/OCM/Model/OCMProvider.php @@ -194,12 +194,12 @@ class OCMProvider implements IOCMProvider { * enabled: bool, * apiVersion: string, * endPoint: string, - * resourceTypes: array{ - * name: string, - * shareTypes: string[], - * protocols: array<string, string> - * }[] - * } + * resourceTypes: list<array{ + * name: string, + * shareTypes: list<string>, + * protocols: array<string, string> + * }>, + * } */ public function jsonSerialize(): array { $resourceTypes = []; diff --git a/lib/private/OCM/Model/OCMResource.php b/lib/private/OCM/Model/OCMResource.php index 68f9ee18f79..3d619db1927 100644 --- a/lib/private/OCM/Model/OCMResource.php +++ b/lib/private/OCM/Model/OCMResource.php @@ -16,7 +16,7 @@ use OCP\OCM\IOCMResource; */ class OCMResource implements IOCMResource { private string $name = ''; - /** @var string[] */ + /** @var list<string> */ private array $shareTypes = []; /** @var array<string, string> */ private array $protocols = []; @@ -40,7 +40,7 @@ class OCMResource implements IOCMResource { } /** - * @param string[] $shareTypes + * @param list<string> $shareTypes * * @return $this */ @@ -51,7 +51,7 @@ class OCMResource implements IOCMResource { } /** - * @return string[] + * @return list<string> */ public function getShareTypes(): array { return $this->shareTypes; @@ -92,7 +92,7 @@ class OCMResource implements IOCMResource { /** * @return array{ * name: string, - * shareTypes: string[], + * shareTypes: list<string>, * protocols: array<string, string> * } */ diff --git a/lib/private/Search/SearchComposer.php b/lib/private/Search/SearchComposer.php index d23662f7055..71fd003717c 100644 --- a/lib/private/Search/SearchComposer.php +++ b/lib/private/Search/SearchComposer.php @@ -10,6 +10,7 @@ namespace OC\Search; use InvalidArgumentException; use OC\AppFramework\Bootstrap\Coordinator; +use OC\Core\ResponseDefinitions; use OCP\IURLGenerator; use OCP\IUser; use OCP\Search\FilterDefinition; @@ -43,6 +44,7 @@ use function array_map; * results are awaited or shown as they come in. * * @see IProvider::search() for the arguments of the individual search requests + * @psalm-import-type CoreUnifiedSearchProvider from ResponseDefinitions */ class SearchComposer { /** @@ -156,7 +158,7 @@ class SearchComposer { * @param string $route the route the user is currently at * @param array $routeParameters the parameters of the route the user is currently at * - * @return array + * @return list<CoreUnifiedSearchProvider> */ public function getProviders(string $route, array $routeParameters): array { $this->loadLazyProviders(); @@ -183,7 +185,7 @@ class SearchComposer { 'name' => $provider->getName(), 'icon' => $this->fetchIcon($appId, $provider->getId()), 'order' => $order, - 'triggers' => $triggers, + 'triggers' => array_values($triggers), 'filters' => $this->getFiltersType($filters, $provider->getId()), 'inAppSearch' => $provider instanceof IInAppSearch, ]; diff --git a/lib/private/Tags.php b/lib/private/Tags.php index 1f22a4c6a33..d59c1bd6928 100644 --- a/lib/private/Tags.php +++ b/lib/private/Tags.php @@ -147,9 +147,9 @@ class Tags implements ITags { /** * Get the list of tags for the given ids. * - * @param array $objIds array of object ids - * @return array|false of tags id as key to array of tag names - * or false if an error occurred + * @param list<int> $objIds array of object ids + * @return array<int, list<string>>|false of tags id as key to array of tag names + * or false if an error occurred */ public function getTagsForObjects(array $objIds) { $entries = []; diff --git a/lib/private/Teams/TeamManager.php b/lib/private/Teams/TeamManager.php index 223579a1182..d75b0209c71 100644 --- a/lib/private/Teams/TeamManager.php +++ b/lib/private/Teams/TeamManager.php @@ -80,7 +80,7 @@ class TeamManager implements ITeamManager { array_push($resources, ...$provider->getSharedWith($teamId)); } - return $resources; + return array_values($resources); } public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array { diff --git a/lib/private/Updater/ChangesCheck.php b/lib/private/Updater/ChangesCheck.php index df017b09040..e88969f62a8 100644 --- a/lib/private/Updater/ChangesCheck.php +++ b/lib/private/Updater/ChangesCheck.php @@ -32,7 +32,7 @@ class ChangesCheck { /** * @throws DoesNotExistException - * @return array{changelogURL: string, whatsNew: array<string, array{admin: string[], regular: string[]}>} + * @return array{changelogURL: string, whatsNew: array<string, array{admin: list<string>, regular: list<string>}>} */ public function getChangesForVersion(string $version): array { $version = $this->normalizeVersion($version); diff --git a/lib/private/legacy/OC_App.php b/lib/private/legacy/OC_App.php index 6afd4086cb3..544938b6ff9 100644 --- a/lib/private/legacy/OC_App.php +++ b/lib/private/legacy/OC_App.php @@ -169,7 +169,7 @@ class OC_App { * @param bool $forceRefresh whether to refresh the cache * @param bool $all whether to return apps for all users, not only the * currently logged in one - * @return string[] + * @return list<string> */ public static function getEnabledApps(bool $forceRefresh = false, bool $all = false): array { if (!\OC::$server->getSystemConfig()->getValue('installed', false)) { diff --git a/lib/public/Dashboard/IAPIWidget.php b/lib/public/Dashboard/IAPIWidget.php index 8fec40cf1b1..c8f98290a0e 100644 --- a/lib/public/Dashboard/IAPIWidget.php +++ b/lib/public/Dashboard/IAPIWidget.php @@ -9,6 +9,8 @@ declare(strict_types=1); namespace OCP\Dashboard; +use OCP\Dashboard\Model\WidgetItem; + /** * interface IAPIWidget * @@ -16,7 +18,7 @@ namespace OCP\Dashboard; */ interface IAPIWidget extends IWidget { /** - * @return \OCP\Dashboard\Model\WidgetItem[] The widget items + * @return list<WidgetItem> The widget items * @since 22.0.0 */ public function getItems(string $userId, ?string $since = null, int $limit = 7): array; diff --git a/lib/public/Dashboard/IButtonWidget.php b/lib/public/Dashboard/IButtonWidget.php index fa8d6bc36a6..f4ebd9253c7 100644 --- a/lib/public/Dashboard/IButtonWidget.php +++ b/lib/public/Dashboard/IButtonWidget.php @@ -19,7 +19,7 @@ interface IButtonWidget extends IWidget { * Get the buttons to show on the widget * * @param string $userId - * @return WidgetButton[] + * @return list<WidgetButton> * @since 25.0.0 */ public function getWidgetButtons(string $userId): array; diff --git a/lib/public/Dashboard/Model/WidgetItem.php b/lib/public/Dashboard/Model/WidgetItem.php index be5fba82323..680daf1b114 100644 --- a/lib/public/Dashboard/Model/WidgetItem.php +++ b/lib/public/Dashboard/Model/WidgetItem.php @@ -134,8 +134,14 @@ final class WidgetItem implements JsonSerializable { /** * @since 22.0.0 - * - * @return array + * @return array{ + * subtitle: string, + * title: string, + * link: string, + * iconUrl: string, + * overlayIconUrl: string, + * sinceId: string, + * } */ public function jsonSerialize(): array { return [ diff --git a/lib/public/Files/Template/Field.php b/lib/public/Files/Template/Field.php index ec195ca3504..e047e83a29e 100644 --- a/lib/public/Files/Template/Field.php +++ b/lib/public/Files/Template/Field.php @@ -32,6 +32,15 @@ abstract class Field implements \JsonSerializable { abstract public function setValue(mixed $value): void; /** + * @return array{ + * index: string, + * type: string, + * alias: ?string, + * tag: ?string, + * id: ?int, + * content?: string, + * checked?: bool, + * } * @since 30.0.0 */ public function jsonSerialize(): array { diff --git a/lib/public/Files/Template/Fields/CheckBoxField.php b/lib/public/Files/Template/Fields/CheckBoxField.php index 48ccb04336a..6fab3ce66a6 100644 --- a/lib/public/Files/Template/Fields/CheckBoxField.php +++ b/lib/public/Files/Template/Fields/CheckBoxField.php @@ -37,6 +37,15 @@ class CheckBoxField extends Field { } /** + * @return array{ + * index: string, + * type: string, + * alias: ?string, + * tag: ?string, + * id: ?int, + * content?: string, + * checked?: bool, + * } * @since 30.0.0 */ public function jsonSerialize(): array { diff --git a/lib/public/Files/Template/Fields/RichTextField.php b/lib/public/Files/Template/Fields/RichTextField.php index 14539bc9dbd..93ead68747c 100644 --- a/lib/public/Files/Template/Fields/RichTextField.php +++ b/lib/public/Files/Template/Fields/RichTextField.php @@ -37,6 +37,15 @@ class RichTextField extends Field { } /** + * @return array{ + * index: string, + * type: string, + * alias: ?string, + * tag: ?string, + * id: ?int, + * content?: string, + * checked?: bool, + * } * @since 30.0.0 */ public function jsonSerialize(): array { diff --git a/lib/public/Files/Template/ITemplateManager.php b/lib/public/Files/Template/ITemplateManager.php index 94e0db935e7..9a81aa51ceb 100644 --- a/lib/public/Files/Template/ITemplateManager.php +++ b/lib/public/Files/Template/ITemplateManager.php @@ -33,7 +33,7 @@ interface ITemplateManager { /** * Get a list of available file creators and their offered templates * - * @return array + * @return list<array{app: string, label: string, extension: string, iconClass: ?string, iconSvgInline: ?string, mimetypes: list<string>, ratio: ?float, actionLabel: string, templates: list<Template>}> * @since 21.0.0 */ public function listTemplates(): array; diff --git a/lib/public/Files/Template/Template.php b/lib/public/Files/Template/Template.php index 634935d212e..7f01c2afa48 100644 --- a/lib/public/Files/Template/Template.php +++ b/lib/public/Files/Template/Template.php @@ -24,7 +24,7 @@ final class Template implements \JsonSerializable { private $hasPreview = false; /** @var string|null */ private $previewUrl = null; - /** @var array */ + /** @var list<Field> */ private $fields = []; /** @@ -51,6 +51,7 @@ final class Template implements \JsonSerializable { } /** + * @param list<Field> $fields * @since 30.0.0 */ public function setFields(array $fields): void { @@ -58,6 +59,29 @@ final class Template implements \JsonSerializable { } /** + * @return array{ + * templateType: string, + * templateId: string, + * basename: string, + * etag: string, + * fileid: int, + * filename: string, + * lastmod: int, + * mime: string, + * size: int|float, + * type: string, + * hasPreview: bool, + * previewUrl: ?string, + * fields: list<array{ + * index: string, + * type: string, + * alias: ?string, + * tag: ?string, + * id: ?int, + * content?: string, + * checked?: bool, + * }>, + * } * @since 21.0.0 */ public function jsonSerialize(): array { @@ -74,7 +98,7 @@ final class Template implements \JsonSerializable { 'type' => $this->file->getType(), 'hasPreview' => $this->hasPreview, 'previewUrl' => $this->previewUrl, - 'fields' => $this->fields + 'fields' => array_map(static fn (Field $field) => $field->jsonSerialize(), $this->fields), ]; } } diff --git a/lib/public/Files/Template/TemplateFileCreator.php b/lib/public/Files/Template/TemplateFileCreator.php index 9a4bd2fae43..809bd3d0bc2 100644 --- a/lib/public/Files/Template/TemplateFileCreator.php +++ b/lib/public/Files/Template/TemplateFileCreator.php @@ -13,7 +13,7 @@ namespace OCP\Files\Template; */ final class TemplateFileCreator implements \JsonSerializable { protected $appId; - /** @var string[] $mimetypes */ + /** @var list<string> $mimetypes */ protected $mimetypes = []; protected $actionName; protected $fileExtension; @@ -121,7 +121,7 @@ final class TemplateFileCreator implements \JsonSerializable { /** * @since 21.0.0 - * @return array{app: string, label: string, extension: string, iconClass: ?string, iconSvgInline: ?string, mimetypes: string[], ratio: ?float, actionLabel: string} + * @return array{app: string, label: string, extension: string, iconClass: ?string, iconSvgInline: ?string, mimetypes: list<string>, ratio: ?float, actionLabel: string} */ public function jsonSerialize(): array { return [ diff --git a/lib/public/GroupInterface.php b/lib/public/GroupInterface.php index a6c01fa1d11..cbfd74a068a 100644 --- a/lib/public/GroupInterface.php +++ b/lib/public/GroupInterface.php @@ -86,7 +86,7 @@ interface GroupInterface { /** * Get all groups a user belongs to * @param string $uid Name of the user - * @return array an array of group names + * @return list<string> an array of group names * @since 4.5.0 * * This function fetches all groups a user belongs to. It does not check diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php index 49f51467308..fe894da8d31 100644 --- a/lib/public/IAppConfig.php +++ b/lib/public/IAppConfig.php @@ -50,7 +50,7 @@ interface IAppConfig { * * **WARNING:** ignore lazy filtering, all config values are loaded from database * - * @return string[] list of app ids + * @return list<string> list of app ids * @since 7.0.0 */ public function getApps(): array; @@ -63,7 +63,7 @@ interface IAppConfig { * * @param string $app id of the app * - * @return string[] list of stored config keys + * @return list<string> list of stored config keys * @since 29.0.0 */ public function getKeys(string $app): array; diff --git a/lib/public/ITags.php b/lib/public/ITags.php index 0da4522c86c..633cec72085 100644 --- a/lib/public/ITags.php +++ b/lib/public/ITags.php @@ -76,9 +76,9 @@ interface ITags { * ] * ``` * - * @param array $objIds item ids - * @return array|false with object id as key and an array - * of tag names as value or false if an error occurred + * @param list<int> $objIds item ids + * @return array<int, list<string>>|false with object id as key and an array + * of tag names as value or false if an error occurred * @since 8.0.0 */ public function getTagsForObjects(array $objIds); diff --git a/lib/public/OCM/IOCMProvider.php b/lib/public/OCM/IOCMProvider.php index 58b50aca172..ba2ab6ce759 100644 --- a/lib/public/OCM/IOCMProvider.php +++ b/lib/public/OCM/IOCMProvider.php @@ -136,11 +136,11 @@ interface IOCMProvider extends JsonSerializable { * enabled: bool, * apiVersion: string, * endPoint: string, - * resourceTypes: array{ + * resourceTypes: list<array{ * name: string, - * shareTypes: string[], + * shareTypes: list<string>, * protocols: array<string, string> - * }[] + * }>, * } * @since 28.0.0 */ diff --git a/lib/public/OCM/IOCMResource.php b/lib/public/OCM/IOCMResource.php index 788b5563cfc..60bf701e8ea 100644 --- a/lib/public/OCM/IOCMResource.php +++ b/lib/public/OCM/IOCMResource.php @@ -39,7 +39,7 @@ interface IOCMResource extends JsonSerializable { /** * set share types * - * @param string[] $shareTypes + * @param list<string> $shareTypes * * @return $this * @since 28.0.0 @@ -49,7 +49,7 @@ interface IOCMResource extends JsonSerializable { /** * get share types * - * @return string[] + * @return list<string> * @since 28.0.0 */ public function getShareTypes(): array; @@ -85,7 +85,7 @@ interface IOCMResource extends JsonSerializable { /** * @return array{ * name: string, - * shareTypes: string[], + * shareTypes: list<string>, * protocols: array<string, string> * } * @since 28.0.0 diff --git a/lib/public/TaskProcessing/IManager.php b/lib/public/TaskProcessing/IManager.php index 2d5fe1d9ba6..1b59bb12ad4 100644 --- a/lib/public/TaskProcessing/IManager.php +++ b/lib/public/TaskProcessing/IManager.php @@ -46,7 +46,7 @@ interface IManager { public function getPreferredProvider(string $taskTypeId); /** - * @return array<array-key,array{name: string, description: string, inputShape: ShapeDescriptor[], inputShapeEnumValues: ShapeEnumValue[][], inputShapeDefaults: array<array-key, numeric|string>, optionalInputShape: ShapeDescriptor[], optionalInputShapeEnumValues: ShapeEnumValue[][], optionalInputShapeDefaults: array<array-key, numeric|string>, outputShape: ShapeDescriptor[], outputShapeEnumValues: ShapeEnumValue[][], optionalOutputShape: ShapeDescriptor[], optionalOutputShapeEnumValues: ShapeEnumValue[][]}> + * @return array<string, array{name: string, description: string, inputShape: ShapeDescriptor[], inputShapeEnumValues: ShapeEnumValue[][], inputShapeDefaults: array<array-key, numeric|string>, optionalInputShape: ShapeDescriptor[], optionalInputShapeEnumValues: ShapeEnumValue[][], optionalInputShapeDefaults: array<array-key, numeric|string>, outputShape: ShapeDescriptor[], outputShapeEnumValues: ShapeEnumValue[][], optionalOutputShape: ShapeDescriptor[], optionalOutputShapeEnumValues: ShapeEnumValue[][]}> * @since 30.0.0 */ public function getAvailableTaskTypes(): array; diff --git a/lib/public/TaskProcessing/Task.php b/lib/public/TaskProcessing/Task.php index db8e4d7fab5..71c271cd43d 100644 --- a/lib/public/TaskProcessing/Task.php +++ b/lib/public/TaskProcessing/Task.php @@ -253,12 +253,12 @@ final class Task implements \JsonSerializable { } /** - * @psalm-return array{id: ?int, lastUpdated: int, type: string, status: 'STATUS_CANCELLED'|'STATUS_FAILED'|'STATUS_SUCCESSFUL'|'STATUS_RUNNING'|'STATUS_SCHEDULED'|'STATUS_UNKNOWN', userId: ?string, appId: string, input: array<array-key, list<numeric|string>|numeric|string>, output: ?array<array-key, list<numeric|string>|numeric|string>, customId: ?string, completionExpectedAt: ?int, progress: ?float, scheduledAt: ?int, startedAt: ?int, endedAt: ?int} + * @psalm-return array{id: int, lastUpdated: int, type: string, status: 'STATUS_CANCELLED'|'STATUS_FAILED'|'STATUS_SUCCESSFUL'|'STATUS_RUNNING'|'STATUS_SCHEDULED'|'STATUS_UNKNOWN', userId: ?string, appId: string, input: array<string, list<numeric|string>|numeric|string>, output: ?array<string, list<numeric|string>|numeric|string>, customId: ?string, completionExpectedAt: ?int, progress: ?float, scheduledAt: ?int, startedAt: ?int, endedAt: ?int} * @since 30.0.0 */ final public function jsonSerialize(): array { return [ - 'id' => $this->getId(), + 'id' => (int)$this->getId(), 'type' => $this->getTaskTypeId(), 'lastUpdated' => $this->getLastUpdated(), 'status' => self::statusToString($this->getStatus()), diff --git a/lib/public/Teams/ITeamManager.php b/lib/public/Teams/ITeamManager.php index 5c4c63b4f23..144a141f93e 100644 --- a/lib/public/Teams/ITeamManager.php +++ b/lib/public/Teams/ITeamManager.php @@ -28,7 +28,7 @@ interface ITeamManager { /** * Returns all team resources for a given team and user * - * @return TeamResource[] + * @return list<TeamResource> * @since 29.0.0 */ public function getSharedWith(string $teamId, string $userId): array; |