Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 122 |
|
0.00% |
0 / 9 |
CRAP | |
0.00% |
0 / 1 |
TemplateController | |
0.00% |
0 / 122 |
|
0.00% |
0 / 9 |
930 | |
0.00% |
0 / 1 |
create | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 | |||
update | |
0.00% |
0 / 9 |
|
0.00% |
0 / 1 |
6 | |||
list | |
0.00% |
0 / 22 |
|
0.00% |
0 / 1 |
30 | |||
details | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
2 | |||
getTemplateBySlug | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
2 | |||
delete | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
2 | |||
getAction | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
12 | |||
listTemplatesByName | |
0.00% |
0 / 46 |
|
0.00% |
0 / 1 |
210 | |||
generateTemplateUniqueSlug | |
0.00% |
0 / 6 |
|
0.00% |
0 / 1 |
6 |
1 | <?php |
2 | |
3 | namespace App\Http\Controllers\v1; |
4 | |
5 | use App\Http\Controllers\Controller; |
6 | use App\Http\Helpers\QueryBuilder\RomeoQueryBuilder; |
7 | use App\Http\Models\Auth\AdminUser; |
8 | use App\Http\Models\Template; |
9 | use App\Http\Models\TemplateCategory; |
10 | use App\Http\Models\TemplateSubcategoryLv1; |
11 | use App\Http\Models\TemplateSubcategoryLv2; |
12 | use App\Http\Requests\TemplateFormRequest; |
13 | use Illuminate\Http\JsonResponse; |
14 | use Illuminate\Http\Request; |
15 | use Illuminate\Support\Facades\Cache; |
16 | use Illuminate\Support\Facades\Config; |
17 | use Illuminate\Support\Str; |
18 | |
19 | class 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 | } |