Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/add filter for author action #77

Merged
merged 12 commits into from
Apr 3, 2025
20 changes: 16 additions & 4 deletions src/Http/Actions/Author/AuthorGetListAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
namespace CSlant\Blog\Api\Http\Actions\Author;

use Botble\Base\Http\Responses\BaseHttpResponse;
use CSlant\Blog\Api\Http\Requests\Author\AuthorGetListRequest;
use CSlant\Blog\Api\Http\Resources\Author\ListAuthorResource;
use CSlant\Blog\Api\OpenApi\Schemas\Resources\Author\ListAuthorResourceSchema;
use CSlant\Blog\Api\Services\AuthorService;
use CSlant\Blog\Api\Supports\FilterAuthor;
use CSlant\Blog\Core\Http\Actions\Action;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use OpenApi\Attributes\Get;
use OpenApi\Attributes\JsonContent;
Expand Down Expand Up @@ -40,7 +41,7 @@ public function __construct(AuthorService $authorService)
}

/**
* @param Request $request
* @param AuthorGetListRequest $request
*
* @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
* @group Blog
Expand All @@ -57,6 +58,15 @@ public function __construct(AuthorService $authorService)
summary: "Get all authors with pagination",
tags: ["Author"],
parameters: [
new Parameter(
name: 'is_super',
description: 'is_super direction:
0 for admin
1 for super admin',
in: 'query',
required: false,
schema: new Schema(type: 'integer', default: 0, enum: [0, 1])
),
new Parameter(
name: 'order_by',
description: 'Can order by field: id, posts_count, updated_at, ...',
Expand Down Expand Up @@ -124,9 +134,11 @@ public function __construct(AuthorService $authorService)
]
)
]
public function __invoke(Request $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
public function __invoke(AuthorGetListRequest $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
{
$users = $this->authorService->getAllAuthor($request);
$filters = FilterAuthor::setFilters((array) $request->validated());

$users = $this->authorService->getAllAuthor($filters);

return $this
->httpResponse()
Expand Down
34 changes: 34 additions & 0 deletions src/Http/Requests/Author/AuthorGetListRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace CSlant\Blog\Api\Http\Requests\Author;

use CSlant\Blog\Api\Http\Requests\JsonFormRequest;

class AuthorGetListRequest extends JsonFormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules(): array
{
return [
'is_super' => 'nullable|digits_between:0,1',
'page' => 'nullable|numeric|between:1,100',
'order_by' => 'nullable|string',
'order' => 'nullable|string|in:asc,desc,ASC,DESC',
'per_page' => 'nullable|numeric',
];
}
}
24 changes: 24 additions & 0 deletions src/Http/Requests/JsonFormRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace CSlant\Blog\Api\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\Response;

class JsonFormRequest extends FormRequest
{
/**
* @param Validator $validator
*/
protected function failedValidation(Validator $validator)
{
$response = response()->json([
'status' => Response::HTTP_BAD_REQUEST,
'errors' => $validator->errors(),
], Response::HTTP_BAD_REQUEST);

throw new HttpResponseException($response);
}
}
19 changes: 11 additions & 8 deletions src/Services/AuthorService.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use CSlant\Blog\Core\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

/**
Expand All @@ -21,20 +20,24 @@ class AuthorService
/**
* Get all author.
*
* @param Request $request
* @param array<string, mixed> $filters
*
* @return LengthAwarePaginator<Model>
*/
public function getAllAuthor(Request $request): LengthAwarePaginator
public function getAllAuthor(array $filters): LengthAwarePaginator
{
$data = User::query()
->withCount('posts'); //Eloquent method
/** @var User $data */
$data = User::query()->withCount('posts');

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

$orderBy = (string) Arr::get($filters, 'order_by', 'posts_count');
$order = (string) Arr::get($filters, 'order', 'desc');

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

return $data->paginate($request->integer('per_page', 10));
return $data->paginate((int) $filters['per_page']);
}
}
22 changes: 22 additions & 0 deletions src/Supports/FilterAuthor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace CSlant\Blog\Api\Supports;

class FilterAuthor
{
/**
* @param array<string, mixed> $request
*
* @return array<string, mixed>
*/
public static function setFilters(array $request): array
{
return [
'page' => $request['page'] ?? 1,
'per_page' => $request['per_page'] ?? 10,
'is_super' => $request['is_super'] ?? 0,
'order' => $request['order'] ?? 'desc',
'order_by' => $request['order_by'] ?? 'posts_count',
];
}
}