auditionadmin/app/Services/AuditionService.php

67 lines
1.8 KiB
PHP

<?php
namespace App\Services;
use App\Exceptions\AuditionServiceException;
use App\Models\Audition;
use Illuminate\Support\Facades\Log;
class AuditionService
{
/**
* Create a new class instance.
*/
public function __construct()
{
//
}
/**
* @throws AuditionServiceException
*/
public function getSubscores(Audition $audition, $mode = 'seating', $sort = 'tiebreak')
{
static $auditionSubscores = [];
$this->validateAudition($audition);
$this->validateMode($mode);
$this->validateSort($sort);
$sortColumn = match ($sort) {
'tiebreak' => 'tiebreak_order',
'display' => 'display_order',
};
$modeColumn = match ($mode) {
'seating' => 'for_seating',
'advancement' => 'for_advance',
};
if (! isset($auditionSubscores[$mode][$sort])) {
$auditionSubscores[$mode][$sort] = $audition->scoringGuide->subscores->where($modeColumn, true)->sortBy($sortColumn);
} else {
Log::debug('Using cached subscores');
}
return $auditionSubscores[$mode][$sort];
}
protected function validateAudition($audition)
{
if (! $audition->exists()) {
throw new AuditionServiceException('Invalid audition provided');
}
}
protected function validateMode($mode)
{
if ($mode !== 'seating' && $mode !== 'advancement') {
throw new AuditionServiceException('Invalid mode requested. Mode must be seating or advancement');
}
}
protected function validateSort($sort)
{
if ($sort !== 'tiebreak' && $sort !== 'display') {
throw new AuditionServiceException('Invalid sort requested. Sort must be tiebreak or weight');
}
}
}