Skip to content

Commit 858e6a0

Browse files
authored
Fix filter by status (#230)
1 parent 2a3d835 commit 858e6a0

22 files changed

+249
-56
lines changed

database/migrations/2024_10_13_214300_drop_schedule_status.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function up()
2525
*/
2626
public function down()
2727
{
28-
Schema::table('incidents', function (Blueprint $table) {
28+
Schema::table('schedules', function (Blueprint $table) {
2929
$table->unsignedInteger('status')->unsigned()->default(0);
3030
});
3131
}

database/seeders/DatabaseSeeder.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Cachet\Settings\AppSettings;
2020
use Cachet\Settings\CustomizationSettings;
2121
use Cachet\Settings\ThemeSettings;
22+
use Illuminate\Database\Eloquent\Model;
2223
use Illuminate\Database\Seeder;
2324
use Illuminate\Support\Arr;
2425
use Illuminate\Support\Facades\DB;
@@ -60,11 +61,13 @@ public function run(): void
6061
'completed_at' => now()->subHours(12),
6162
]);
6263

64+
/** @phpstan-ignore-next-line argument.type */
6365
tap(Schedule::create([
6466
'name' => 'Documentation Maintenance',
6567
'message' => 'We will be conducting maintenance on our documentation servers. You may experience degraded performance during this time.',
6668
'scheduled_at' => now()->addHours(24),
6769
'completed_at' => null,
70+
/** @phpstan-ignore-next-line argument.type */
6871
]), function (Schedule $schedule) use ($user) {
6972
$update = new Update([
7073
'message' => <<<'EOF'

src/Actions/Schedule/CreateSchedule.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Cachet\Data\Requests\Schedule\CreateScheduleRequestData;
66
use Cachet\Data\Requests\Schedule\ScheduleComponentRequestData;
77
use Cachet\Models\Schedule;
8+
use Illuminate\Database\Eloquent\Model;
89

910
class CreateSchedule
1011
{
@@ -13,6 +14,8 @@ class CreateSchedule
1314
*/
1415
public function handle(CreateScheduleRequestData $data): Schedule
1516
{
17+
18+
/** @phpstan-ignore-next-line argument.type */
1619
return tap(Schedule::create($data->except('components')->toArray()), function (Schedule $schedule) use ($data) {
1720
if (! $data->components) {
1821
return;

src/Data/Requests/Incident/UpdateIncidentRequestData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ public static function rules(ValidationContext $context): array
3535

3636
public function toArray(): array
3737
{
38-
return parent::toArray(); // TODO: Change the autogenerated stub
38+
return parent::toArray();
3939
}
4040
}

src/Filters/ScheduleStatusFilter.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
namespace Cachet\Filters;
4+
5+
use Cachet\Enums\ScheduleStatusEnum;
6+
use Cachet\QueryBuilders\ScheduleBuilder;
7+
use Illuminate\Database\Eloquent\Builder;
8+
use Spatie\QueryBuilder\Filters\Filter;
9+
10+
class ScheduleStatusFilter implements Filter
11+
{
12+
/**
13+
* @param ScheduleBuilder $query
14+
* @param $value
15+
* @param string $property
16+
* @return void
17+
*/
18+
public function __invoke(Builder $query, $value, string $property)
19+
{
20+
if (is_array($value)) {
21+
$this->multiValueFilter($value, $query);
22+
return ;
23+
}
24+
$enum = $this->toEnum($value);
25+
if (! $enum instanceof ScheduleStatusEnum) {
26+
return ;
27+
}
28+
$this->toQuery($enum, $query);
29+
}
30+
31+
public function multiValueFilter(array $value, ScheduleBuilder $query)
32+
{
33+
$query->where(function (ScheduleBuilder $query) use ($value) {
34+
foreach($value as $status) {
35+
$status = $this->toEnum($status);
36+
if (! $status instanceof ScheduleStatusEnum) {
37+
continue;
38+
}
39+
40+
$query->orWhere(function (ScheduleBuilder $query) use ($status) {
41+
$this->toQuery($status, $query);
42+
});
43+
}
44+
});
45+
}
46+
47+
48+
protected function toQuery(ScheduleStatusEnum $value, ScheduleBuilder $query)
49+
{
50+
match($value) {
51+
ScheduleStatusEnum::complete => $query->inThePast(),
52+
ScheduleStatusEnum::in_progress => $query->inProgress(),
53+
ScheduleStatusEnum::upcoming => $query->inTheFuture(),
54+
};
55+
}
56+
57+
protected function toEnum($value)
58+
{
59+
if( ! $value instanceof ScheduleStatusEnum && is_numeric($value)) {
60+
return ScheduleStatusEnum::tryFrom($value);
61+
}
62+
return $value;
63+
}
64+
65+
}

src/Http/Controllers/Api/ComponentController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public function store(CreateComponentRequestData $data, CreateComponent $createC
7777
*/
7878
public function show(Component $component)
7979
{
80+
8081
$componentQuery = QueryBuilder::for(Component::class)
8182
->allowedIncludes(self::ALLOWED_INCLUDES)
8283
->find($component->id);

src/Http/Controllers/Api/ComponentGroupController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public function store(CreateComponentGroupRequestData $data, CreateComponentGrou
5858
*/
5959
public function show(ComponentGroup $componentGroup)
6060
{
61+
6162
$componentQuery = QueryBuilder::for(ComponentGroup::class)
6263
->allowedIncludes(['components'])
6364
->find($componentGroup->id);

src/Http/Controllers/Api/IncidentController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public function store(CreateIncidentRequestData $data, CreateIncident $createInc
7878
*/
7979
public function show(Incident $incident)
8080
{
81+
8182
$incidentQuery = QueryBuilder::for(Incident::class)
8283
->allowedIncludes(self::ALLOWED_INCLUDES)
8384
->find($incident->id);

src/Http/Controllers/Api/MetricPointController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public function store(CreateMetricPointRequestData $data, Metric $metric, Create
6161
*/
6262
public function show(Metric $metric, MetricPoint $metricPoint)
6363
{
64+
6465
$metricPointQuery = QueryBuilder::for(MetricPoint::class)
6566
->allowedIncludes(['metric'])
6667
->find($metricPoint->id);

src/Http/Controllers/Api/ScheduleController.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
use Cachet\Concerns\GuardsApiAbilities;
99
use Cachet\Data\Requests\Schedule\CreateScheduleRequestData;
1010
use Cachet\Data\Requests\Schedule\UpdateScheduleRequestData;
11+
use Cachet\Enums\ScheduleStatusEnum;
12+
use Cachet\Filters\ScheduleStatusFilter;
1113
use Cachet\Http\Resources\Schedule as ScheduleResource;
1214
use Cachet\Models\Schedule;
1315
use Dedoc\Scramble\Attributes\Group;
1416
use Dedoc\Scramble\Attributes\QueryParameter;
15-
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
1617
use Illuminate\Http\Response;
17-
use Illuminate\Pagination\Paginator;
1818
use Illuminate\Routing\Controller;
1919
use Spatie\QueryBuilder\AllowedFilter;
2020
use Spatie\QueryBuilder\QueryBuilder;
@@ -30,14 +30,14 @@ class ScheduleController extends Controller
3030
* @response AnonymousResourceCollection<Paginator<ScheduleResource>>
3131
*/
3232
#[QueryParameter('filter[name]', 'Filter the resources by name.', example: 'api')]
33-
#[QueryParameter('filter[status]', 'Filter the resources by status.', example: 1)]
33+
#[QueryParameter('filter[status]', 'Filter the resources by status.', type: ScheduleStatusEnum::class)]
3434
#[QueryParameter('per_page', 'How many items to show per page.', type: 'int', default: 15, example: 20)]
3535
#[QueryParameter('page', 'Which page to show.', type: 'int', example: 2)]
3636
public function index()
3737
{
3838
$schedules = QueryBuilder::for(Schedule::class)
3939
->allowedIncludes(['components', 'updates', 'user'])
40-
->allowedFilters(['name', AllowedFilter::exact('status')])
40+
->allowedFilters(['name', AllowedFilter::custom('status', new ScheduleStatusFilter)])
4141
->allowedSorts(['name', 'id', 'scheduled_at', 'completed_at'])
4242
->simplePaginate(request('per_page', 15));
4343

0 commit comments

Comments
 (0)