Passed
Push — main ( 5bb564...f18763 )
by Tan
09:32 queued 07:09
created

PostController   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 4
eloc 36
c 2
b 0
f 0
dl 0
loc 68
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A index() 0 17 1
A findBySlug() 0 33 3
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 Illuminate\Http\JsonResponse;
14
use Illuminate\Http\RedirectResponse;
15
use Illuminate\Http\Request;
16
use Illuminate\Http\Resources\Json\JsonResource;
17
18
/**
19
 * Class PostController
20
 *
21
 * @package CSlant\Blog\Api\Http\Controllers
22
 *
23
 * @group Blog API
24
 *
25
 * @authenticated
26
 *
27
 * @method BaseHttpResponse httpResponse()
28
 * @method BaseHttpResponse setData(mixed $data)
29
 * @method BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse toApiResponse()
30
 */
31
class PostController extends BasePostController
32
{
33
    /**
34
     * @group Blog API
35
     *
36
     * @param  Request  $request
37
     *
38
     * @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
39
     */
40
    public function index(Request $request): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
41
    {
42
        $data = $this
43
            ->postRepository
44
            ->advancedGet([
45
                'with' => ['tags', 'categories', 'author', 'slugable'],
46
                'condition' => ['status' => StatusEnum::PUBLISHED->value],
47
                'paginate' => [
48
                    'per_page' => $request->integer('per_page', 10),
49
                    'current_paged' => $request->integer('page', 1),
50
                ],
51
            ]);
52
53
        return $this
54
            ->httpResponse()
55
            ->setData(ListPostResource::collection($data))
56
            ->toApiResponse();
57
    }
58
59
    /**
60
     * @param  string  $slug
61
     *
62
     * @group Blog
63
     * @queryParam slug Find by slug of post.
64
     * @return BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
65
     */
66
    public function findBySlug(string $slug): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
67
    {
68
        /** @var Slug $slug */
69
        $slug = SlugHelper::getSlug($slug, SlugHelper::getPrefix(Post::class));
70
71
        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...
72
            return $this
73
                ->httpResponse()
74
                ->setError()
75
                ->setCode(404)
76
                ->setMessage('Not found');
77
        }
78
79
        $post = Post::query()
80
            ->with(['tags', 'categories', 'author'])
81
            ->where([
82
                'id' => $slug->reference_id,
83
                'status' => StatusEnum::PUBLISHED,
84
            ])
85
            ->first();
86
87
        if (!$post) {
88
            return $this
89
                ->httpResponse()
90
                ->setError()
91
                ->setCode(404)
92
                ->setMessage('Not found');
93
        }
94
95
        return $this
96
            ->httpResponse()
97
            ->setData(new PostResource($post))
98
            ->toApiResponse();
99
    }
100
}
101