Browse Source

fix(OpenAPI): Adjust array syntax to avoid ambiguities

Signed-off-by: provokateurin <kate@provokateurin.de>
pull/49015/head
provokateurin 1 year ago
parent
commit
77114fb327
Failed to extract signature
  1. 6
      apps/cloud_federation_api/lib/Capabilities.php
  2. 2
      apps/cloud_federation_api/lib/Controller/RequestHandlerController.php
  3. 4
      apps/cloud_federation_api/lib/ResponseDefinitions.php
  4. 6
      apps/dashboard/lib/Controller/DashboardApiController.php
  5. 8
      apps/dashboard/lib/ResponseDefinitions.php
  6. 6
      apps/dav/lib/Controller/UpcomingEventsController.php
  7. 12
      apps/federatedfilesharing/lib/Controller/RequestHandlerController.php
  8. 4
      apps/federation/lib/Controller/OCSAuthAPIController.php
  9. 2
      apps/files/lib/Capabilities.php
  10. 2
      apps/files/lib/Controller/DirectEditingController.php
  11. 4
      apps/files/lib/Controller/OpenLocalEditorController.php
  12. 17
      apps/files/lib/Controller/TemplateController.php
  13. 6
      apps/files/lib/Controller/TransferOwnershipController.php
  14. 27
      apps/files/lib/Helper.php
  15. 34
      apps/files/lib/ResponseDefinitions.php
  16. 123
      apps/files/openapi.json
  17. 14
      apps/files/tests/HelperTest.php
  18. 2
      apps/files_external/lib/Controller/ApiController.php
  19. 12
      apps/files_external/lib/Lib/StorageConfig.php
  20. 4
      apps/files_external/lib/ResponseDefinitions.php
  21. 6
      apps/files_reminders/lib/Controller/ApiController.php
  22. 8
      apps/files_sharing/lib/Controller/DeletedShareAPIController.php
  23. 4
      apps/files_sharing/lib/Controller/PublicPreviewController.php
  24. 12
      apps/files_sharing/lib/Controller/RemoteController.php
  25. 36
      apps/files_sharing/lib/Controller/ShareAPIController.php
  26. 2
      apps/files_sharing/lib/Controller/ShareInfoController.php
  27. 4
      apps/files_sharing/lib/Controller/ShareesAPIController.php
  28. 10
      apps/files_sharing/lib/External/Manager.php
  29. 52
      apps/files_sharing/lib/ResponseDefinitions.php
  30. 5
      apps/files_sharing/openapi.json
  31. 2
      apps/files_trashbin/lib/Controller/PreviewController.php
  32. 2
      apps/files_versions/lib/Controller/PreviewController.php
  33. 2
      apps/provisioning_api/lib/Controller/AUserData.php
  34. 8
      apps/provisioning_api/lib/Controller/AppConfigController.php
  35. 10
      apps/provisioning_api/lib/Controller/AppsController.php
  36. 28
      apps/provisioning_api/lib/Controller/GroupsController.php
  37. 10
      apps/provisioning_api/lib/Controller/PreferencesController.php
  38. 56
      apps/provisioning_api/lib/Controller/UsersController.php
  39. 8
      apps/provisioning_api/lib/ResponseDefinitions.php
  40. 4
      apps/sharebymail/lib/Capabilities.php
  41. 101
      apps/sharebymail/openapi.json
  42. 2
      apps/theming/lib/Controller/ThemingController.php
  43. 4
      apps/theming/lib/Controller/UserThemeController.php
  44. 2
      apps/updatenotification/lib/Controller/APIController.php
  45. 4
      apps/user_ldap/lib/Controller/ConfigAPIController.php
  46. 6
      apps/user_ldap/lib/Group_LDAP.php
  47. 2
      apps/user_ldap/lib/Group_Proxy.php
  48. 2
      apps/user_status/lib/Controller/HeartbeatController.php
  49. 6
      apps/user_status/lib/Controller/PredefinedStatusController.php
  50. 6
      apps/user_status/lib/Controller/StatusesController.php
  51. 4
      apps/user_status/lib/Controller/UserStatusController.php
  52. 4
      apps/user_status/lib/Dashboard/UserStatusWidget.php
  53. 6
      apps/weather_status/lib/Controller/WeatherStatusController.php
  54. 8
      apps/weather_status/lib/Service/WeatherStatusService.php
  55. 12
      apps/webhook_listeners/lib/Controller/WebhooksController.php
  56. 4
      core/Controller/AppPasswordController.php
  57. 6
      core/Controller/AutoCompleteController.php
  58. 4
      core/Controller/AvatarController.php
  59. 2
      core/Controller/CSRFTokenController.php
  60. 2
      core/Controller/ClientFlowLoginV2Controller.php
  61. 20
      core/Controller/CollaborationResourcesController.php
  62. 4
      core/Controller/HoverCardController.php
  63. 2
      core/Controller/LoginController.php
  64. 4
      core/Controller/NavigationController.php
  65. 2
      core/Controller/OCMController.php
  66. 6
      core/Controller/PreviewController.php
  67. 2
      core/Controller/ProfileApiController.php
  68. 10
      core/Controller/ReferenceApiController.php
  69. 46
      core/Controller/TaskProcessingApiController.php
  70. 12
      core/Controller/TeamsApiController.php
  71. 9
      core/Controller/TextProcessingApiController.php
  72. 7
      core/Controller/TextToImageApiController.php
  73. 4
      core/Controller/TranslationApiController.php
  74. 2
      core/Controller/UnifiedSearchController.php
  75. 4
      core/Controller/WhatsNewController.php
  76. 4
      core/Controller/WipeController.php
  77. 31
      core/ResponseDefinitions.php
  78. 20
      core/openapi-ex_app.json
  79. 20
      core/openapi-full.json
  80. 20
      core/openapi.json
  81. 4
      lib/private/AppConfig.php
  82. 7
      lib/private/Files/Template/TemplateManager.php
  83. 2
      lib/private/Group/Backend.php
  84. 2
      lib/private/Group/Database.php
  85. 4
      lib/private/Group/Manager.php
  86. 12
      lib/private/OCM/Model/OCMProvider.php
  87. 8
      lib/private/OCM/Model/OCMResource.php
  88. 6
      lib/private/Search/SearchComposer.php
  89. 6
      lib/private/Tags.php
  90. 2
      lib/private/Teams/TeamManager.php
  91. 2
      lib/private/Updater/ChangesCheck.php
  92. 2
      lib/private/legacy/OC_App.php
  93. 4
      lib/public/Dashboard/IAPIWidget.php
  94. 2
      lib/public/Dashboard/IButtonWidget.php
  95. 10
      lib/public/Dashboard/Model/WidgetItem.php
  96. 9
      lib/public/Files/Template/Field.php
  97. 9
      lib/public/Files/Template/Fields/CheckBoxField.php
  98. 9
      lib/public/Files/Template/Fields/RichTextField.php
  99. 2
      lib/public/Files/Template/ITemplateManager.php
  100. 28
      lib/public/Files/Template/Template.php

