Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 116
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
TemplateCategoryController
0.00% covered (danger)
0.00%
0 / 116
0.00% covered (danger)
0.00%
0 / 6
110
0.00% covered (danger)
0.00%
0 / 1
 create
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 list
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 1
2
 details
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 delete
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
12
 dependency
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Http\Controllers\v1;
4
5use App\Http\Controllers\Controller;
6use App\Http\Helpers\ChangeManagement\TemplateCategory\Move;
7use App\Http\Helpers\ChangeManagement\TemplateCategory\Remove;
8use App\Http\Models\TemplateCategory;
9use App\Http\Requests\TemplateCategoryFormRequest;
10use Illuminate\Http\JsonResponse;
11use Illuminate\Http\Request;
12use Illuminate\Support\Facades\Cache;
13use Illuminate\Support\Facades\Config;
14
15class TemplateCategoryController extends Controller
16{
17    public function create(TemplateCategoryFormRequest $request): JsonResponse
18    {
19        $data = $request->validated();
20
21        $category_slug = str_replace(' ', '', $request->name);
22        $data['slug'] = strtolower($category_slug);
23
24        $result = TemplateCategory::create($data);
25
26        return response()->json($result['_id']);
27    }
28
29    public function update(TemplateCategoryFormRequest $request, $categoryId): JsonResponse
30    {
31        $data = $request->validated();
32        $searchArray = ['_id' => $categoryId];
33
34        $category_slug = str_replace(' ', '', $request->name);
35        $data['slug'] = strtolower($category_slug);
36
37        $result = TemplateCategory::where($searchArray)->update($data);
38
39        Cache::forget('template_category_listlist');
40
41        return response()->json((bool) $result);
42    }
43
44    public function list(Request $request)
45    {
46        $cacheKey = 'template_category_list'.'list';
47
48        // use 604800s = 60 seconds * 60 minutes * 24 hours * 7 days = 1 week since the endpoint data doesn't change frequently.
49        $result = Cache::remember($cacheKey, 604800, function () {
50            return TemplateCategory::raw(function ($collection) {
51                return $collection->aggregate([
52                    ['$sort' => ['position' => 1]], // sort the result by the template category position
53                    ['$lookup' => [
54                        'from' => 'template_subcategory_lv1', // Perform a left outer join on the template_subcategory_lv1 collection
55                        'let' => ['id' => ['$toString' => '$_id']], // Convert mongo id to string to allow for join comparison
56                        'pipeline' => [
57                            [
58                                '$match' => [
59                                    '$expr' => [
60                                        '$eq' => ['$$id', '$parent_category_id'], // Join comparison
61                                    ],
62                                ],
63                            ],
64                            ['$lookup' => [ // Repeat the last three comments for the template_subcategory_lv2
65                                'from' => 'template_subcategory_lv2',
66                                'let' => ['subId' => ['$toString' => '$_id']],
67                                'pipeline' => [
68                                    [
69                                        '$match' => [
70                                            '$expr' => [
71                                                '$eq' => ['$$subId', '$parent_sub_category_id'],
72                                            ],
73                                        ],
74                                    ],
75                                    [
76                                        '$addFields' => [ // Convert mongo object id to string
77                                            'id' => ['$toString' => '$_id'],
78                                            'updated_at' => [ // Convert dates from timestamps to carbon format
79                                                '$dateToString' => [
80                                                    'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
81                                                    'date' => '$updated_at',
82                                                ],
83                                            ],
84                                            'created_at' => [
85                                                '$dateToString' => [
86                                                    'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
87                                                    'date' => '$created_at',
88                                                ],
89                                            ],
90                                        ],
91                                    ],
92                                ],
93                                'as' => 'subcategory_lv2',
94                            ]],
95                            [
96                                '$addFields' => [
97                                    'id' => ['$toString' => '$_id'],
98                                    'updated_at' => [
99                                        '$dateToString' => [
100                                            'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
101                                            'date' => '$updated_at',
102                                        ],
103                                    ],
104                                    'created_at' => [
105                                        '$dateToString' => [
106                                            'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
107                                            'date' => '$created_at',
108                                        ],
109                                    ],
110                                ],
111                            ],
112                        ],
113                        'as' => 'subcategory_lv1',
114                    ]],
115                ]);
116            });
117        });
118
119        return response()->json($result);
120    }
121
122    public function details($categoryId)
123    {
124        $searchArray = ['_id' => $categoryId];
125        $template = TemplateCategory::with('subcategory_lv1')->where($searchArray)->first();
126        $template['templates_count'] = $template->templates()->count();
127
128        return response()->json($template);
129    }
130
131    public function delete(TemplateCategoryFormRequest $request, $categoryId): JsonResponse
132    {
133        $data = $request->validated();
134
135        switch ($data['type']) {
136            case 'remove':
137                $obj = new Remove;
138                $obj->resolve($categoryId);
139                break;
140
141            case 'move':
142                $obj = new Move;
143                $obj->categoryId = $data['category_id'];
144                $obj->resolve($categoryId);
145                break;
146        }
147
148        $searchArray = ['_id' => $categoryId];
149        $result = TemplateCategory::where($searchArray)->delete();
150
151        Cache::forget('template_category_listlist');
152
153        return response()->json((bool) $result);
154    }
155
156    public function dependency($categoryId, $type)
157    {
158        $cacheKey = 'template_category_dependency_'.$categoryId.'_type_'.$type;
159        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($categoryId, $type) {
160            $result = [];
161            switch ($type) {
162                case 'remove':
163                    $obj = new Remove;
164                    $result = $obj->dependency($categoryId);
165                    break;
166
167                case 'move':
168                    $obj = new Move;
169                    $result = $obj->dependency($categoryId);
170                    break;
171            }
172
173            return $result;
174        });
175
176        return response()->json($result);
177    }
178}