diff --git a/src/Enums/OnOfficeResourceType.php b/src/Enums/OnOfficeResourceType.php index e982453..289162b 100644 --- a/src/Enums/OnOfficeResourceType.php +++ b/src/Enums/OnOfficeResourceType.php @@ -22,7 +22,8 @@ enum OnOfficeResourceType: string case FileRelation = 'fileRelation'; case Impressum = 'impressum'; case Activity = 'agentslog'; - case SearchCriteria = 'searchcriterias'; + case GetSearchCriteria = 'searchcriterias'; + case SearchCriteria = 'searchcriteria'; case ActionTypes = 'actionkindtypes'; case Relation = 'relation'; case Search = 'search'; diff --git a/src/Query/SearchCriteriaBuilder.php b/src/Query/SearchCriteriaBuilder.php index f02e9de..1cad300 100644 --- a/src/Query/SearchCriteriaBuilder.php +++ b/src/Query/SearchCriteriaBuilder.php @@ -16,6 +16,8 @@ class SearchCriteriaBuilder extends Builder { private string $mode = 'internal'; + private int $addressId; + /** * @throws Throwable */ @@ -23,7 +25,7 @@ public function find(int|array $id): ?array { $request = new OnOfficeRequest( OnOfficeAction::Get, - OnOfficeResourceType::SearchCriteria, + OnOfficeResourceType::GetSearchCriteria, parameters: [ OnOfficeService::MODE => $this->mode, OnOfficeService::IDS => Arr::wrap($id), @@ -35,10 +37,39 @@ public function find(int|array $id): ?array ->json('response.results.0.data.records.0', []); } + /** + * @throws Throwable + */ + public function create(array $data): array + { + if (! isset($this->addressId)) { + throw new OnOfficeException('Address ID is required to create a search criteria'); + } + + $request = new OnOfficeRequest( + OnOfficeAction::Create, + OnOfficeResourceType::SearchCriteria, + parameters: [ + 'addressid' => $this->addressId, + OnOfficeService::DATA => $data, + ], + ); + + return $this->requestApi($request) + ->json('response.results.0.data.records.0'); + } + public function mode(string $mode): self { $this->mode = $mode; return $this; } + + public function addressId(int $addressId): self + { + $this->addressId = $addressId; + + return $this; + } } diff --git a/tests/Repositories/SearchCriteriaRepositoryTest.php b/tests/Repositories/SearchCriteriaRepositoryTest.php index 811b838..3f16cd4 100644 --- a/tests/Repositories/SearchCriteriaRepositoryTest.php +++ b/tests/Repositories/SearchCriteriaRepositoryTest.php @@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Http; use Innobrain\OnOfficeAdapter\Facades\SearchCriteriaRepository; use Innobrain\OnOfficeAdapter\Facades\Testing\RecordFactories\SearchCriteriaFactory; +use Innobrain\OnOfficeAdapter\Tests\Stubs\CreateSearchCriteriaResponse; use Innobrain\OnOfficeAdapter\Tests\Stubs\GetSearchCriteriaResponse; describe('fake responses', function () { @@ -44,4 +45,25 @@ SearchCriteriaRepository::assertSentCount(1); }); + + test('create', function () { + Http::preventStrayRequests(); + Http::fake([ + 'https://api.onoffice.de/api/stable/api.php/' => Http::sequence([ + CreateSearchCriteriaResponse::make(), + ]), + ]); + + SearchCriteriaRepository::record(); + + $response = SearchCriteriaRepository::query()->find(1); + + expect($response)->toBe([ + 'id' => 25, + 'type' => 'searchCriteria', + 'elements' => [], + ]); + + SearchCriteriaRepository::assertSentCount(1); + }); }); diff --git a/tests/Stubs/CreateSearchCriteriaResponse.php b/tests/Stubs/CreateSearchCriteriaResponse.php new file mode 100644 index 0000000..f7213cc --- /dev/null +++ b/tests/Stubs/CreateSearchCriteriaResponse.php @@ -0,0 +1,54 @@ + [ + 'code' => 200, + 'errorcode' => 0, + 'message' => 'OK', + ], + 'response' => [ + 'results' => [ + [ + 'actionid' => 'urn:onoffice-de-ns:smart:2.5:smartml:action:create', + 'resourceid' => '', + 'resourcetype' => 'searchcriteria', + 'cacheable' => false, + 'identifier' => '', + 'data' => [ + 'meta' => [ + 'cntabsolute' => null, + ], + 'records' => [ + [ + 'id' => 25, + 'type' => 'searchCriteria', + 'elements' => [], + ], + ], + ], + 'status' => [ + 'errorcode' => 0, + 'message' => 'OK', + ], + ], + ], + ], + ], $data); + } +}