| Total Complexity | 62 |
| Total Lines | 429 |
| Duplicated Lines | 0 % |
| Changes | 6 | ||
| Bugs | 0 | Features | 0 |
Complex classes like TreeController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use TreeController, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 15 | class TreeController extends Controller |
||
| 16 | { |
||
| 17 | use UsesLandlordConnection; |
||
| 18 | |||
| 19 | private $persons; |
||
| 20 | private $unions; |
||
| 21 | private $links; |
||
| 22 | private $nest; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * Display a listing of the resource. |
||
| 26 | * |
||
| 27 | * @return \Illuminate\Http\Response |
||
| 28 | */ |
||
| 29 | public function index(Request $request) |
||
| 30 | { |
||
| 31 | $query = Tree::query()->with('company'); |
||
| 32 | |||
| 33 | if ($request->has('searchTerm')) { |
||
| 34 | $columnsToSearch = ['name']; |
||
| 35 | $search_term = json_decode($request->searchTerm)->searchTerm; |
||
| 36 | if (! empty($search_term)) { |
||
| 37 | $searchQuery = '%'.$search_term.'%'; |
||
| 38 | foreach ($columnsToSearch as $column) { |
||
| 39 | $query->orWhere($column, 'LIKE', $searchQuery); |
||
| 40 | } |
||
| 41 | } |
||
| 42 | } |
||
| 43 | |||
| 44 | if ($request->has('columnFilters')) { |
||
| 45 | $filters = get_object_vars(json_decode($request->columnFilters)); |
||
| 46 | |||
| 47 | foreach ($filters as $key => $value) { |
||
| 48 | if (! empty($value)) { |
||
| 49 | $query->orWhere($key, 'like', '%'.$value.'%'); |
||
| 50 | } |
||
| 51 | } |
||
| 52 | } |
||
| 53 | |||
| 54 | $user = auth()->user(); |
||
| 55 | $company = $user->Company()->pluck('companies.id'); |
||
| 56 | $query->whereIn('company_id', $company); |
||
| 57 | |||
| 58 | if ($request->has('sort.0')) { |
||
| 59 | $sort = json_decode($request->sort[0]); |
||
| 60 | $query->orderBy($sort->field, $sort->type); |
||
| 61 | } |
||
| 62 | |||
| 63 | if ($request->has('perPage')) { |
||
| 64 | $rows = $query->paginate($request->perPage); |
||
| 65 | } |
||
| 66 | if (! count($request->all())) { |
||
| 67 | $rows = $query->get()->toArray(); |
||
| 68 | } |
||
| 69 | |||
| 70 | return $rows; |
||
|
|
|||
| 71 | } |
||
| 72 | |||
| 73 | /** |
||
| 74 | * Show the form for creating a new resource. |
||
| 75 | * |
||
| 76 | * @return \Illuminate\Http\Response |
||
| 77 | */ |
||
| 78 | public function create() |
||
| 79 | { |
||
| 80 | $user = auth()->user(); |
||
| 81 | $companies_id = $user->Company()->pluck('companies.id'); |
||
| 82 | $roles = $user->roles; |
||
| 83 | $role = $roles[0]->id; |
||
| 84 | if ($role == 7 || $role == 8) { |
||
| 85 | if (Tree::whereIn('company_id', $companies_id)->count() < 1) { |
||
| 86 | return response()->json(['create_tree' => true]); |
||
| 87 | } else { |
||
| 88 | return response()->json(['create_tree' => false]); |
||
| 89 | } |
||
| 90 | } elseif ($role == 5 || $role == 6) { |
||
| 91 | if (Tree::whereIn('company_id', $companies_id)->count() < 10) { |
||
| 92 | return response()->json(['create_tree' => true]); |
||
| 93 | } else { |
||
| 94 | return response()->json(['create_tree' => false]); |
||
| 95 | } |
||
| 96 | } elseif ($role == 3 || $role == 4) { |
||
| 97 | return response()->json(['create_tree' => true]); |
||
| 98 | } else { |
||
| 99 | return response()->json(['create_tree' => false]); |
||
| 100 | } |
||
| 101 | } |
||
| 102 | |||
| 103 | /** |
||
| 104 | * Store a newly created resource in storage. |
||
| 105 | * |
||
| 106 | * @param \Illuminate\Http\Request $request |
||
| 107 | * @return \Illuminate\Http\Response |
||
| 108 | */ |
||
| 109 | public function store(Request $request) |
||
| 110 | { |
||
| 111 | $request->validate([ |
||
| 112 | 'name' => 'required', |
||
| 113 | 'company_id' => 'required', |
||
| 114 | ]); |
||
| 115 | $tree_id = Tree::create([ |
||
| 116 | 'name' => $request->name, |
||
| 117 | 'company_id' => $request->company_id, |
||
| 118 | 'current_tenant' => 0, |
||
| 119 | 'description' => $request->description, |
||
| 120 | ])->id; |
||
| 121 | |||
| 122 | $tenant_id = DB::connection($this->getConnectionName())->table('tenants')->insertGetId([ |
||
| 123 | 'name' => 'tenant'.$tree_id, |
||
| 124 | 'tree_id' => $tree_id, |
||
| 125 | 'database' => 'tenant'.$tree_id, |
||
| 126 | ]); |
||
| 127 | |||
| 128 | DB::statement('create database tenant'.$tree_id); |
||
| 129 | |||
| 130 | Artisan::call('tenants:artisan "migrate --database=tenant --force"'); |
||
| 131 | } |
||
| 132 | |||
| 133 | /** |
||
| 134 | * Display the specified resource. |
||
| 135 | * |
||
| 136 | * @param int $id |
||
| 137 | * @return \Illuminate\Http\Response |
||
| 138 | */ |
||
| 139 | public function show(Request $request) |
||
| 140 | { |
||
| 141 | $start_id = $request->get('start_id', 3); |
||
| 142 | $nest = $request->get('nest', 3); |
||
| 143 | $ret = []; |
||
| 144 | $ret['start'] = (int) $start_id; |
||
| 145 | $this->persons = []; |
||
| 146 | $this->unions = []; |
||
| 147 | $this->links = []; |
||
| 148 | $this->nest = $nest; |
||
| 149 | // $this->getGraphData((int)$start_id); |
||
| 150 | $this->getGraphDataUpward((int) $start_id); |
||
| 151 | $ret['persons'] = $this->persons; |
||
| 152 | $ret['unions'] = $this->unions; |
||
| 153 | $ret['links'] = $this->links; |
||
| 154 | // ExportGedCom::dispatch(2, $request); |
||
| 155 | // $file = 'file.GED'; |
||
| 156 | // $destinationPath = public_path().'/upload/'; |
||
| 157 | // $ret['link'] = $destinationPath.$file; |
||
| 158 | |||
| 159 | return $ret; |
||
| 160 | } |
||
| 161 | |||
| 162 | private function getGraphData($start_id, $nest = 1) |
||
| 163 | { |
||
| 164 | $conn = $this->getConnection(); |
||
| 165 | $db = $this->getDB(); |
||
| 166 | |||
| 167 | if ($this->nest >= $nest) { |
||
| 168 | $nest++; |
||
| 169 | |||
| 170 | // add family |
||
| 171 | $families = Family::on($conn)->where('husband_id', $start_id)->orwhere('wife_id', $start_id)->get(); |
||
| 172 | $own_unions = []; |
||
| 173 | |||
| 174 | // add children |
||
| 175 | foreach ($families as $family) { |
||
| 176 | $family_id = $family->id; |
||
| 177 | $father = Person::on($conn)->find($family->husband_id); |
||
| 178 | $mother = Person::on($conn)->find($family->wife_id); |
||
| 179 | // add partner to person |
||
| 180 | // add partner link |
||
| 181 | |||
| 182 | if (isset($father->id)) { |
||
| 183 | $_families = Family::on($conn)->where('husband_id', $father->id)->orwhere('wife_id', $father->id)->select('id')->get(); |
||
| 184 | $_union_ids = []; |
||
| 185 | foreach ($_families as $item) { |
||
| 186 | $_union_ids[] = 'u'.$item->id; |
||
| 187 | } |
||
| 188 | $father->setAttribute('own_unions', $_union_ids); |
||
| 189 | $this->persons[$father->id] = $father; |
||
| 190 | $this->links[] = [$father->id, 'u'.$family_id]; |
||
| 191 | } |
||
| 192 | if (isset($mother->id)) { |
||
| 193 | $_families = Family::on($conn)->where('husband_id', $mother->id)->orwhere('wife_id', $mother->id)->select('id')->get(); |
||
| 194 | $_union_ids = []; |
||
| 195 | foreach ($_families as $item) { |
||
| 196 | $_union_ids[] = $item->id; |
||
| 197 | } |
||
| 198 | $mother->setAttribute('own_unions', $_union_ids); |
||
| 199 | $this->persons[$mother->id] = $mother; |
||
| 200 | $this->links[] = [$mother->id, 'u'.$family_id]; |
||
| 201 | } |
||
| 202 | |||
| 203 | // find children |
||
| 204 | $children = Person::on($conn)->where('child_in_family_id', $family_id)->get(); |
||
| 205 | $children_ids = []; |
||
| 206 | foreach ($children as $child) { |
||
| 207 | $child_id = $child->id; |
||
| 208 | // add child to person |
||
| 209 | // parent_union |
||
| 210 | $child_data = Person::on($conn)->find($child_id); |
||
| 211 | $_families = Family::on($conn)->where('husband_id', $child_id)->orwhere('wife_id', $child_id)->select('id')->get(); |
||
| 212 | $_union_ids = []; |
||
| 213 | foreach ($_families as $item) { |
||
| 214 | $_union_ids[] = $item->id; |
||
| 215 | } |
||
| 216 | $child_data->setAttribute('own_unions', $_union_ids); |
||
| 217 | $this->persons[$child_id] = $child_data; |
||
| 218 | |||
| 219 | // add union-child link |
||
| 220 | $this->links[] = ['u'.$family_id, $child_id]; |
||
| 221 | |||
| 222 | // make union child filds |
||
| 223 | $children_ids[] = $child_id; |
||
| 224 | $this->getGraphData($child_id, $nest); |
||
| 225 | } |
||
| 226 | |||
| 227 | // compose union item and add to unions |
||
| 228 | $union = []; |
||
| 229 | $union['id'] = 'u'.$family_id; |
||
| 230 | $union['partner'] = [isset($father->id) ? $father->id : null, isset($mother->id) ? $mother->id : null]; |
||
| 231 | $union['children'] = $children_ids; |
||
| 232 | $this->unions['u'.$family_id] = $union; |
||
| 233 | } |
||
| 234 | } |
||
| 235 | |||
| 236 | return true; |
||
| 237 | } |
||
| 238 | |||
| 239 | private function getGraphDataUpward($start_id, $nest = 0) |
||
| 240 | { |
||
| 241 | $conn = $this->getConnection(); |
||
| 242 | $db = $this->getDB(); |
||
| 243 | |||
| 244 | $threshold = (int) ($this->nest) * 1; |
||
| 245 | $has = (int) ($nest) * 1; |
||
| 246 | if ($threshold >= $has) { |
||
| 247 | $person = Person::on($conn)->find($start_id); |
||
| 248 | // do not process for null |
||
| 249 | if ($person == null) { |
||
| 250 | return; |
||
| 251 | } |
||
| 252 | |||
| 253 | // do not process again |
||
| 254 | if (array_key_exists($start_id, $this->persons)) { |
||
| 255 | return; |
||
| 256 | } |
||
| 257 | // do self |
||
| 258 | if (! array_key_exists($start_id, $this->persons)) { |
||
| 259 | // this is not added |
||
| 260 | $_families = Family::on($conn)->where('husband_id', $start_id)->orwhere('wife_id', $start_id)->select('id')->get(); |
||
| 261 | $_union_ids = []; |
||
| 262 | foreach ($_families as $item) { |
||
| 263 | $_union_ids[] = 'u'.$item->id; |
||
| 264 | // add current family link |
||
| 265 | // $this->links[] = [$start_id, 'u'.$item->id]; |
||
| 266 | array_unshift($this->links, [$start_id, 'u'.$item->id]); |
||
| 267 | } |
||
| 268 | $person->setAttribute('own_unions', $_union_ids); |
||
| 269 | $person->setAttribute('parent_union', 'u'.$person->child_in_family_id); |
||
| 270 | // add to persons |
||
| 271 | $this->persons[$start_id] = $person; |
||
| 272 | |||
| 273 | // get self's parents data |
||
| 274 | $p_family_id = $person->child_in_family_id; |
||
| 275 | if (! empty($p_family_id)) { |
||
| 276 | // add parent family link |
||
| 277 | // $this->links[] = ['u'.$p_family_id, $start_id] ; |
||
| 278 | array_unshift($this->links, ['u'.$p_family_id, $start_id]); |
||
| 279 | $p_family = Family::on($conn)->find($p_family_id); |
||
| 280 | if (isset($p_family->husband_id)) { |
||
| 281 | $p_fatherid = $p_family->husband_id; |
||
| 282 | $this->getGraphDataUpward($p_fatherid, $nest + 1); |
||
| 283 | } |
||
| 284 | if (isset($p_family->wife_id)) { |
||
| 285 | $p_motherid = $p_family->wife_id; |
||
| 286 | $this->getGraphDataUpward($p_motherid, $nest + 1); |
||
| 287 | } |
||
| 288 | } |
||
| 289 | } |
||
| 290 | // get partner |
||
| 291 | $cu_families = Family::on($conn)->where('husband_id', $start_id)->orwhere('wife_id', $start_id)->get(); |
||
| 292 | foreach ($cu_families as $family) { |
||
| 293 | $family_id = $family->id; |
||
| 294 | $father = Person::on($conn)->find($family->husband_id); |
||
| 295 | $mother = Person::on($conn)->find($family->wife_id); |
||
| 296 | if (isset($father->id)) { |
||
| 297 | if (! array_key_exists($father->id, $this->persons)) { |
||
| 298 | // this is not added |
||
| 299 | $_families = Family::on($conn)->where('husband_id', $father->id)->orwhere('wife_id', $father->id)->select('id')->get(); |
||
| 300 | $_union_ids = []; |
||
| 301 | foreach ($_families as $item) { |
||
| 302 | $_union_ids[] = 'u'.$item->id; |
||
| 303 | } |
||
| 304 | $father->setAttribute('own_unions', $_union_ids); |
||
| 305 | $father->setAttribute('parent_union', 'u'.$father->child_in_family_id); |
||
| 306 | // add to persons |
||
| 307 | $this->persons[$father->id] = $father; |
||
| 308 | |||
| 309 | // add current family link |
||
| 310 | // $this->links[] = [$father->id, 'u'.$family_id]; |
||
| 311 | array_unshift($this->links, [$father->id, 'u'.$family_id]); |
||
| 312 | // get husband's parents data |
||
| 313 | $p_family_id = $father->child_in_family_id; |
||
| 314 | if (! empty($p_family_id)) { |
||
| 315 | // add parent family link |
||
| 316 | // $this->links[] = ['u'.$p_family_id, $father->id] ; |
||
| 317 | array_unshift($this->links, ['u'.$p_family_id, $father->id]); |
||
| 318 | $p_family = Family::on($conn)->find($p_family_id); |
||
| 319 | if (isset($p_family->husband_id)) { |
||
| 320 | $p_fatherid = $p_family->husband_id; |
||
| 321 | $this->getGraphDataUpward($p_fatherid, $nest + 1); |
||
| 322 | } |
||
| 323 | if (isset($p_family->wife_id)) { |
||
| 324 | $p_motherid = $p_family->wife_id; |
||
| 325 | $this->getGraphDataUpward($p_motherid, $nest + 1); |
||
| 326 | } |
||
| 327 | } |
||
| 328 | } |
||
| 329 | } |
||
| 330 | if (isset($mother->id)) { |
||
| 331 | if (! array_key_exists($mother->id, $this->persons)) { |
||
| 332 | // this is not added |
||
| 333 | $_families = Family::on($conn)->where('husband_id', $mother->id)->orwhere('wife_id', $mother->id)->select('id')->get(); |
||
| 334 | $_union_ids = []; |
||
| 335 | foreach ($_families as $item) { |
||
| 336 | $_union_ids[] = $item->id; |
||
| 337 | } |
||
| 338 | $mother->setAttribute('own_unions', $_union_ids); |
||
| 339 | $mother->setAttribute('parent_union', 'u'.$mother->child_in_family_id); |
||
| 340 | // add to person |
||
| 341 | $this->persons[$mother->id] = $mother; |
||
| 342 | // add current family link |
||
| 343 | // $this->links[] = [$mother->id, 'u'.$family_id]; |
||
| 344 | array_unshift($this->links, [$mother->id, 'u'.$family_id]); |
||
| 345 | // get wifee's parents data |
||
| 346 | $p_family_id = $mother->child_in_family_id; |
||
| 347 | if (! empty($p_family_id)) { |
||
| 348 | // add parent family link |
||
| 349 | // $this->links[] = ['u'.$p_family_id, $father->id] ; |
||
| 350 | array_unshift($this->links, ['u'.$p_family_id, $mother->id]); |
||
| 351 | |||
| 352 | $p_family = Family::on($conn)->find($p_family_id); |
||
| 353 | if (isset($p_family->husband_id)) { |
||
| 354 | $p_fatherid = $p_family->husband_id; |
||
| 355 | $this->getGraphDataUpward($p_fatherid, $nest + 1); |
||
| 356 | } |
||
| 357 | if (isset($p_family->wife_id)) { |
||
| 358 | $p_motherid = $p_family->wife_id; |
||
| 359 | $this->getGraphDataUpward($p_motherid, $nest + 1); |
||
| 360 | } |
||
| 361 | } |
||
| 362 | } |
||
| 363 | } |
||
| 364 | |||
| 365 | // find children |
||
| 366 | $children = Person::on($conn)->where('child_in_family_id', $family_id)->get(); |
||
| 367 | $children_ids = []; |
||
| 368 | foreach ($children as $child) { |
||
| 369 | $child_id = $child->id; |
||
| 370 | $children_ids[] = $child_id; |
||
| 371 | } |
||
| 372 | |||
| 373 | // compose union item and add to unions |
||
| 374 | $union = []; |
||
| 375 | $union['id'] = 'u'.$family_id; |
||
| 376 | $union['partner'] = [isset($father->id) ? $father->id : null, isset($mother->id) ? $mother->id : null]; |
||
| 377 | $union['children'] = $children_ids; |
||
| 378 | $this->unions['u'.$family_id] = $union; |
||
| 379 | } |
||
| 380 | // get brother/sisters |
||
| 381 | $brothers = Person::on($conn)->where('child_in_family_id', $person->child_in_family_id) |
||
| 382 | ->whereNotNull('child_in_family_id') |
||
| 383 | ->where('id', '<>', $start_id)->get(); |
||
| 384 | // $nest = $nest -1; |
||
| 385 | foreach ($brothers as $brother) { |
||
| 386 | $this->getGraphDataUpward($brother->id, $nest); |
||
| 387 | } |
||
| 388 | } else { |
||
| 389 | return; |
||
| 390 | } |
||
| 391 | } |
||
| 392 | |||
| 393 | /** |
||
| 394 | * Show the form for editing the specified resource. |
||
| 395 | * |
||
| 396 | * @param int $id |
||
| 397 | * @return \Illuminate\Http\Response |
||
| 398 | */ |
||
| 399 | public function edit($id) |
||
| 400 | { |
||
| 401 | $tree = Tree::find($id); |
||
| 402 | |||
| 403 | return $tree; |
||
| 404 | } |
||
| 405 | |||
| 406 | /** |
||
| 407 | * Update the specified resource in storage. |
||
| 408 | * |
||
| 409 | * @param \Illuminate\Http\Request $request |
||
| 410 | * @param int $id |
||
| 411 | * @return \Illuminate\Http\Response |
||
| 412 | */ |
||
| 413 | public function update(Request $request, $id) |
||
| 426 | } |
||
| 427 | |||
| 428 | /** |
||
| 429 | * Remove the specified resource from storage. |
||
| 430 | * |
||
| 431 | * @param int $id |
||
| 432 | * @return \Illuminate\Http\Response |
||
| 433 | */ |
||
| 434 | public function destroy($id) |
||
| 446 |