auditionadmin/app/Http/Controllers/Admin/StudentController.php

102 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use App\Models\School;
use App\Models\Student;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use function abort;
use function view;
class StudentController extends Controller
{
public function index()
{
if (! Auth::user()->is_admin) {
abort(403);
}
$students = Student::with(['school', 'entries'])->orderBy('last_name')->orderBy('first_name')->paginate(15);
return view('admin.students.index', ['students' => $students]);
}
public function create()
{
if (! Auth::user()->is_admin) {
abort(403);
}
$minGrade = Audition::min('minimum_grade');
$maxGrade = Audition::max('maximum_grade');
$schools = School::orderBy('name')->get();
return view('admin.students.create', ['schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]);
}
public function store()
{
if (! Auth::user()->is_admin) {
abort(403);
}
request()->validate([
'first_name' => ['required'],
'last_name' => ['required'],
'grade' => ['required', 'integer'],
'school_id' => ['required', 'exists:schools,id'],
]);
$student = Student::create([
'first_name' => request('first_name'),
'last_name' => request('last_name'),
'grade' => request('grade'),
'school_id' => request('school_id'),
]);
return redirect('/admin/students');
}
public function edit(Student $student)
{
if (! Auth::user()->is_admin) {
abort(403);
}
$minGrade = Audition::min('minimum_grade');
$maxGrade = Audition::max('maximum_grade');
$schools = School::orderBy('name')->get();
return view('admin.students.edit', ['student' => $student, 'schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]);
}
public function update(Request $request, Student $student)
{
if (! Auth::user()->is_admin) {
abort(403);
}
request()->validate([
'first_name' => ['required'],
'last_name' => ['required'],
'grade' => ['required', 'integer'],
'school_id' => ['required', 'exists:schools,id'],
]);
foreach ($student->entries as $entry) {
if ($entry->audition->minimum_grade > request('grade') || $entry->audition->maximum_grade < request('grade')) {
return redirect('/admin/students/'.$student->id.'/edit')->with('error', 'This student is entered in an audition that is not available to their new grade.');
}
}
$student->update([
'first_name' => request('first_name'),
'last_name' => request('last_name'),
'grade' => request('grade'),
'school_id' => request('school_id'),
]);
return redirect('/admin/students');
}
}