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

212 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\ScoringGuide;
use App\Models\SubscoreDefinition;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use function abort;
use function auditionSetting;
use function request;
use function response;
class ScoringGuideController extends Controller
{
public function index()
{
DB::table('auditions')
->whereNull('scoring_guide_id')
->update(['scoring_guide_id' => 0]);
$guides = ScoringGuide::with(['auditions'])->withCount('subscores')->orderBy('name')->get();
return view('admin.scoring.index', ['guides' => $guides]);
}
public function store()
{
if (! Auth::user()->is_admin) {
abort(403);
}
request()->validate([
'name' => ['required', 'unique:scoring_guides'],
]);
$guide = ScoringGuide::create([
'name' => request('name'),
]);
return redirect(route('admin.scoring.index'))->with('success', 'Scoring guide created');
}
public function edit(Request $request, ScoringGuide $guide, string $tab = 'detail')
{
if (! Auth::user()->is_admin) {
abort(403);
}
if ($tab == 'tiebreakOrder') {
$subscores = SubscoreDefinition::where('scoring_guide_id', $guide->id)->orderBy('tiebreak_order')->get();
} else {
$subscores = SubscoreDefinition::where('scoring_guide_id', $guide->id)->orderBy('display_order')->get();
}
return view('admin.scoring.edit', ['guide' => $guide, 'subscores' => $subscores, 'tab' => $tab]);
}
public function update(ScoringGuide $guide)
{
if (! Auth::user()->is_admin) {
abort(403);
}
request()->validate([
'name' => ['required', 'unique:scoring_guides'],
]);
$guide->update([
'name' => request('name'),
]);
return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Scoring guide updated');
}
public function destroy(ScoringGuide $guide)
{
if (! Auth::user()->is_admin) {
abort(403);
}
if ($guide->auditions()->count() > 0) {
return redirect('/admin/scoring')->with('error', 'Cannot delete scoring guide with auditions');
}
$guide->delete();
return redirect('/admin/scoring')->with('success', 'Scoring guide deleted');
}
public function subscore_store(Request $request, ScoringGuide $guide)
{
if (! $guide->exists()) {
abort(409);
}
$validateData = request()->validate([
'name' => ['required'],
'max_score' => ['required', 'integer'],
'weight' => ['required', 'integer'],
'for_seating' => ['nullable', 'boolean'],
'for_advance' => ['nullable', 'boolean'],
]);
$for_seating = $request->has('for_seating') ? (bool) $request->input('for_seating') : false;
$for_advance = $request->has('for_advance') ? (bool) $request->input('for_advance') : false;
if (! auditionSetting('advanceTo')) {
$for_seating = true;
}
$display_order = SubscoreDefinition::where('scoring_guide_id', '=', $guide->id)->max('display_order') + 1;
$tiebreak_order = SubscoreDefinition::where('scoring_guide_id', '=', $guide->id)->max('tiebreak_order') + 1;
$subscore = SubscoreDefinition::create([
'scoring_guide_id' => $guide->id,
'name' => $validateData['name'],
'max_score' => $validateData['max_score'],
'weight' => $validateData['weight'],
'display_order' => $display_order,
'tiebreak_order' => $tiebreak_order,
'for_seating' => $for_seating,
'for_advance' => $for_advance,
]);
return redirect(route('admin.scoring.edit', $guide))->with('success', 'Subscore added');
}
public function subscore_update(ScoringGuide $guide, SubscoreDefinition $subscore)
{
if (! Auth::user()->is_admin) {
abort(403);
}
if (! $guide->exists() || ! $subscore->exists()) {
abort(409);
}
if ($subscore->scoring_guide_id !== $guide->id) { // Make sure the subscore were updating belongs to the guide
abort(409);
}
$validateData = request()->validate([
'name' => ['required'],
'max_score' => ['required', 'integer'],
'weight' => ['required', 'integer'],
'for_seating' => ['nullable', 'boolean'],
'for_advance' => ['nullable', 'boolean'],
]);
$for_seating = request()->has('for_seating') ? (bool) request()->input('for_seating') : false;
$for_advance = request()->has('for_advance') ? (bool) request()->input('for_advance') : false;
if (! auditionSetting('advanceTo')) {
$for_seating = true;
}
$subscore->update([
'name' => $validateData['name'],
'max_score' => $validateData['max_score'],
'weight' => $validateData['weight'],
'for_seating' => $for_seating,
'for_advance' => $for_advance,
]);
return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Subscore updated');
}
public function subscore_destroy(ScoringGuide $guide, SubscoreDefinition $subscore)
{
if (! Auth::user()->is_admin) {
abort(403);
}
if (! $guide->exists() || ! $subscore->exists()) {
abort(409);
}
if ($subscore->scoring_guide_id !== $guide->id) { // Make sure the subscore were updating belongs to the guide
abort(409);
}
$subscore->delete();
return redirect('/admin/scoring/guides/'.$guide->id.'/edit')->with('success', 'Subscore deleted');
}
public function reorder_display(Request $request)
{
if (! Auth::user()->is_admin) {
abort(403);
}
$order = $request->order;
foreach ($order as $index => $id) {
$subscore = SubscoreDefinition::find($id);
$subscore->update(['display_order' => $index + 1]);
}
return response()->json(['status' => 'success']);
}
public function reorder_tiebreak(Request $request)
{
if (! Auth::user()->is_admin) {
abort(403);
}
$order = $request->order;
foreach ($order as $index => $id) {
$subscore = SubscoreDefinition::find($id);
$subscore->update(['tiebreak_order' => $index + 1]);
}
return response()->json(['status' => 'success']);
}
}