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

124 lines
4.0 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use App\Models\BonusScoreDefinition;
use App\Models\Room;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use function auditionLog;
use function redirect;
class RoomController extends Controller
{
public function index()
{
$rooms = Room::with('auditions.entries', 'entries')->orderBy('name')->get();
// Check if room id 0 exists, if not, create it and assign all unassigned auditions to it
if (! $rooms->contains('id', 0)) {
$unassignedRoom = Room::create([
'id' => 0,
'name' => 'Unassigned',
'description' => 'Auditions that have not been assigned to a room',
]);
$unassignedRoom->id = 0;
$unassignedRoom->save();
$auditionsToUpdate = Audition::whereNull('room_id')->get();
foreach ($auditionsToUpdate as $audition) {
$audition->room_id = 0;
$audition->save();
}
$rooms = Room::with('auditions.entries', 'entries')->orderBy('name')->get();
}
return view('admin.rooms.index', ['rooms' => $rooms]);
}
public function judgingAssignment() // Show form for assigning judges
{
$usersWithoutRooms = User::doesntHave('rooms')->orderBy('last_name')->orderBy('first_name')->get();
$usersWithRooms = User::has('rooms')->orderBy('last_name')->orderBy('first_name')->get();
$rooms = Room::with(['judges.school', 'auditions'])->get();
$bonusScoresExist = BonusScoreDefinition::count() > 0;
return view('admin.rooms.judge_assignments',
compact('usersWithoutRooms', 'usersWithRooms', 'rooms', 'bonusScoresExist'));
}
public function updateJudgeAssignment(Request $request, Room $room)
{
$validData = $request->validate([
'judge' => 'exists:users,id',
]);
$judge = User::find($validData['judge']);
if ($request->isMethod('post')) {
// attach judge on post
$room->addJudge($judge->id);
$message = 'Assigned '.$judge->full_name().' to '.$room->name;
} elseif ($request->isMethod('delete')) {
// detach judge on delete
$room->removeJudge($judge->id);
$message = 'Removed '.$judge->full_name().' from '.$room->name;
}
$affected['users'] = [$judge->id];
$affected['rooms'] = [$room->id];
auditionLog($message, $affected);
return redirect(route('admin.rooms.judgingAssignment'))->with('success', $message);
}
public function create()
{
return view('admin.rooms.create');
}
public function store(Request $request)
{
$validData = $request->validate([
'name' => 'required|unique:rooms,name',
'description' => 'nullable',
]);
$room = new Room();
$room->name = $validData['name'];
$room->description = $validData['description'];
$room->save();
return redirect()->route('admin.rooms.index')->with('success', 'Room created.');
}
public function update(Request $request, Room $room)
{
$validData = $request->validate([
'name' => ['required', Rule::unique('rooms', 'name')->ignore($room->id)],
'description' => 'nullable',
]);
$room->name = $validData['name'];
$room->description = $validData['description'];
$room->save();
return redirect()->route('admin.rooms.index')->with('success', 'Room updated successfully');
}
public function destroy(Room $room)
{
if ($room->auditions()->count() > 0) {
return redirect()->route('admin.rooms.index')->with('error',
'Cannot delete room with auditions. First move the auditions to unassigned or another room');
}
$room->delete();
return redirect()->route('admin.rooms.index')->with('success', 'Room deleted.');
}
}