<?php namespace App\Http\Controllers; use App\Repositories\User\UserInterface; use App\Repositories\ClassSchool\ClassSchoolInterface; use App\Repositories\Section\SectionInterface; use App\Repositories\ClassSection\ClassSectionInterface; use App\Services\BootstrapTableService; use App\Services\CachingService; use App\Services\ResponseService; use App\Services\UploadService; use Hash; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; use Throwable; class GuardianController extends Controller { protected UserInterface $user; private ClassSchoolInterface $class; private SectionInterface $section; private ClassSectionInterface $classSection; private CachingService $cache; public function __construct(UserInterface $user, ClassSchoolInterface $class, SectionInterface $section, ClassSectionInterface $classSection, CachingService $cache) { $this->user = $user; $this->class = $class; $this->section = $section; $this->classSection = $classSection; $this->cache = $cache; } public function index() { ResponseService::noPermissionThenRedirect('guardian-list'); $classes = $this->class->all(['id', 'name', 'medium_id', 'shift_id', 'stream_id'], ['stream', 'medium', 'shift']); $sections = $this->section->builder()->orderBy('name', 'ASC')->get(); $class_sections = $this->classSection->builder()->with('class', 'class.stream', 'class.shift', 'section', 'medium')->get(); return view('guardian.index', compact('classes', 'class_sections')); } public function store(Request $request) { ResponseService::noPermissionThenRedirect('guardian-create'); $request->validate([ 'first_name' => 'required', 'email' => 'required|email|max:255|regex:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/|unique:users,email', 'last_name' => 'required', 'gender' => 'required', 'mobile' => 'required|digits_between:6,15', ]); try { DB::beginTransaction(); $guardian = $this->user->create($request->all()); $guardian->assignRole('Guardian'); DB::commit(); ResponseService::successResponse('Data Created Successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Guardian Controller -> Store method"); ResponseService::errorResponse(); } } public function show(Request $request) { // dd($request->all()); ResponseService::noPermissionThenRedirect('guardian-list'); $offset = request('offset', 0); $limit = request('limit', 10); $sort = request('sort', 'id'); $order = request('order', 'DESC'); $sessionYear = $this->cache->getSessionYear(); $sql = $this->user->guardian()->with('child.class_section.class', 'child.class_section.class.shift', 'child.class_section.section', 'child.class_section.medium') ->whereHas('child', function ($q) use ($sessionYear) { $q->where('session_year_id', $sessionYear->id); }); if ($request->class_id && $request->class_id != 'all') { $sql->whereHas('child.class_section', function ($q) use ($request) { $q->where('class_id', $request->class_id); }); } if ($request->class_section_id && $request->class_section_id != 'all') { $sql->whereHas('child', function ($q) use ($request) { $q->where('class_section_id', $request->class_section_id); }); } $sql = $sql->owner(); if (!empty($_GET['search'])) { $search = $_GET['search']; $sql->where(function ($query) use ($search) { $query->where('id', 'LIKE', "%$search%")->orwhere('first_name', 'LIKE', "%$search%") ->orwhere('last_name', 'LIKE', "%$search%")->orwhere('gender', 'LIKE', "%$search%") ->orwhere('email', 'LIKE', "%$search%")->orwhere('mobile', 'LIKE', "%$search%"); }); } $total = $sql->count(); $sql->orderBy($sort, $order)->skip($offset)->take($limit); if ($offset >= $total && $total > 0) { $lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset $offset = $lastPage; } $res = $sql->get(); // dd($res); $bulkData = array(); $bulkData['total'] = $total; $rows = array(); $no = 1; foreach ($res as $row) { $operate = BootstrapTableService::editButton(route('guardian.update', $row->id)); $tempRow = $row->toArray(); $tempRow['no'] = $no++; $tempRow['operate'] = $operate; $rows[] = $tempRow; } $bulkData['rows'] = $rows; return response()->json($bulkData); } public function update(Request $request) { ResponseService::noPermissionThenSendJson('guardian-edit'); $request->validate([ 'edit_id' => 'required', 'first_name' => 'required', 'email' => 'required|email|max:255|regex:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/|unique:users,email,' . $request->edit_id, 'last_name' => 'required', 'gender' => 'required', 'mobile' => 'required|digits_between:6,15', 'image' => 'nullable|image|mimes:jpeg,png,jpg,svg,gif,webp', ]); try { $data = $request->except('_token', 'edit_id', '_method', 'reset_password'); $guardian = $this->user->guardian()->where('id', $request->edit_id)->firstOrFail(); if (!empty($request->image)) { if ($guardian->image) { UploadService::delete($guardian->getRawOriginal('image')); } $data['image'] = UploadService::upload($request->image, 'guardian'); } if ($request->reset_password) { $data['password'] = Hash::make($request->mobile); } $this->user->guardian()->where('id', $request->edit_id)->update($data); $guardian->assignRole('Guardian'); ResponseService::successResponse('Data Updated Successfully'); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Guardian Controller -> Update method"); ResponseService::errorResponse(); } } public function search(Request $request) { ResponseService::noAnyPermissionThenSendJson(['student-create', 'student-edit']); $parent = $this->user->guardian()->where(function ($query) use ($request) { $query->where('email', 'like', '%' . $request->email . '%') ->orWhere('first_name', 'like', '%' . $request->email . '%') ->orWhere('last_name', 'like', '%' . $request->email . '%'); })->get(); if (!empty($parent)) { $response = [ 'error' => false, 'data' => $parent ]; } else { $response = [ 'error' => true, 'message' => trans('no_data_found') ]; } return response()->json($response); } }