Results page is working

This commit is contained in:
Matt Young 2024-06-24 23:45:53 -05:00
parent f3a8eca8b4
commit b005aed129
8 changed files with 65 additions and 24 deletions

View File

@ -2,14 +2,18 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Seat;
use App\Services\AuditionCacheService; use App\Services\AuditionCacheService;
use App\Services\SeatingService; use App\Services\SeatingService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ResultsPage extends Controller class ResultsPage extends Controller
{ {
protected $auditionCacheService; protected $auditionCacheService;
protected $seatingService; protected $seatingService;
public function __construct(AuditionCacheService $auditionCacheService, SeatingService $seatingService) public function __construct(AuditionCacheService $auditionCacheService, SeatingService $seatingService)
{ {
$this->auditionCacheService = $auditionCacheService; $this->auditionCacheService = $auditionCacheService;
@ -22,11 +26,28 @@ class ResultsPage extends Controller
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
$publishedAuditions = $this->auditionCacheService->getPublishedAuditions(); $publishedAuditions = $this->auditionCacheService->getPublishedAuditions();
$resultsSeatList = Cache::rememberForever('resultsSeatList', function () use ($publishedAuditions) {
$seatList = [];
foreach ($publishedAuditions as $audition) {
$seats = $this->seatingService->getSeatsForAudition($audition->id);
$ensembles = $this->seatingService->getEnsemblesForEvent($audition->event_id);
foreach ($ensembles as $ensemble) {
if (! $seats->has($ensemble->id)) { // If there are no students seated in this ensemble, skip it
continue;
}
foreach ($seats[$ensemble->id] as $seat) {
/** @var Seat $seat */
$seatList[$audition->id][] = [
'seat' => $ensemble->name.' '.$seat->seat,
'student' => $seat->entry->student,
];
}
}
}
foreach ($publishedAuditions as $audition) { return $seatList;
$audition->seats = $this->seatingService->getSeatsForAudition($audition->id); });
}
return view('results.index', compact('publishedAuditions')); return view('results.index', compact('publishedAuditions', 'resultsSeatList'));
} }
} }

View File

@ -10,6 +10,7 @@ use App\Services\DoublerService;
use App\Services\SeatingService; use App\Services\SeatingService;
use App\Services\TabulationService; use App\Services\TabulationService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use function compact; use function compact;
@ -93,16 +94,22 @@ class TabulationController extends Controller
} }
$audition->addFlag('seats_published'); $audition->addFlag('seats_published');
$request->session()->forget($sessionKey); $request->session()->forget($sessionKey);
Cache::forget('resultsSeatList');
Cache::forget('publishedAuditions');
Cache::forget('audition'.$audition->id.'seats');
// TODO move the previous Cache functions here and in unplublish to the services, need to add an event for publishing an audition as well
return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]); return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]);
} }
public function unpublishSeats(Request $request, Audition $audition) public function unpublishSeats(Request $request, Audition $audition)
{ {
// TODO move this to SeatingService // TODO move this to SeatingService
$audition->removeFlag('seats_published');
Cache::forget('resultsSeatList');
Cache::forget('publishedAuditions');
Cache::forget('audition'.$audition->id.'seats');
$this->seatingService->forgetSeatsForAudition($audition->id); $this->seatingService->forgetSeatsForAudition($audition->id);
Seat::where('audition_id', $audition->id)->delete(); Seat::where('audition_id', $audition->id)->delete();
$audition->removeFlag('seats_published');
return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]); return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]);
} }
} }

View File

@ -171,7 +171,7 @@ class Audition extends Model
return $this->flags->contains('flag_name', $flag); return $this->flags->contains('flag_name', $flag);
} }
public function addFlag($flag) public function addFlag($flag): void
{ {
if ($this->hasFlag($flag)) { if ($this->hasFlag($flag)) {
return; return;
@ -180,7 +180,7 @@ class Audition extends Model
$this->flags()->create(['flag_name' => $flag]); $this->flags()->create(['flag_name' => $flag]);
} }
public function removeFlag($flag) public function removeFlag($flag): void
{ {
// remove related auditionFlag where flag_name = $flag // remove related auditionFlag where flag_name = $flag
$this->flags()->where('flag_name', $flag)->delete(); $this->flags()->where('flag_name', $flag)->delete();

View File

@ -70,4 +70,9 @@ class AuditionCacheService
return Audition::orderBy('score_order')->get()->filter(fn ($audition) => $audition->hasFlag('seats_published')); return Audition::orderBy('score_order')->get()->filter(fn ($audition) => $audition->hasFlag('seats_published'));
}); });
} }
public function clearPublishedAuditionsCache()
{
Cache::forget('publishedAuditions');
}
} }

