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
40        Cache::forget('template_category_listlist');
41
42        return response()->json((bool) $result);
43    }
44
45    public function list(Request $request)
46    {
47        $cacheKey = 'template_category_list'.'list';
48
49        // use 604800s = 60 seconds * 60 minutes * 24 hours * 7 days = 1 week since the endpoint data doesn't change frequently.
50        $result = Cache::remember($cacheKey, 604800, function () {
51            return TemplateCategory::raw(function ($collection) {
52                return $collection->aggregate([
53                    ['$sort' => ['position' => 1]], // sort the result by the template category position
54                    ['$lookup' => [
55                        'from' => 'template_subcategory_lv1', // Perform a left outer join on the template_subcategory_lv1 collection
56                        'let' => ['id' => [ '$toString' => '$_id' ]], // Convert mongo id to string to allow for join comparison
57                        'pipeline' => [
58                            [
59                              '$match' => [
60                                '$expr' => [
61                                  '$eq' => ['$$id', '$parent_category_id'] // Join comparison
62                                ]
63                              ],
64                            ],
65                            ['$lookup' => [ // Repeat the last three comments for the template_subcategory_lv2
66                                'from' => 'template_subcategory_lv2',
67                                'let' => ['subId' => [ '$toString' => '$_id' ]],
68                                'pipeline' => [
69                                    [
70                                      '$match' => [
71                                        '$expr' => [
72                                          '$eq' => ['$$subId', '$parent_sub_category_id']
73                                        ]
74                                      ]
75                                    ],
76                                    [
77                                      '$addFields' => [ // Convert mongo object id to string
78                                          'id' => [ '$toString' => '$_id' ],
79                                          'updated_at' => [ // Convert dates from timestamps to carbon format
80                                            '$dateToString' => [
81                                                'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
82                                                'date' => '$updated_at'
83                                              ]
84                                          ],
85                                          'created_at' => [
86                                              '$dateToString' => [
87                                                  'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
88                                                  'date' => '$created_at'
89                                              ]
90                                          ]
91                                      ]
92                                    ]
93                                ],
94                                'as' => 'subcategory_lv2'
95                            ]],
96                            [
97                                '$addFields' => [
98                                    'id' => [ '$toString' => '$_id' ],
99                                    'updated_at' => [
100                                        '$dateToString' => [
101                                            'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
102                                            'date' => '$updated_at'
103                                          ]
104                                    ],
105                                    'created_at' => [
106                                        '$dateToString' => [
107                                            'format' => '%Y-%m-%dT%H:%M:%S.%LZ',
108                                            'date' => '$created_at'
109                                          ]
110                                    ]
111                                ]
112                            ]
113                        ],
114                        'as' => 'subcategory_lv1'
115                    ]]
116                ]);
117            });
118        });
119
120        return response()->json($result);
121    }
122
123    public function details($categoryId)
124    {
125        $searchArray = ['_id' => $categoryId];
126        $template = TemplateCategory::with('subcategory_lv1')->where($searchArray)->first();
127        $template['templates_count'] = $template->templates()->count();
128
129        return response()->json($template);
130    }
131
132    public function delete(TemplateCategoryFormRequest $request, $categoryId): JsonResponse
133    {
134        $data = $request->validated();
135
136        switch ($data['type']) {
137            case 'remove':
138                $obj = new Remove();
139                $obj->resolve($categoryId);
140                break;
141
142            case 'move':
143                $obj = new Move();
144                $obj->categoryId = $data['category_id'];
145                $obj->resolve($categoryId);
146                break;
147        }
148
149        $searchArray = ['_id' => $categoryId];
150        $result = TemplateCategory::where($searchArray)->delete();
151
152        Cache::forget('template_category_listlist');
153
154        return response()->json((bool) $result);
155    }
156
157    public function dependency($categoryId, $type)
158    {
159        $cacheKey = 'template_category_dependency_'.$categoryId.'_type_'.$type;
160        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($categoryId, $type) {
161            $result = [];
162            switch ($type) {
163                case 'remove':
164                    $obj = new Remove();
165                    $result = $obj->dependency($categoryId);
166                    break;
167
168                case 'move':
169                    $obj = new Move();
170                    $result = $obj->dependency($categoryId);
171                    break;
172            }
173
174            return $result;
175        });
176
177        return response()->json($result);
178    }
179}