auditionadmin/app/Http/Controllers/Admin/BonusScoreDefinitionControl...

124 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use App\Models\BonusScoreDefinition;
use App\Models\User;
use App\Rules\ValidateAuditionKey;
use Exception;
use Illuminate\Http\Request;
use function redirect;
use function to_route;
class BonusScoreDefinitionController extends Controller
{
public function index()
{
$bonusScores = BonusScoreDefinition::with('auditions')->get();
// Set auditions equal to the collection of auditions that do not have a related bonus score
$unassignedAuditions = Audition::orderBy('score_order')->doesntHave('bonusScore')->get();
return view('admin.bonus-scores.index', compact('bonusScores', 'unassignedAuditions'));
}
public function store()
{
$validData = request()->validate([
'name' => 'required|unique:bonus_score_definitions,name',
'max_score' => 'required|numeric',
'weight' => 'required|numeric',
]);
BonusScoreDefinition::create($validData);
return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Created');
}
public function update(BonusScoreDefinition $bonusScore)
{
$validData = request()->validate([
'name' => 'required|unique:bonus_score_definitions,name,'.$bonusScore->id,
'max_score' => 'required|numeric',
'weight' => 'required|numeric',
]);
$bonusScore->update($validData);
return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Updated');
}
public function destroy(BonusScoreDefinition $bonusScore)
{
if ($bonusScore->auditions()->count() > 0) {
return to_route('admin.bonus-scores.index')->with('error', 'Bonus Score has auditions attached');
}
$bonusScore->delete();
return to_route('admin.bonus-scores.index')->with('success', 'Bonus Score Deleted');
}
public function assignAuditions(Request $request)
{
// TODO: add pivot model to log changes to assignments
$validData = $request->validate([
'bonus_score_id' => 'required|exists:bonus_score_definitions,id',
'audition' => 'required|array',
'audition.*' => ['required', new ValidateAuditionKey()],
]);
$bonusScore = BonusScoreDefinition::find($validData['bonus_score_id']);
foreach ($validData['audition'] as $auditionId => $value) {
try {
$bonusScore->auditions()->attach($auditionId);
} catch (Exception) {
return redirect()->route('admin.bonus-scores.index')->with('error',
'Error assigning auditions to bonus score');
}
}
return redirect()->route('admin.bonus-scores.index')->with('success', 'Auditions assigned to bonus score');
}
public function unassignAudition(Audition $audition)
{
// TODO: add pivot model to log changes to assignments
$audition->bonusScore()->detach();
return redirect()->route('admin.bonus-scores.index')->with('success', 'Audition unassigned from bonus score');
}
public function judges()
{
//TODO Need to show if judge is assigned, and show bonus assignments or normal judging page
$bonusScores = BonusScoreDefinition::all();
$users = User::orderBy('last_name')->orderBy('first_name')->get();
return view('admin.bonus-scores.judge-assignments', compact('bonusScores', 'users'));
}
public function assignJudge(BonusScoreDefinition $bonusScore)
{
$validData = request()->validate([
'judge' => 'required|exists:users,id',
]);
$bonusScore->judges()->attach($validData['judge']);
return redirect()->route('admin.bonus-scores.judges')->with('success', 'Judge assigned to bonus score');
}
public function removeJudge(BonusScoreDefinition $bonusScore)
{
$validData = request()->validate([
'judge' => 'required|exists:users,id',
]);
$bonusScore->judges()->detach($validData['judge']);
return redirect()->route('admin.bonus-scores.judges')->with('success', 'Judge removed from bonus score');
}
}