diff --git a/lib/Controller/OpenProjectAPIController.php b/lib/Controller/OpenProjectAPIController.php index c88d542c0..09774678b 100644 --- a/lib/Controller/OpenProjectAPIController.php +++ b/lib/Controller/OpenProjectAPIController.php @@ -153,7 +153,8 @@ public function getSearchedWorkPackages(?string $searchQuery = null, ?int $fileI $result = $this->openprojectAPIService->searchWorkPackage( $this->userId, $searchQuery, - $fileId + $fileId, + $this->urlGenerator->getBaseUrl() ); if (!isset($result['error'])) { diff --git a/lib/Service/OpenProjectAPIService.php b/lib/Service/OpenProjectAPIService.php index 5f62a86e8..5b5f87eaa 100644 --- a/lib/Service/OpenProjectAPIService.php +++ b/lib/Service/OpenProjectAPIService.php @@ -236,6 +236,7 @@ public function getNotifications( * @param string $userId * @param string|null $query * @param int|null $fileId + * @param string|null $storageUrl * @param int $offset * @param int $limit * @return array @@ -243,8 +244,18 @@ public function getNotifications( * @throws \Safe\Exceptions\JsonException */ public function searchWorkPackage( - string $userId, string $query = null, int $fileId = null, int $offset = 0, int $limit = 5 + string $userId, + string $query = null, + int $fileId = null, + string $storageUrl = null, + int $offset = 0, + int $limit = 5 ): array { + $linkableStorageFilter = [ + 'linkable_to_storage_url' => + ['operator' => '=', 'values' => [urlencode($storageUrl)]] + ]; + $sortBy = [['status', 'asc'],['updatedAt', 'desc']]; $resultsById = []; $filters = []; @@ -254,11 +265,13 @@ public function searchWorkPackage( } if ($query !== null) { $filters[] = ['description' => ['operator' => '~', 'values' => [$query]]]; - $filters[] = ['status' => ['operator' => '!', 'values' => ['14']]]; + if ($storageUrl !== null) { + $filters[] = $linkableStorageFilter; + } } $params = [ 'filters' => \Safe\json_encode($filters), - 'sortBy' => '[["updatedAt", "desc"]]', + 'sortBy' => \Safe\json_encode($sortBy), // 'limit' => $limit, ]; $searchDescResult = $this->request($userId, 'work_packages', $params); @@ -276,11 +289,13 @@ public function searchWorkPackage( if ($query !== null) { $filters = [ ['subject' => ['operator' => '~', 'values' => [$query]]], - ['status' => ['operator' => '!', 'values' => ['14']]] ]; + if ($storageUrl !== null) { + $filters[] = $linkableStorageFilter; + } $params = [ 'filters' => \Safe\json_encode($filters), - 'sortBy' => '[["updatedAt", "desc"]]', + 'sortBy' => \Safe\json_encode($sortBy), // 'limit' => $limit, ]; $searchSubjectResult = $this->request($userId, 'work_packages', $params); diff --git a/tests/lib/Service/OpenProjectAPIServiceTest.php b/tests/lib/Service/OpenProjectAPIServiceTest.php index 92f1b67fb..6e086e6a5 100644 --- a/tests/lib/Service/OpenProjectAPIServiceTest.php +++ b/tests/lib/Service/OpenProjectAPIServiceTest.php @@ -333,15 +333,15 @@ public function testSearchWorkPackageOnlyQueryDescAndSubjectResponse( [ 'user', 'work_packages', [ - 'filters' => '[{"description":{"operator":"~","values":["search query"]}},{"status":{"operator":"!","values":["14"]}}]', - 'sortBy' => '[["updatedAt", "desc"]]', + 'filters' => '[{"description":{"operator":"~","values":["search query"]}}]', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', ] ], [ 'user', 'work_packages', [ - 'filters' => '[{"subject":{"operator":"~","values":["search query"]}},{"status":{"operator":"!","values":["14"]}}]', - 'sortBy' => '[["updatedAt", "desc"]]', + 'filters' => '[{"subject":{"operator":"~","values":["search query"]}}]', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', ] ] ) @@ -353,6 +353,55 @@ public function testSearchWorkPackageOnlyQueryDescAndSubjectResponse( $this->assertSame($expectedResult, $result); } + /** + * @param array $descriptionResponse + * @param array $subjectResponse + * @param array $expectedResult + * @return void + * @dataProvider searchWorkPackageDataProvider + */ + public function testSearchWorkPackageQueryAndStorage( + array $descriptionResponse, array $subjectResponse, array $expectedResult + ) { + $service = $this->getServiceMock(); + $service->method('request') + ->withConsecutive( + [ + 'user', 'work_packages', + [ + 'filters' => '[' . + '{"description":' . + '{"operator":"~","values":["search query"]}'. + '},'. + '{"linkable_to_storage_url":'. + '{"operator":"=","values":["https%3A%2F%2Fnc.my-server.org"]}}'. + ']', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', + ] + ], + [ + 'user', 'work_packages', + [ + 'filters' => '[' . + '{"subject":' . + '{"operator":"~","values":["search query"]}'. + '},'. + '{"linkable_to_storage_url":'. + '{"operator":"=","values":["https%3A%2F%2Fnc.my-server.org"]}}'. + ']', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', + ] + ] + ) + ->willReturnOnConsecutiveCalls( + $descriptionResponse, + $subjectResponse + ); + $result = $service->searchWorkPackage( + 'user', 'search query', null, 'https://nc.my-server.org' + ); + $this->assertSame($expectedResult, $result); + } /** * @return void */ @@ -364,7 +413,7 @@ public function testSearchWorkPackageByFileIdOnlyFileId() { 'user', 'work_packages', [ 'filters' => '[{"file_link_origin_id":{"operator":"=","values":["123"]}}]', - 'sortBy' => '[["updatedAt", "desc"]]', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', ] ], ) @@ -385,15 +434,15 @@ public function testSearchWorkPackageByFileIdQueryAndFileId() { [ 'user', 'work_packages', [ - 'filters' => '[{"file_link_origin_id":{"operator":"=","values":["123"]}},{"description":{"operator":"~","values":["search query"]}},{"status":{"operator":"!","values":["14"]}}]', - 'sortBy' => '[["updatedAt", "desc"]]', + 'filters' => '[{"file_link_origin_id":{"operator":"=","values":["123"]}},{"description":{"operator":"~","values":["search query"]}}]', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', ] ], [ 'user', 'work_packages', [ - 'filters' => '[{"subject":{"operator":"~","values":["search query"]}},{"status":{"operator":"!","values":["14"]}}]', - 'sortBy' => '[["updatedAt", "desc"]]', + 'filters' => '[{"subject":{"operator":"~","values":["search query"]}}]', + 'sortBy' => '[["status","asc"],["updatedAt","desc"]]', ] ] )