Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 122
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
TemplateController
0.00% covered (danger)
0.00%
0 / 122
0.00% covered (danger)
0.00%
0 / 9
930
0.00% covered (danger)
0.00%
0 / 1
 create
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
6
 list
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
30
 details
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 getTemplateBySlug
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 delete
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getAction
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 listTemplatesByName
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 1
210
 generateTemplateUniqueSlug
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Http\Controllers\v1;
4
5use App\Http\Controllers\Controller;
6use App\Http\Helpers\QueryBuilder\RomeoQueryBuilder;
7use App\Http\Models\Auth\AdminUser;
8use App\Http\Models\Template;
9use App\Http\Models\TemplateCategory;
10use App\Http\Models\TemplateSubcategoryLv1;
11use App\Http\Models\TemplateSubcategoryLv2;
12use App\Http\Requests\TemplateFormRequest;
13use Illuminate\Http\JsonResponse;
14use Illuminate\Http\Request;
15use Illuminate\Support\Facades\Cache;
16use Illuminate\Support\Facades\Config;
17use Illuminate\Support\Str;
18
19class TemplateController extends Controller
20{
21    public function create(TemplateFormRequest $request): JsonResponse
22    {
23        $data = $request->validated();
24        $data['user_id'] = $request->user()->getKey();
25        $data['version'] = 1;
26        $data['unique_slug'] = $this->generateTemplateUniqueSlug($data["shortcut"], Template::class, 'unique_slug');
27        $result = Template::create($data);
28
29        Cache::forget('template_category_listlist');
30
31        return response()->json($result['_id']);
32    }
33
34    public function update(TemplateFormRequest $request, $templateId): JsonResponse
35    {
36        $data = $request->validated();
37        $searchArray = ['_id' => $templateId];
38
39        $template = Template::where($searchArray)->first();
40        $data['version'] = $template->version + 1;
41        if (!isset($data['unique_slug'])) {
42            $data['unique_slug'] = $this->generateTemplateUniqueSlug($data["shortcut"], Template::class, 'unique_slug');
43        }
44        $result = Template::where($searchArray)->update($data);
45
46        Cache::forget('template_category_listlist');
47
48        return response()->json((bool) $result);
49    }
50
51    public function list(Request $request)
52    {
53        $userId = $request->user()->getKey();
54        $cacheKey = 'template_list_' . $userId . '_query_' . $request->getQueryString();
55
56        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($request) {
57            $queryBuilder = new RomeoQueryBuilder(new Template, $request);
58            if (! ($request->user() instanceof AdminUser)) {
59                $queryBuilder = $queryBuilder->withRelation(['category', 'user_shortcut']);
60            } else {
61                $queryBuilder = $queryBuilder->withRelation('category');
62            }
63            $result = $queryBuilder->build()->get();
64
65            if (count($result) == 0) {
66                $subcategory_lv1_id = explode('&limit=', $request->getQueryString());
67                $subcategory_lv1_id = explode('category_id=', $subcategory_lv1_id[0]);
68                $result = Template::where('subcategory_lv1_id', @$subcategory_lv1_id[1])->with(['category', 'user_shortcut'])->get();
69            }
70
71            foreach ($result as $key => $item) {
72                $result[$key]['category_name'] = $item->category->name;
73                $result[$key]['category_slug'] = $item->category->slug;
74                unset($result[$key]['category']);
75                if (! ($request->user() instanceof AdminUser)) {
76                    $result[$key]['action'] = $this->getAction($item);
77                    unset($result[$key]['user_shortcut']);
78                }
79            }
80
81            return $result;
82        });
83
84        return response()->json($result);
85    }
86
87    public function details(Request $request, $templateId)
88    {
89        $userId = $request->user()->getKey();
90        $cacheKey = 'template_details_' . $userId . '_id_' . $templateId;
91        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($templateId) {
92            $searchArray = ['_id' => $templateId];
93            $template = Template::with('category')->where($searchArray)->first();
94            $template['category_name'] = $template->category->name;
95            $template['category_slug'] = $template->category->slug;
96            unset($template['category']);
97
98            return $template;
99        });
100
101        return response()->json($result);
102    }
103
104    public function getTemplateBySlug(Request $request, $slug)
105    {
106        $userId = $request->user()->getKey();
107        $cacheKey = 'template_details_' . $userId . '_id_' . $slug;
108        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($slug) {
109            $searchArray = ['unique_slug' => $slug];
110            $template = Template::with('category')->where($searchArray)->first();
111            $template['category_name'] = $template->category->name;
112            $template['category_slug'] = $template->category->slug;
113            unset($template['category']);
114
115            return $template;
116        });
117
118        return response()->json($result);
119    }
120
121    public function delete($templateId): JsonResponse
122    {
123        $searchArray = ['_id' => $templateId];
124        $result = Template::where($searchArray)->delete();
125
126        Cache::forget('template_category_listlist');
127
128        return response()->json((bool) $result);
129    }
130
131    public function getAction($template)
132    {
133        $shortcut = $template['user_shortcut'];
134
135        if (! $shortcut) {
136            return 'add';
137        }
138
139        if ($shortcut->template_version !== $template->version) {
140            return 'update';
141        }
142
143        return 'reset';
144    }
145
146    public function listTemplatesByName(Request $request)
147    {
148        $skip = filled($request->query('skip')) ? $request->query('skip') : 0;
149        $take = filled($request->query('limit')) ? $request->query('limit') : 'all';
150
151        $category_id = $sub_category_id = $sub_sub_category_id = '';
152        $category_name = filled($request->query('category_name')) ? $request->query('category_name') : '';
153        $sub_category_name = filled($request->query('sub_category_name')) ? $request->query('sub_category_name') : '';
154        $sub_sub_category_name = filled($request->query('sub_sub_category_name')) ? $request->query('sub_sub_category_name') : '';
155
156        if ($category_name != '') {
157            $categoryWhere = ['slug' => $category_name];
158            $category_id = TemplateCategory::where($categoryWhere)->pluck('id')->first();
159        }
160
161        if ($sub_category_name != '') {
162            $subCategoryWhere = ['slug' => $sub_category_name];
163            $sub_category_id = TemplateSubcategoryLv1::where($subCategoryWhere)->pluck('id')->first();
164        }
165
166        if (filled($sub_sub_category_name)) {
167            $sub_sub_category_id = TemplateSubcategoryLv2::firstWhere('slug', $sub_sub_category_name)?->id;
168        }
169
170        // TODO MA find an efficient way to do bust this cache
171        $userId = $request->user()->getKey();
172        $cacheKey = 'template_list_by_name_' . $userId . '_' . $category_id . '_' . $sub_category_id . '_' . $sub_sub_category_id . '_' . $skip . '_' . $take;
173        $result = Cache::remember($cacheKey, Config::get('cache.expiry'), function () use ($request, $category_id, $sub_category_id, $sub_sub_category_id, $skip, $take) {
174            $result = Template::with('category', 'user_shortcut')
175                ->when($category_id, function ($q) use ($category_id) {
176                    return $q->where('category_id', '=', $category_id);
177                })
178                ->when($sub_category_id, function ($q) use ($sub_category_id) {
179                    return $q->where('subcategory_lv1_id', '=', $sub_category_id);
180                })
181                ->when($sub_sub_category_id, function ($q) use ($sub_sub_category_id) {
182                    return $q->where('subcategory_lv2_id', '=', $sub_sub_category_id);
183                })
184                ->when($skip, function ($q) use ($skip) {
185                    if ((int) $skip > 0) {
186                        return $q->skip((int) $skip);
187                    }
188                })
189                ->when($take && strtolower($take) != 'all', function ($q) use ($take) {
190                    if ((int) $take > 0) {
191                        return $q->take((int) $take);
192                    }
193                })
194                ->get();
195
196            foreach ($result as $key => $item) {
197                $result[$key]['category_name'] = $item->category->name;
198                $result[$key]['category_slug'] = $item->category->slug;
199                unset($result[$key]['category']);
200                if (! ($request->user() instanceof AdminUser)) {
201                    $result[$key]['action'] = $this->getAction($item);
202                    unset($result[$key]['user_shortcut']);
203                }
204            }
205
206            return $result;
207        });
208
209        return response()->json($result);
210    }
211
212    function generateTemplateUniqueSlug($shortcut, $model, $field = 'unique_slug')
213    {
214        $slug = Str::slug($shortcut);
215        $originalSlug = $slug;
216        $counter = 1;
217
218        // Check for existing slugs in the database
219        while ($model::where($field, $slug)->exists()) {
220            $slug = $originalSlug . '-' . $counter++;
221        }
222
223        return $slug;
224    }
225}