From b250105dd612036131eb61e41929e47977180083 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Fri, 12 Jul 2024 01:42:11 -0500 Subject: [PATCH] DoublerService can now identify doublers --- app/Models/Event.php | 3 +- app/Models/User.php | 2 +- app/Providers/AppServiceProvider.php | 2 ++ app/Services/DoublerService.php | 44 +++++++++++++++------------- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/app/Models/Event.php b/app/Models/Event.php index b391c21..07fe9df 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasManyThrough; class Event extends Model { @@ -22,7 +23,7 @@ class Event extends Model ->orderBy('rank'); } - public function entries() + public function entries(): HasManyThrough { return $this->hasManyThrough(Entry::class, Audition::class); } diff --git a/app/Models/User.php b/app/Models/User.php index 350792f..eeb74cb 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -125,7 +125,7 @@ class User extends Authenticatable implements MustVerifyEmail public function isJudge(): bool { - return $this->judgingAssignments->count() > 0; + return $this->judgingAssignments()->count() > 0; } /** diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 195fbc4..a33fc4d 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -28,6 +28,7 @@ use App\Observers\StudentObserver; use App\Observers\SubscoreDefinitionObserver; use App\Observers\UserObserver; use App\Services\AuditionService; +use App\Services\DoublerService; use App\Services\DrawService; use App\Services\EntryService; use App\Services\ScoreService; @@ -49,6 +50,7 @@ class AppServiceProvider extends ServiceProvider $this->app->singleton(EntryService::class, EntryService::class); $this->app->singleton(ScoreService::class, ScoreService::class); $this->app->singleton(UserService::class, UserService::class); + $this->app->singleton(DoublerService::class, DoublerService::class); } /** diff --git a/app/Services/DoublerService.php b/app/Services/DoublerService.php index 2f7fe3f..0b195c3 100644 --- a/app/Services/DoublerService.php +++ b/app/Services/DoublerService.php @@ -3,32 +3,36 @@ namespace App\Services; use App\Models\Entry; +use App\Models\Event; use App\Models\Student; -use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Support\Facades\Cache; class DoublerService { - protected $doublersCacheKey = 'doublers'; - - protected $auditionService; - - protected $tabulationService; - - protected $seatingService; - - /** - * Create a new class instance. - */ - public function __construct( - AuditionService $auditionService, - TabulationService $tabulationService, - SeatingService $seatingService - ) { - $this->auditionService = $auditionService; - $this->tabulationService = $tabulationService; - $this->seatingService = $seatingService; + public function doublersForEvent(Event $event) + { + $cacheKey = 'event'.$event->id.'doublers'; + return Cache::remember($cacheKey, 60, function () use ($event) { + return $this->findDoublersForEvent($event); + }); } + protected function findDoublersForEvent(Event $event): array + { + $entries = $event->entries; + $entries->load('student.school'); + $entries->load('audition'); + $grouped = $entries->groupBy('student_id'); + // Filter out student groups with only one entry in the event + $grouped = $grouped->filter(fn ($s) => $s->count() > 1); + $doubler_array = []; + foreach ($grouped as $student_id => $entries) { + $doubler_array[$student_id] = [ + 'student' => $entries[0]->student, + 'entries' => $entries, + ]; + } + return $doubler_array; + } }