75 lines
2.0 KiB
PHP
75 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Exceptions\AuditionServiceException;
|
|
use App\Models\Audition;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
class AuditionService
|
|
{
|
|
/**
|
|
* Create a new class instance.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* @throws AuditionServiceException
|
|
*/
|
|
public function getSubscores(Audition $audition, $mode = 'seating', $sort = 'tiebreak')
|
|
{
|
|
$cacheKey = 'auditionSubscores-'.$audition->id.'-'.$mode.'-'.$sort;
|
|
|
|
return Cache::remember($cacheKey, 10, function () use ($audition, $mode, $sort) {
|
|
$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',
|
|
};
|
|
|
|
return $audition->scoringGuide->subscores->where($modeColumn, true)->sortBy($sortColumn);
|
|
});
|
|
}
|
|
|
|
public function getJudges(Audition $audition)
|
|
{
|
|
$cacheKey = 'auditionJudges-'.$audition->id;
|
|
return Cache::remember($cacheKey, 10, function () use ($audition) {
|
|
$this->validateAudition($audition);
|
|
|
|
return $audition->judges;
|
|
});
|
|
}
|
|
|
|
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');
|
|
}
|
|
}
|
|
}
|