Update EnterScore action to modify a scoreSheet as well as create a new one
This commit is contained in:
parent
cde808aceb
commit
bdaf18b6c3
|
|
@ -16,21 +16,36 @@ use Illuminate\Support\Facades\DB;
|
||||||
class EnterScore
|
class EnterScore
|
||||||
{
|
{
|
||||||
// TODO implement this action every place that can save a score
|
// TODO implement this action every place that can save a score
|
||||||
public function __invoke(User $user, Entry $entry, array $scores): ScoreSheet
|
/**
|
||||||
|
* @param User $user A user acting as the judge for this sheet
|
||||||
|
* @param Entry $entry An entry to which this score should be assigned
|
||||||
|
* @param array $scores Scores to be entered in the form of SubscoreID => score
|
||||||
|
*
|
||||||
|
* @throws ScoreEntryException
|
||||||
|
*/
|
||||||
|
public function __invoke(User $user, Entry $entry, array $scores, ScoreSheet|false $scoreSheet = false): ScoreSheet
|
||||||
{
|
{
|
||||||
$scores = collect($scores);
|
$scores = collect($scores);
|
||||||
$this->basicChecks($user, $entry, $scores);
|
$this->basicChecks($user, $entry, $scores);
|
||||||
$this->checkJudgeAssignment($user, $entry);
|
$this->checkJudgeAssignment($user, $entry);
|
||||||
$this->checkForExistingScore($user, $entry);
|
$this->checkForExistingScore($user, $entry, $scoreSheet);
|
||||||
$this->validateScoresSubmitted($entry, $scores);
|
$this->validateScoresSubmitted($entry, $scores);
|
||||||
$entry->removeFlag('no_show');
|
$entry->removeFlag('no_show');
|
||||||
$newScoreSheet = ScoreSheet::create([
|
if ($scoreSheet instanceof ScoreSheet) {
|
||||||
|
$scoreSheet->update([
|
||||||
'user_id' => $user->id,
|
'user_id' => $user->id,
|
||||||
'entry_id' => $entry->id,
|
'entry_id' => $entry->id,
|
||||||
'subscores' => $this->subscoresForStorage($entry, $scores),
|
'subscores' => $this->subscoresForStorage($entry, $scores),
|
||||||
]);
|
]);
|
||||||
|
} else {
|
||||||
|
$scoreSheet = ScoreSheet::create([
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'entry_id' => $entry->id,
|
||||||
|
'subscores' => $this->subscoresForStorage($entry, $scores),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
return $newScoreSheet;
|
return $scoreSheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function subscoresForStorage(Entry $entry, Collection $scores)
|
protected function subscoresForStorage(Entry $entry, Collection $scores)
|
||||||
|
|
@ -47,11 +62,20 @@ class EnterScore
|
||||||
return $subscores;
|
return $subscores;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function checkForExistingScore(User $user, Entry $entry)
|
protected function checkForExistingScore(User $user, Entry $entry, $existingScoreSheet)
|
||||||
{
|
{
|
||||||
|
if (! $existingScoreSheet) {
|
||||||
if (ScoreSheet::where('user_id', $user->id)->where('entry_id', $entry->id)->exists()) {
|
if (ScoreSheet::where('user_id', $user->id)->where('entry_id', $entry->id)->exists()) {
|
||||||
throw new ScoreEntryException('That judge has already entered scores for that entry');
|
throw new ScoreEntryException('That judge has already entered scores for that entry');
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if ($existingScoreSheet->user_id !== $user->id) {
|
||||||
|
throw new ScoreEntryException('Existing score sheet is from a different judge');
|
||||||
|
}
|
||||||
|
if ($existingScoreSheet->entry_id !== $entry->id) {
|
||||||
|
throw new ScoreEntryException('Existing score sheet is for a different entry');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function validateScoresSubmitted(Entry $entry, Collection $scores)
|
protected function validateScoresSubmitted(Entry $entry, Collection $scores)
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ use Illuminate\Support\Facades\App;
|
||||||
uses(RefreshDatabase::class);
|
uses(RefreshDatabase::class);
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
#$this->scoreEntry = new EnterScore();
|
|
||||||
$this->scoreEntry = App::make(EnterScore::class);
|
$this->scoreEntry = App::make(EnterScore::class);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -185,3 +184,61 @@ it('throws an exception of the entry already has a score by the judge', function
|
||||||
// Assert
|
// Assert
|
||||||
enterScore($judge, $entry, $scores);
|
enterScore($judge, $entry, $scores);
|
||||||
})->throws(ScoreEntryException::class, 'That judge has already entered scores for that entry');
|
})->throws(ScoreEntryException::class, 'That judge has already entered scores for that entry');
|
||||||
|
it('allows an existing sore sheet to be updated', function() {
|
||||||
|
// Arrange
|
||||||
|
loadSampleAudition();
|
||||||
|
$judge = User::factory()->create();
|
||||||
|
$entry = Entry::factory()->create(['audition_id' => 1000]);
|
||||||
|
$entry->addFlag('no_show');
|
||||||
|
Room::find(1000)->addJudge($judge);
|
||||||
|
$scores = [
|
||||||
|
1001 => 98,
|
||||||
|
1002 => 90,
|
||||||
|
1003 => 87,
|
||||||
|
1004 => 78,
|
||||||
|
1005 => 98,
|
||||||
|
];
|
||||||
|
enterScore($judge, $entry, $scores);
|
||||||
|
// Act
|
||||||
|
$scoreToEdit = ScoreSheet::where('user_id', $judge->id)->where('entry_id', $entry->id)->first();
|
||||||
|
expect($scoreToEdit->exists())->toBeTrue();
|
||||||
|
$newScores = [
|
||||||
|
1001 => 40,
|
||||||
|
1002 => 41,
|
||||||
|
1003 => 42,
|
||||||
|
1004 => 43,
|
||||||
|
1005 => 44,
|
||||||
|
];
|
||||||
|
$pencil = App::make(EnterScore::class);
|
||||||
|
$pencil($judge, $entry, $newScores, $scoreToEdit);
|
||||||
|
$desiredReturn = [
|
||||||
|
1001 => [
|
||||||
|
'score' => 40,
|
||||||
|
'subscore_id' => 1001,
|
||||||
|
'subscore_name' => 'Scale',
|
||||||
|
],
|
||||||
|
1002 => [
|
||||||
|
'score' => 41,
|
||||||
|
'subscore_id' => 1002,
|
||||||
|
'subscore_name' => 'Etude 1',
|
||||||
|
],
|
||||||
|
1003 => [
|
||||||
|
'score' => 42,
|
||||||
|
'subscore_id' => 1003,
|
||||||
|
'subscore_name' => 'Etude 2',
|
||||||
|
],
|
||||||
|
1004 => [
|
||||||
|
'score' => 43,
|
||||||
|
'subscore_id' => 1004,
|
||||||
|
'subscore_name' => 'Sight Reading',
|
||||||
|
],
|
||||||
|
1005 => [
|
||||||
|
'score' => 44,
|
||||||
|
'subscore_id' => 1005,
|
||||||
|
'subscore_name' => 'Tone',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$checkScoreSheet = ScoreSheet::where('user_id', $judge->id)->where('entry_id', $entry->id)->first();
|
||||||
|
expect($checkScoreSheet->exists())->toBeTrue()
|
||||||
|
->and($checkScoreSheet->subscores)->toBe($desiredReturn);
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue