Skip to content

Commit d4d7e24

Browse files
committed
Add typed TaskDetails and TaskError + fix namespace casing
1 parent cbd0c25 commit d4d7e24

33 files changed

+620
-65
lines changed

src/Contracts/Task.php

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,26 @@
22

33
declare(strict_types=1);
44

5-
namespace MeiliSearch\Contracts;
5+
namespace Meilisearch\Contracts;
6+
7+
use Meilisearch\Contracts\TaskDetails\DocumentAdditionOrUpdateDetails;
8+
use Meilisearch\Contracts\TaskDetails\DocumentDeletionDetails;
9+
use Meilisearch\Contracts\TaskDetails\DocumentEditionDetails;
10+
use Meilisearch\Contracts\TaskDetails\DumpCreationDetails;
11+
use Meilisearch\Contracts\TaskDetails\IndexCreationDetails;
12+
use Meilisearch\Contracts\TaskDetails\IndexDeletionDetails;
13+
use Meilisearch\Contracts\TaskDetails\IndexSwapDetails;
14+
use Meilisearch\Contracts\TaskDetails\IndexUpdateDetails;
15+
use Meilisearch\Contracts\TaskDetails\SettingsUpdateDetails;
16+
use Meilisearch\Contracts\TaskDetails\TaskCancelationDetails;
17+
use Meilisearch\Contracts\TaskDetails\TaskDeletionDetails;
618

719
final class Task implements \ArrayAccess
820
{
921
/**
1022
* @param non-negative-int $taskUid
1123
* @param non-empty-string|null $indexUid
12-
* @param array{
13-
* message: non-empty-string,
14-
* code: non-empty-string,
15-
* type: non-empty-string,
16-
* link: non-empty-string
17-
* }|null $error
18-
* @param array<mixed> $data Raw data
24+
* @param array<mixed> $data Raw data
1925
*/
2026
public function __construct(
2127
private readonly int $taskUid,
@@ -28,8 +34,8 @@ public function __construct(
2834
private readonly ?string $duration = null,
2935
private readonly ?int $canceledBy = null,
3036
private readonly ?int $batchUid = null,
31-
private readonly ?array $details = null,
32-
private readonly ?array $error = null,
37+
private readonly ?TaskDetails $details = null,
38+
private readonly ?TaskError $error = null,
3339
private readonly array $data = [],
3440
) {
3541
}
@@ -90,20 +96,12 @@ public function getBatchUid(): ?int
9096
return $this->batchUid;
9197
}
9298

93-
public function getDetails(): ?array
99+
public function getDetails(): ?TaskDetails
94100
{
95101
return $this->details;
96102
}
97103

98-
/**
99-
* @return array{
100-
* message: non-empty-string,
101-
* code: non-empty-string,
102-
* type: non-empty-string,
103-
* link: non-empty-string
104-
* }|null
105-
*/
106-
public function getError(): ?array
104+
public function getError(): ?TaskError
107105
{
108106
return $this->error;
109107
}
@@ -158,8 +156,8 @@ public function isFinished(): bool
158156
* duration?: non-empty-string,
159157
* canceledBy?: int,
160158
* batchUid?: int,
161-
* details?: array<mixed>,
162-
* error?: array<mixed>,
159+
* details?: array<mixed>|null,
160+
* error?: array<mixed>|null,
163161
* data: array<mixed>
164162
* } $data
165163
*/
@@ -169,15 +167,28 @@ public static function fromArray(array $data): Task
169167
$data['taskUid'] ?? $data['uid'],
170168
$data['indexUid'],
171169
TaskStatus::from($data['status']),
172-
TaskType::from($data['type']),
170+
$type = TaskType::from($data['type']),
173171
new \DateTimeImmutable($data['enqueuedAt']),
174172
isset($data['startedAt']) ? new \DateTimeImmutable($data['startedAt']) : null,
175173
isset($data['finishedAt']) ? new \DateTimeImmutable($data['finishedAt']) : null,
176174
$data['duration'] ?? null,
177175
$data['canceledBy'] ?? null,
178176
$data['batchUid'] ?? null,
179-
$data['details'] ?? null,
180-
$data['error'] ?? null,
177+
match ($type) {
178+
TaskType::IndexCreation => null !== $data['details'] ? IndexCreationDetails::fromArray($data['details']) : null,
179+
TaskType::IndexUpdate => null !== $data['details'] ? IndexUpdateDetails::fromArray($data['details']) : null,
180+
TaskType::IndexDeletion => null !== $data['details'] ? IndexDeletionDetails::fromArray($data['details']) : null,
181+
TaskType::IndexSwap => null !== $data['details'] ? IndexSwapDetails::fromArray($data['details']) : null,
182+
TaskType::DocumentAdditionOrUpdate => null !== $data['details'] ? DocumentAdditionOrUpdateDetails::fromArray($data['details']) : null,
183+
TaskType::DocumentDeletion => null !== $data['details'] ? DocumentDeletionDetails::fromArray($data['details']) : null,
184+
TaskType::DocumentEdition => null !== $data['details'] ? DocumentEditionDetails::fromArray($data['details']) : null,
185+
TaskType::SettingsUpdate => null !== $data['details'] ? SettingsUpdateDetails::fromArray($data['details']) : null,
186+
TaskType::DumpCreation => null !== $data['details'] ? DumpCreationDetails::fromArray($data['details']) : null,
187+
TaskType::TaskCancelation => null !== $data['details'] ? TaskCancelationDetails::fromArray($data['details']) : null,
188+
TaskType::TaskDeletion => null !== $data['details'] ? TaskDeletionDetails::fromArray($data['details']) : null,
189+
TaskType::SnapshotCreation => null,
190+
},
191+
null !== $data['error'] ? TaskError::fromArray($data['error']) : null,
181192
$data,
182193
);
183194
}

