Passed
Push — main ( 7b9865...f4b85e )
by Tan
02:38
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\Core\Facades\Base\SlugHelper;
9
use CSlant\Blog\Core\Http\Controllers\Base\BaseCategoryController;
10
use CSlant\Blog\Core\Models\Category;
11
use CSlant\Blog\Core\Models\Slug;
12
use Illuminate\Http\JsonResponse;
13
use Illuminate\Http\RedirectResponse;
14
use Illuminate\Http\Request;
15
use Illuminate\Http\Resources\Json\JsonResource;
16
use OpenApi\Attributes\Get;
17
use OpenApi\Attributes\Parameter;
18
use OpenApi\Attributes\Response;
19
use OpenApi\Attributes\Schema;
20
21
/**
22
 * Class CategoryController
23
 *
24
 * @package CSlant\Blog\Api\Http\Controllers
25
 *
26
 * @group Blog API
27
 *
28
 * @authenticated
29
 *
30
 * @method BaseHttpResponse httpResponse()
31
 * @method BaseHttpResponse setData(mixed $data)
32
 * @method BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse toApiResponse()
33
 */
34
class CategoryController extends BaseCategoryController
35
{
36
    #[
37
        Get(
38
            path: "/categories",
39
            operationId: "categoryGetAllWithFilter",
40
            description: "Get all categories with pagination (10 items per page by default, page 1 by default)
41
            
42
    This API will get records from the database and return them as a paginated list. 
43
    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.
44
            ",
45
            summary: "Get all categories with pagination",
46
            security: [['sanctum' => []]],
47
            tags: ["Category"],
48
            parameters: [
49
                new Parameter(
50
                    name: 'per_page',
51
                    description: 'Number of items per page',
52
                    in: 'query',
53
                    required: false,
54
                    schema: new Schema(type: 'integer', default: 10)
55
                ),
56
                new Parameter(
57
                    name: 'page',
58
                    description: 'Page number',
59
                    in: 'query',
60
                    required: false,
61
                    schema: new Schema(type: 'integer', default: 1)
62
                ),
63
            ],
64
            responses: [
65
                new Response(
66
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\BadRequestResponseSchema::class,
67
                    response: 400,
68
                ),
69
                new Response(
70
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\ErrorNotFoundResponseSchema::class,
71
                    response: 404,
72
                ),
73
                new Response(
74
                    ref: \CSlant\Blog\Api\OpenApi\Responses\Errors\InternalServerResponseSchema::class,
75
                    response: 500,
76
                ),
77
            ]
78
        )
79
    ]
80
    public function index(Request $request)
81
    {
82
        parent::index($request);
83
    }
84
85
    /**
86
     *  Get category by slug
87
     *
88
     * @group Blog
89
     * @queryParam slug Find by slug of category.
90
     *
91
     * @param  string  $slug
92
     *
93
     * @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
94
     */
95
    public function findBySlug(string $slug): JsonResponse|RedirectResponse|JsonResource|BaseHttpResponse
96
    {
97
        /** @var Slug $slug */
98
        $slug = SlugHelper::getSlug($slug, SlugHelper::getPrefix(Category::getBaseModel()));
99
100
        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...
101
            return $this
102
                ->httpResponse()
103
                ->setError()
104
                ->setCode(404)
105
                ->setMessage('Not found');
106
        }
107
108
        $category = Category::query()
109
            ->with(['slugable'])
110
            ->where([
111
                'id' => $slug->reference_id,
112
                'status' => StatusEnum::PUBLISHED,
113
            ])
114
            ->first();
115
116
        if (!$category) {
117
            return $this
118
                ->httpResponse()
119
                ->setError()
120
                ->setCode(404)
121
                ->setMessage('Not found');
122
        }
123
124
        return $this
125
            ->httpResponse()
126
            ->setData(ListCategoryResource::make($category))
127
            ->toApiResponse();
128
    }
129
}
130