Passed
Push — main ( f4b85e...288832 )
by Tan
02:54
created

CategoryController::index()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 47
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 47
rs 9.408
cc 1
nc 1
nop 1
1
<?php
2
3
namespace CSlant\Blog\Api\Http\Controllers;
4
5
use Botble\Base\Http\Responses\BaseHttpResponse;
0 ignored issues
show
Bug introduced by
The type Botble\Base\Http\Responses\BaseHttpResponse was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
6
use CSlant\Blog\Api\Enums\StatusEnum;
7
use CSlant\Blog\Api\Http\Resources\ListCategoryResource;
8
use CSlant\Blog\Api\OpenApi\Schemas\Resources\Category\CategoryModelResourceSchema;
9
use CSlant\Blog\Core\Facades\Base\SlugHelper;
10
use CSlant\Blog\Core\Http\Controllers\Base\BaseCategoryController;
11
use CSlant\Blog\Core\Models\Category;
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
use OpenApi\Attributes\Get;
18
use OpenApi\Attributes\JsonContent;
19
use OpenApi\Attributes\Parameter;
20
use OpenApi\Attributes\Property;
21
use OpenApi\Attributes\Response;
22
use OpenApi\Attributes\Schema;
23
24
/**
25
 * Class CategoryController
26
 *
27
 * @package CSlant\Blog\Api\Http\Controllers
28
 *
29
 * @group Blog API
30
 *
31
 * @authenticated
32
 *
33
 * @method BaseHttpResponse httpResponse()
34
 * @method BaseHttpResponse setData(mixed $data)
35
 * @method BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse toApiResponse()
36
 */
37
class CategoryController extends BaseCategoryController
38
{
39
    #[
40
        Get(
41
            path: "/categories",
42
            operationId: "categoryGetAllWithFilter",
43
            description: "Get all categories with pagination (10 items per page by default, page 1 by default)
44
            
45
    This API will get records from the database and return them as a paginated list. 
46
    The default number of items per page is 10 and the default page number is 1. You can change these values by passing the `per_page` and `page` query parameters.
47
            ",
48
            summary: "Get all categories with pagination",
49
            security: [['sanctum' => []]],
50
            tags: ["Category"],
51
            parameters: [
52
                new Parameter(
53
                    name: 'per_page',
54
                    description: 'Number of items per page',
55
                    in: 'query',
56
                    required: false,
57
                    schema: new Schema(type: 'integer', default: 10)
58
                ),
59
                new Parameter(
60
                    name: 'page',
61
                    description: 'Page number',
62
                    in: 'query',
63
                    required: false,
64
                    schema: new Schema(type: 'integer', default: 1)
65
                ),
66
            ],
67
            responses: [
68
                new Response(
69
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\BadRequestResponseSchema::class,
70
                    response: 400,
71
                ),
72
                new Response(
73
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\ErrorNotFoundResponseSchema::class,
74
                    response: 404,
75
                ),
76
                new Response(
77
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\InternalServerResponseSchema::class,
78
                    response: 500,
79
                ),
80
            ]
81
        )
82
    ]
83
    public function index(Request $request)
84
    {
85
        parent::index($request);
86
    }
87
88
    /**
89
     *  Get category by slug
90
     *
91
     * @group Blog
92
     * @queryParam slug Find by slug of category.
93
     *
94
     * @param  string  $slug
95
     *
96
     * @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
97
     */
98
    #[
99
        Get(
100
            path: "/categories/{slug}",
101
            operationId: "categoryFilterBySlug",
102
            description: "Get the category by slug
103
            
104
    This API will get records from the database and return the category by slug.
105
            ",
106
            summary: "Get category by slug",
107
            security: [['sanctum' => []]],
108
            tags: ["Category"],
109
            parameters: [
110
                new Parameter(
111
                    name: 'slug',
112
                    description: 'Category slug',
113
                    in: 'path',
114
                    required: true,
115
                    schema: new Schema(type: 'string', default: 'php')
116
                ),
117
            ],
118
            responses: [
119
                new Response(
120
                    response: 200,
121
                    description: "Get category successfully",
122
                    content: new JsonContent(
123
                        properties: [
124
                            new Property(
125
                                property: 'error',
126
                                description: 'Error status',
127
                                type: 'boolean',
128
                                default: false
129
                            ),
130
                            new Property(
131
                                property: 'data',
132
                                description: 'Data',
133
                                properties: [
134
                                    new Property(
135
                                        property: 'category',
136
                                        ref: CategoryModelResourceSchema::class,
137
                                        description: 'Category',
138
                                        type: 'object'
139
                                    ),
140
                                ],
141
                                type: 'object'
142
                            ),
143
                        ]
144
                    )
145
                ),
146
                new Response(
147
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\BadRequestResponseSchema::class,
148
                    response: 400,
149
                ),
150
                new Response(
151
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\ErrorNotFoundResponseSchema::class,
152
                    response: 404,
153
                ),
154
                new Response(
155
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\InternalServerResponseSchema::class,
156
                    response: 500,
157
                ),
158
            ]
159
        )
160
    ]
161
    public function findBySlug(string $slug): JsonResponse|RedirectResponse|JsonResource|BaseHttpResponse
162
    {
163
        /** @var Slug $slug */
164
        $slug = SlugHelper::getSlug($slug, SlugHelper::getPrefix(Category::getBaseModel()));
165
166
        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...
167
            return $this
168
                ->httpResponse()
169
                ->setError()
170
                ->setCode(404)
171
                ->setMessage('Not found');
172
        }
173
174
        $category = Category::query()
175
            ->with(['slugable'])
176
            ->where([
177
                'id' => $slug->reference_id,
178
                'status' => StatusEnum::PUBLISHED,
179
            ])
180
            ->first();
181
182
        if (!$category) {
183
            return $this
184
                ->httpResponse()
185
                ->setError()
186
                ->setCode(404)
187
                ->setMessage('Not found');
188
        }
189
190
        return $this
191
            ->httpResponse()
192
            ->setData(ListCategoryResource::make($category))
193
            ->toApiResponse();
194
    }
195
}
196