src/Contracts/TaskDetails.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts;
6+
7+
/**
8+
* @template T of array
9+
*/
10+
interface TaskDetails
11+
{
12+
/**
13+
* @param T $data
14+
*/
15+
public static function fromArray(array $data): self;
16+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* receivedDocuments: non-negative-int,
12+
* indexedDocuments: non-negative-int|null
13+
* }>
14+
*/
15+
final class DocumentAdditionOrUpdateDetails implements TaskDetails
16+
{
17+
/**
18+
* @param non-negative-int $receivedDocuments Number of documents received
19+
* @param non-negative-int|null $indexedDocuments Number of documents indexed. `null` while the task status is enqueued or processing.
20+
*/
21+
public function __construct(
22+
public readonly int $receivedDocuments,
23+
public readonly ?int $indexedDocuments,
24+
) {
25+
}
26+
27+
public static function fromArray(array $data): self
28+
{
29+
return new self(
30+
$data['receivedDocuments'],
31+
$data['indexedDocuments'] ?? null,
32+
);
33+
}
34+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* providedIds: non-negative-int,
12+
* originalFilter: string|null,
13+
* deletedDocuments: non-negative-int|null
14+
* }>
15+
*/
16+
final class DocumentDeletionDetails implements TaskDetails
17+
{
18+
/**
19+
* @param non-negative-int|null $providedIds Number of documents queued for deletion
20+
* @param string|null $originalFilter The filter used to delete documents. Null if it was not specified.
21+
* @param int|null $deletedDocuments Number of documents deleted. `null` while the task status is enqueued or processing.
22+
*/
23+
public function __construct(
24+
public readonly ?int $providedIds,
25+
public readonly ?string $originalFilter,
26+
public readonly ?int $deletedDocuments,
27+
) {
28+
}
29+
30+
public static function fromArray(array $data): self
31+
{
32+
return new self(
33+
$data['providedIds'],
34+
$data['originalFilter'] ?? null,
35+
$data['deletedDocuments'] ?? null,
36+
);
37+
}
38+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* context: array<non-empty-string, scalar|null>,
12+
* deletedDocuments: non-negative-int|null,
13+
* editedDocuments: non-negative-int|null,
14+
* function: string|null,
15+
* originalFilter: string|null
16+
* }>
17+
*/
18+
final class DocumentEditionDetails implements TaskDetails
19+
{
20+
/**
21+
* @param array<non-empty-string, scalar|null> $context
22+
*/
23+
public function __construct(
24+
public readonly array $context,
25+
public readonly ?int $deletedDocuments,
26+
public readonly ?int $editedDocuments,
27+
public readonly ?string $function,
28+
public readonly ?string $originalFilter,
29+
) {
30+
}
31+
32+
public static function fromArray(array $data): self
33+
{
34+
return new self(
35+
$data['context'],
36+
$data['deletedDocuments'],
37+
$data['deletedDocuments'],
38+
$data['function'],
39+
$data['originalFilter'],
40+
);
41+
}
42+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* dumpUid: non-empty-string|null
12+
* }>
13+
*/
14+
final class DumpCreationDetails implements TaskDetails
15+
{
16+
/**
17+
* @param non-empty-string|null $dumpUid
18+
*/
19+
public function __construct(
20+
public readonly ?string $dumpUid,
21+
) {
22+
}
23+
24+
public static function fromArray(array $data): self
25+
{
26+
return new self(
27+
$data['dumpUid'],
28+
);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* primaryKey: non-empty-string|null
12+
* }>
13+
*/
14+
final class IndexCreationDetails implements TaskDetails
15+
{
16+
/**
17+
* @param non-empty-string|null $primaryKey Value of the primaryKey field supplied during index creation. `null` if it was not specified.
18+
*/
19+
public function __construct(
20+
public readonly ?string $primaryKey,
21+
) {
22+
}
23+
24+
public static function fromArray(array $data): self
25+
{
26+
return new self(
27+
$data['primaryKey'],
28+
);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* deletedDocuments: non-negative-int|null
12+
* }>
13+
*/
14+
final class IndexDeletionDetails implements TaskDetails
15+
{
16+
/**
17+
* @param non-negative-int|null $deletedDocuments Number of deleted documents. This should equal the total number of documents in the deleted index. `null` while the task status is enqueued or processing.
18+
*/
19+
public function __construct(
20+
public readonly ?int $deletedDocuments,
21+
) {
22+
}
23+
24+
public static function fromArray(array $data): self
25+
{
26+
return new self(
27+
$data['deletedDocuments'],
28+
);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\TaskDetails;
6+
7+
use Meilisearch\Contracts\TaskDetails;
8+
9+
/**
10+
* @implements TaskDetails<array{
11+
* swaps: array<array{indexes: mixed}>
12+
* }>
13+
*/
14+
final class IndexSwapDetails implements TaskDetails
15+
{
16+
/**
17+
* @param array<array{indexes: mixed}> $swaps
18+
*/
19+
public function __construct(
20+
public readonly array $swaps,
21+
) {
22+
}
23+
24+
public static function fromArray(array $data): self
25+
{
26+
return new self(
27+
$data['swaps'],
28+
);
29+
}
30+
}

0 commit comments

Comments
 (0)