<?php namespace App\Http\Controllers; use App\Models\ClassGroup; use App\Repositories\ClassGroup\ClassGroupInterface; use App\Repositories\ClassSchool\ClassSchoolInterface; use App\Services\BootstrapTableService; use App\Services\CachingService; use App\Services\ResponseService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class ClassGroupController extends Controller { /** * Display a listing of the resource. */ private ClassSchoolInterface $class; private ClassGroupInterface $classGroup; private CachingService $cache; public function __construct(ClassSchoolInterface $class, ClassGroupInterface $classGroup, CachingService $cache) { $this->class = $class; $this->classGroup = $classGroup; $this->cache = $cache; } public function index() { // ResponseService::noAnyPermissionThenRedirect(['class-group-list', 'class-group-create']); $classes = $this->class->builder()->groupBy('name')->pluck('name', 'id'); return view('class-group.index', compact('classes')); } /** * Show the form for creating a new resource. */ public function create() { // ResponseService::noPermissionThenRedirect('class-group-create'); } /** * Store a newly created resource in storage. */ public function store(Request $request) { // ResponseService::noPermissionThenSendJson('class-group-create'); $supportedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/svg', 'image/gif', 'image/webp']; $fileMimeType = $request->file('image') ? $request->file('image')->getMimeType() : null; if ($fileMimeType && !in_array($fileMimeType, $supportedImageTypes)) { ResponseService::errorResponse('The image must be a file of type: jpg, jpeg, png, svg, gif or webp.'); } $request->validate([ 'name' => 'required', 'description' => 'required', 'image' => 'required|image|mimes:jpg,jpeg,png,svg,gif,webp', 'class_ids' => 'required', ], [ 'image.mimes' => 'The selected file must be a file of type: jpg, jpeg, png, svg, gif or webp.' ]); try { $data = [ 'name' => $request->name, 'description' => $request->description, 'image' => $request->file('image'), 'class_ids' => implode(",", $request->class_ids), ]; $this->classGroup->create($data); DB::commit(); ResponseService::successResponse('Data Stored Successfully'); } catch (\Throwable $th) { DB::rollBack(); ResponseService::logErrorResponse($th, "Class Group Controller -> Store Method"); ResponseService::errorResponse(); } } /** * Display the specified resource. */ public function show($id) { // ResponseService::noPermissionThenRedirect('class-group-list'); $offset = request('offset', 0); $limit = request('limit', 10); $sort = request('sort', 'rank'); $order = request('order', 'ASC'); $search = request('search'); $sql = $this->classGroup->builder() ->where(function ($query) use ($search) { $query->when($search, function ($query) use ($search) { $query->where(function ($query) use ($search) { $query->where('name', 'LIKE', "%$search%") ->orWhere('description', 'LIKE', "%$search%"); }); }); }); $total = $sql->count(); if ($offset >= $total && $total > 0) { $lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset $offset = $lastPage; } $sql->orderBy($sort, $order)->skip($offset)->take($limit); $res = $sql->get(); $bulkData = array(); $bulkData['total'] = $total; $rows = array(); $no = 1; foreach ($res as $row) { $operate = ''; $operate .= BootstrapTableService::editButton(route('class-group.update', $row->id)); $operate .= BootstrapTableService::deleteButton(route('class-group.destroy', $row->id)); $tempRow = $row->toArray(); $tempRow['no'] = $no++; $tempRow['classes'] = $row->class_name->pluck('name'); $tempRow['operate'] = $operate; $rows[] = $tempRow; } $bulkData['rows'] = $rows; return response()->json($bulkData); } /** * Show the form for editing the specified resource. */ public function edit($id) { // ResponseService::noPermissionThenRedirect('class-group-edit'); } /** * Update the specified resource in storage. */ public function update(Request $request, $id) { // ResponseService::noPermissionThenRedirect('class-group-edit'); $supportedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/svg', 'image/gif', 'image/webp']; $fileMimeType = $request->file('image') ? $request->file('image')->getMimeType() : null; if ($fileMimeType && !in_array($fileMimeType, $supportedImageTypes)) { ResponseService::errorResponse('The image must be a file of type: jpg, jpeg, png, svg, gif or webp.'); } $request->validate([ 'name' => 'required', 'description' => 'required', 'class_ids' => 'required', 'image' => 'mimes:jpg,jpeg,png,svg,gif,webp|max:2048|nullable', ]); try { $data = [ 'name' => $request->name, 'description' => $request->description, 'class_ids' => implode(",", $request->class_ids), ]; if ($request->hasFile('image')) { $data['image'] = $request->file('image'); } $this->classGroup->update($id, $data); DB::commit(); ResponseService::successResponse('Data Updated Successfully'); } catch (\Throwable $th) { DB::rollBack(); ResponseService::logErrorResponse($th, "Class Group Controller -> Update Method"); ResponseService::errorResponse(); } } /** * Remove the specified resource from storage. */ public function destroy($id) { // ResponseService::noPermissionThenRedirect('class-group-delete'); try { DB::beginTransaction(); $this->classGroup->deleteById($id); DB::commit(); ResponseService::successResponse('Data Deleted Successfully'); } catch (\Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Class Group Controller -> Destroy Method"); ResponseService::errorResponse(); } } }