View File

@ -2,6 +2,7 @@
namespace App\Services; namespace App\Services;
use App\Models\Event;
use App\Models\Seat; use App\Models\Seat;
use App\Models\SeatingLimit; use App\Models\SeatingLimit;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@ -25,7 +26,7 @@ class SeatingService
// TODO modifying audition limits should refresh this cache // TODO modifying audition limits should refresh this cache
return Cache::remember($this->limitsCacheKey, now()->addDay(), function () { return Cache::remember($this->limitsCacheKey, now()->addDay(), function () {
$limits = SeatingLimit::with('ensemble')->get(); $limits = SeatingLimit::with('ensemble')->get();
// Sort limits by ensemlbe->rank // Sort limits by ensemble->rank
$limits = $limits->sortBy(function ($limit) { $limits = $limits->sortBy(function ($limit) {
return $limit->ensemble->rank; return $limit->ensemble->rank;
}); });
@ -56,9 +57,9 @@ class SeatingService
public function getSeatsForAudition($auditionId) public function getSeatsForAudition($auditionId)
{ {
$cacheKey = 'audition'.$auditionId.'seats'; $cacheKey = 'audition'.$auditionId.'seats';
// TODO rework to pull entry info from cache
return Cache::remember($cacheKey, now()->addHour(), function () use ($auditionId) { return Cache::remember($cacheKey, now()->addHour(), function () use ($auditionId) {
return Seat::with('entry.student') return Seat::with('entry.student.school')
->where('audition_id', $auditionId) ->where('audition_id', $auditionId)
->orderBy('seat') ->orderBy('seat')
->get() ->get()
@ -71,4 +72,17 @@ class SeatingService
$cacheKey = 'audition'.$auditionId.'seats'; $cacheKey = 'audition'.$auditionId.'seats';
Cache::forget($cacheKey); Cache::forget($cacheKey);
} }
public function getEnsemblesForEvent($eventId)
{
static $eventEnsembles = [];
if (array_key_exists($eventId, $eventEnsembles)) {
return $eventEnsembles[$eventId];
}
$event = Event::find($eventId);
$eventEnsembles[$eventId] = $event->ensembles;
return $eventEnsembles[$eventId];
}
} }

View File

@ -35,7 +35,7 @@
</div> </div>
</div> </div>
<div class="mx-auto max-w-7xl"> <div class="mx-auto max-w-sm">
{{ $slot }} {{ $slot }}

View File

@ -1,22 +1,16 @@
<x-results.layout> <x-results.layout>
@php
dump($publishedAuditions);
@endphp
<nav class="h-full overflow-y-auto mt-3" aria-label="Directory"> <nav class="h-full overflow-y-auto mt-3" aria-label="Directory">
@foreach($publishedAuditions as $audition) @foreach($publishedAuditions as $audition)
<x-results.table-audition-section :auditionName="$audition->name"> <x-results.table-audition-section :auditionName="$audition->name">
@foreach($audition->seats as $seat) @foreach($resultsSeatList[$audition->id] as $seat)
<x-results.table-seat-row <x-results.table-seat-row
seat="d" :seat="$seat['seat']"
student_name="name" :student_name="$seat['student']->full_name()"
school="school" /> :school="$seat['student']->school->name" />
@endforeach @endforeach
</x-results.table-audition-section> </x-results.table-audition-section>
@endforeach @endforeach
<x-results.table-audition-section audition-name="HS Flute">
<x-results.table-seat-row seat="Wind Ensemble 1" student_name="Matt Young" school="Chelsea"/>
</x-results.table-audition-section>
</nav> </nav>
</x-results.layout> </x-results.layout>

View File

@ -17,7 +17,7 @@
@foreach($ensembleLimits as $ensembleLimit) @foreach($ensembleLimits as $ensembleLimit)
@php @php
$ensembleSeats = $seatingService->getSeatsForAudition($audition->id)[$ensembleLimit->ensemble->id]; $ensembleSeats = $seatingService->getSeatsForAudition($audition->id)[$ensembleLimit->ensemble->id] ?? array();
@endphp @endphp
<x-card.card class="mb-3"> <x-card.card class="mb-3">
<x-card.heading>{{ $ensembleLimit->ensemble->name }}</x-card.heading> <x-card.heading>{{ $ensembleLimit->ensemble->name }}</x-card.heading>