6
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

2
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',...
*

4
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 {

6
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

8
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,
* }

6
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,
)),
))),
]);
}

12
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

4
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

2
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 [

2
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
*/

4
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

17
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());

6
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

27
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);
}
}

34
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{

123
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"
}
}
}

14
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);
}
}

2
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
*/

12
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)) {

4
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>,

6
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

8
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
*

4
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

12
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
*

36
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
*/

2
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

4
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

10
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);

52
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 {

5
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"
}
}
}
}

2
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

2
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

2
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 {

8
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

10
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
*/

28
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();

10
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

56
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

8
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,

4
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')) {

101
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
}
]
}
}
}
},

2
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

4
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
*

2
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

4
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

6
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
*/

2
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.

2
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

6
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;
}));
})));
}
}

6
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)));
}
/**

4
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
*/

4
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));
}
/**

6
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

8
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 = [

12
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);

4
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

6
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 = [];

4
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

2
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

2
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

20
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 = [];

4
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(),

2
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

4
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

2
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

6
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,

2
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

10
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);
}

46
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);

12
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,

9
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,

7
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,

4
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(),
]);
}

2
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
*/

4
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
*

4
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

31
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,
* }
*
*/

20
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
}
}
}

20
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
}
}
},

20
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
}
}
},

4
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 {

7
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) {

2
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.

2
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.

4
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])) {

12
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 = [];

8
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>
* }
*/

6
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,
];

6
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 = [];

2
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 {

2
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);

2
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)) {

4
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;

2
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;

10
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 [

9
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 {

9
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 {

9
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 {

2
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;

28
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),
];
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save