Skip to content

Commit bd5ac63

Browse files
authored
Merge pull request #77 from cslant/feature/add-filter-for-author-action
Feature/add filter for author action
2 parents e3aa23c + 39af77a commit bd5ac63

File tree

5 files changed

+107
-12
lines changed

5 files changed

+107
-12
lines changed

src/Http/Actions/Author/AuthorGetListAction.php

+16-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
namespace CSlant\Blog\Api\Http\Actions\Author;
44

55
use Botble\Base\Http\Responses\BaseHttpResponse;
6+
use CSlant\Blog\Api\Http\Requests\Author\AuthorGetListRequest;
67
use CSlant\Blog\Api\Http\Resources\Author\ListAuthorResource;
78
use CSlant\Blog\Api\OpenApi\Schemas\Resources\Author\ListAuthorResourceSchema;
89
use CSlant\Blog\Api\Services\AuthorService;
10+
use CSlant\Blog\Api\Supports\FilterAuthor;
911
use CSlant\Blog\Core\Http\Actions\Action;
1012
use Illuminate\Http\JsonResponse;
1113
use Illuminate\Http\RedirectResponse;
12-
use Illuminate\Http\Request;
1314
use Illuminate\Http\Resources\Json\JsonResource;
1415
use OpenApi\Attributes\Get;
1516
use OpenApi\Attributes\JsonContent;
@@ -40,7 +41,7 @@ public function __construct(AuthorService $authorService)
4041
}
4142

4243
/**
43-
* @param Request $request
44+
* @param AuthorGetListRequest $request
4445
*
4546
* @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
4647
* @group Blog
@@ -57,6 +58,15 @@ public function __construct(AuthorService $authorService)
5758
summary: "Get all authors with pagination",
5859
tags: ["Author"],
5960
parameters: [
61+
new Parameter(
62+
name: 'is_super',
63+
description: 'is_super direction:
64+
0 for admin
65+
1 for super admin',
66+
in: 'query',
67+
required: false,
68+
schema: new Schema(type: 'integer', default: 0, enum: [0, 1])
69+
),
6070
new Parameter(
6171
name: 'order_by',
6272
description: 'Can order by field: id, posts_count, updated_at, ...',
@@ -124,9 +134,11 @@ public function __construct(AuthorService $authorService)
124134
]
125135
)
126136
]
127-
public function __invoke(Request $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
137+
public function __invoke(AuthorGetListRequest $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
128138
{
129-
$users = $this->authorService->getAllAuthor($request);
139+
$filters = FilterAuthor::setFilters((array) $request->validated());
140+
141+
$users = $this->authorService->getAllAuthor($filters);
130142

131143
return $this
132144
->httpResponse()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace CSlant\Blog\Api\Http\Requests\Author;
4+
5+
use CSlant\Blog\Api\Http\Requests\JsonFormRequest;
6+
7+
class AuthorGetListRequest extends JsonFormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize(): bool
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array<string, mixed>
23+
*/
24+
public function rules(): array
25+
{
26+
return [
27+
'is_super' => 'nullable|digits_between:0,1',
28+
'page' => 'nullable|numeric|between:1,100',
29+
'order_by' => 'nullable|string',
30+
'order' => 'nullable|string|in:asc,desc,ASC,DESC',
31+
'per_page' => 'nullable|numeric',
32+
];
33+
}
34+
}

src/Http/Requests/JsonFormRequest.php

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace CSlant\Blog\Api\Http\Requests;
4+
5+
use Illuminate\Contracts\Validation\Validator;
6+
use Illuminate\Foundation\Http\FormRequest;
7+
use Illuminate\Http\Exceptions\HttpResponseException;
8+
use Illuminate\Http\Response;
9+
10+
class JsonFormRequest extends FormRequest
11+
{
12+
/**
13+
* @param Validator $validator
14+
*/
15+
protected function failedValidation(Validator $validator)
16+
{
17+
$response = response()->json([
18+
'status' => Response::HTTP_BAD_REQUEST,
19+
'errors' => $validator->errors(),
20+
], Response::HTTP_BAD_REQUEST);
21+
22+
throw new HttpResponseException($response);
23+
}
24+
}

src/Services/AuthorService.php

+11-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use CSlant\Blog\Core\Models\User;
77
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
88
use Illuminate\Database\Eloquent\Model;
9-
use Illuminate\Http\Request;
109
use Illuminate\Support\Arr;
1110

1211
/**
@@ -21,20 +20,24 @@ class AuthorService
2120
/**
2221
* Get all author.
2322
*
24-
* @param Request $request
23+
* @param array<string, mixed> $filters
2524
*
2625
* @return LengthAwarePaginator<Model>
2726
*/
28-
public function getAllAuthor(Request $request): LengthAwarePaginator
27+
public function getAllAuthor(array $filters): LengthAwarePaginator
2928
{
30-
$data = User::query()
31-
->withCount('posts'); //Eloquent method
29+
/** @var User $data */
30+
$data = User::query()->withCount('posts');
3231

33-
$orderBy = (string) Arr::get($request->toArray(), 'order_by', 'posts_count');
34-
$order = (string) Arr::get($request->toArray(), 'order', 'desc');
32+
$data = $data->when($filters['is_super'], function ($query) use ($filters) {
33+
return $query->where('super_user', (int) $filters['is_super']);
34+
});
35+
36+
$orderBy = (string) Arr::get($filters, 'order_by', 'posts_count');
37+
$order = (string) Arr::get($filters, 'order', 'desc');
3538

3639
$data = $data->orderBy($orderBy, $order);
3740

38-
return $data->paginate($request->integer('per_page', 10));
41+
return $data->paginate((int) $filters['per_page']);
3942
}
4043
}

src/Supports/FilterAuthor.php

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace CSlant\Blog\Api\Supports;
4+
5+
class FilterAuthor
6+
{
7+
/**
8+
* @param array<string, mixed> $request
9+
*
10+
* @return array<string, mixed>
11+
*/
12+
public static function setFilters(array $request): array
13+
{
14+
return [
15+
'page' => $request['page'] ?? 1,
16+
'per_page' => $request['per_page'] ?? 10,
17+
'is_super' => $request['is_super'] ?? 0,
18+
'order' => $request['order'] ?? 'desc',
19+
'order_by' => $request['order_by'] ?? 'posts_count',
20+
];
21+
}
22+
}

0 commit comments

Comments
 (0)