Skip to content

Commit b0dfd14

Browse files
committed
#28 feat: change get author to service
1 parent a02414e commit b0dfd14

File tree

2 files changed

+68
-5
lines changed

2 files changed

+68
-5
lines changed

src/Http/Actions/Author/AuthorGetListAction.php

+26-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
use Botble\Base\Http\Responses\BaseHttpResponse;
66
use CSlant\Blog\Api\Http\Resources\Author\ListAuthorResource;
77
use CSlant\Blog\Api\OpenApi\Schemas\Resources\Author\ListAuthorResourceSchema;
8+
use CSlant\Blog\Api\Services\AuthorService;
9+
use CSlant\Blog\Api\Services\PostService;
810
use CSlant\Blog\Core\Http\Actions\Action;
9-
use CSlant\Blog\Core\Models\User;
1011
use Illuminate\Http\JsonResponse;
1112
use Illuminate\Http\RedirectResponse;
1213
use Illuminate\Http\Request;
@@ -32,6 +33,13 @@
3233
*/
3334
class AuthorGetListAction extends Action
3435
{
36+
protected AuthorService $authorService;
37+
38+
public function __construct(AuthorService $authorService)
39+
{
40+
$this->authorService = $authorService;
41+
}
42+
3543
/**
3644
* @param Request $request
3745
*
@@ -50,6 +58,22 @@ class AuthorGetListAction extends Action
5058
summary: "Get all authors with pagination",
5159
tags: ["Author"],
5260
parameters: [
61+
new Parameter(
62+
name: 'order_by',
63+
description: 'Can order by field: id, posts_count, updated_at, ...',
64+
in: 'query',
65+
required: false,
66+
schema: new Schema(type: 'string', default: 'updated_at')
67+
),
68+
new Parameter(
69+
name: 'order',
70+
description: 'Order direction:
71+
ASC for ascending
72+
DESC for descending',
73+
in: 'query',
74+
required: false,
75+
schema: new Schema(type: 'string', default: 'ASC', enum: ['ASC', 'DESC'])
76+
),
5377
new Parameter(
5478
name: 'per_page',
5579
description: 'Number of items per page',
@@ -103,10 +127,7 @@ class AuthorGetListAction extends Action
103127
]
104128
public function __invoke(Request $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
105129
{
106-
$users = User::query()
107-
->withCount('posts')
108-
->orderBy('posts_count', 'DESC')
109-
->paginate($request->integer('per_page', 10));
130+
$users = $this->authorService->getAllAuthor($request);
110131

111132
return $this
112133
->httpResponse()

src/Services/AuthorService.php

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace CSlant\Blog\Api\Services;
4+
5+
use CSlant\Blog\Core\Http\Responses\Base\BaseHttpResponse;
6+
use CSlant\Blog\Core\Models\User;
7+
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Arr;
10+
11+
/**
12+
* Class AuthorService
13+
*
14+
* @package CSlant\Blog\Api\Services
15+
*
16+
* @method BaseHttpResponse httpResponse()
17+
*/
18+
class AuthorService
19+
{
20+
/**
21+
* Get all author.
22+
*
23+
* @param Request $request
24+
*
25+
* @return LengthAwarePaginator<User>
26+
*/
27+
public function getAllAuthor(Request $request): LengthAwarePaginator
28+
{
29+
$data = User::query()
30+
->withCount('posts'); //Eloquent method
31+
32+
$orderBy = (string) Arr::get($request->toArray(), 'order_by', 'posts_count');
33+
$order = (string) Arr::get($request->toArray(), 'order', 'desc');
34+
35+
$data = $data->orderBy($orderBy, $order);
36+
37+
/** @var LengthAwarePaginator<User> $result */
38+
$result = $data->paginate($request->integer('per_page', 10));
39+
40+
return $result;
41+
}
42+
}

0 commit comments

Comments
 (0)