131 lines
4.2 KiB
PHP
131 lines
4.2 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\Support\Facades\Auth;
|
|
|
|
use function abort;
|
|
use function to_route;
|
|
use function view;
|
|
|
|
class StudentController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$students = Student::with(['school'])->withCount('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'],
|
|
]);
|
|
|
|
if (Student::where('first_name', request('first_name'))
|
|
->where('last_name', request('last_name'))
|
|
->where('school_id', request('school_id'))
|
|
->exists()) {
|
|
return redirect('/admin/students/create')->with('error', 'This student already exists.');
|
|
}
|
|
|
|
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();
|
|
$student->loadCount('entries');
|
|
|
|
return view('admin.students.edit',
|
|
['student' => $student, 'schools' => $schools, 'minGrade' => $minGrade, 'maxGrade' => $maxGrade]);
|
|
}
|
|
|
|
public function update(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.');
|
|
}
|
|
}
|
|
|
|
if (Student::where('first_name', request('first_name'))
|
|
->where('last_name', request('last_name'))
|
|
->where('school_id', request('school_id'))
|
|
->where('id', '!=', $student->id)
|
|
->exists()) {
|
|
return redirect('/admin/students/'.$student->id.'/edit')->with('error', 'A student with that name already exists at that school');
|
|
}
|
|
|
|
$student->update([
|
|
'first_name' => request('first_name'),
|
|
'last_name' => request('last_name'),
|
|
'grade' => request('grade'),
|
|
'school_id' => request('school_id'),
|
|
]);
|
|
|
|
return redirect('/admin/students');
|
|
|
|
}
|
|
|
|
public function destroy(Student $student)
|
|
{
|
|
if ($student->entries()->count() > 0) {
|
|
return to_route('admin.students.index')->with('error', 'You cannot delete a student with entries.');
|
|
}
|
|
$name = $student->full_name();
|
|
$student->delete();
|
|
|
|
return to_route('admin.students.index')->with('success', 'Student '.$name.' deleted successfully.');
|
|
}
|
|
}
|