67 lines
1.8 KiB
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');
|
|
}
|
|
}
|
|
}
|