Passed
Push — main ( 1fe025...7b47c2 )
by Tan
04:25 queued 01:55
created

PostController::findBySlug()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 33
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 23
c 1
b 0
f 0
dl 0
loc 33
rs 9.552
cc 3
nc 3
nop 1
1
<?php
2
3
namespace CSlant\Blog\Api\Http\Controllers;
4
5
use CSlant\Blog\Api\Enums\StatusEnum;
6
use CSlant\Blog\Api\Http\Resources\ListPostResource;
7
use CSlant\Blog\Api\Http\Resources\PostResource;
8
use CSlant\Blog\Core\Facades\Base\SlugHelper;
9
use CSlant\Blog\Core\Http\Controllers\Base\BasePostController;
10
use CSlant\Blog\Core\Http\Responses\Base\BaseHttpResponse;
11
use CSlant\Blog\Core\Models\Post;
12
use CSlant\Blog\Core\Models\Slug;
13
use CSlant\Blog\Core\Supports\Base\FilterPost;
14
use Illuminate\Http\JsonResponse;
15
use Illuminate\Http\RedirectResponse;
16
use Illuminate\Http\Request;
17
use Illuminate\Http\Resources\Json\JsonResource;
18
19
/**
20
 * Class PostController
21
 *
22
 * @package CSlant\Blog\Api\Http\Controllers
23
 *
24
 * @group Blog API
25
 *
26
 * @authenticated
27
 *
28
 * @method BaseHttpResponse httpResponse()
29
 * @method BaseHttpResponse setData(mixed $data)
30
 * @method BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse toApiResponse()
31
 */
32
class PostController extends BasePostController
33
{
34
    /**
35
     * @group Blog API
36
     *
37
     * @param  Request  $request
38
     *
39
     * @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
40
     */
41
    public function index(Request $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
42
    {
43
        $data = $this
44
            ->postRepository
45
            ->advancedGet([
46
                'with' => ['tags', 'categories', 'author', 'slugable'],
47
                'condition' => ['status' => StatusEnum::PUBLISHED->value],
48
                'paginate' => [
49
                    'per_page' => $request->integer('per_page', 10),
50
                    'current_paged' => $request->integer('page', 1),
51
                ],
52
            ]);
53
54
        return $this
55
            ->httpResponse()
56
            ->setData(ListPostResource::collection($data))
57
            ->toApiResponse();
58
    }
59
60
    /**
61
     * @param  string  $slug
62
     *
63
     * @group Blog
64
     * @queryParam slug Find by slug of post.
65
     * @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
66
     */
67
    public function findBySlug(string $slug): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
68
    {
69
        /** @var Slug $slug */
70
        $slug = SlugHelper::getSlug($slug, SlugHelper::getPrefix(Post::class));
71
72
        if (!$slug) {
0 ignored issues
show
introduced by
$slug is of type CSlant\Blog\Core\Models\Slug, thus it always evaluated to true.
Loading history...
73
            return $this
74
                ->httpResponse()
75
                ->setError()
76
                ->setCode(404)
77
                ->setMessage('Not found');
78
        }
79
80
        $post = Post::query()
81
            ->with(['tags', 'categories', 'author'])
82
            ->where([
83
                'id' => $slug->reference_id,
84
                'status' => StatusEnum::PUBLISHED,
85
            ])
86
            ->first();
87
88
        if (!$post) {
89
            return $this
90
                ->httpResponse()
91
                ->setError()
92
                ->setCode(404)
93
                ->setMessage('Not found');
94
        }
95
96
        return $this
97
            ->httpResponse()
98
            ->setData(new PostResource($post))
99
            ->toApiResponse();
100
    }
101
102
    public function getFilters(Request $request)
103
    {
104
        $filters = FilterPost::setFilters($request->input());
105
106
        $data = $this->postRepository->getFilters($filters);
107
108
        return $this
109
            ->httpResponse()
110
            ->setData(ListPostResource::collection($data))
111
            ->toApiResponse();
112
    }
113
}
114