diff --git a/app/Http/Controllers/Admin/PrelimDefinitionController.php b/app/Http/Controllers/Admin/PrelimDefinitionController.php new file mode 100644 index 0000000..e7bb25b --- /dev/null +++ b/app/Http/Controllers/Admin/PrelimDefinitionController.php @@ -0,0 +1,45 @@ +get(); + $rooms = Room::all(); + $guides = ScoringGuide::all(); + $action = 'create'; + + return view('admin.prelim_definitions.createOrUpdate', compact('auditions', 'rooms', 'guides', 'action')); + } + + public function store(PrelimDefinitionStoreOrUpdateRequest $request) + { + $validated = $request->validated(); + PrelimDefinition::create($validated); + + return redirect()->route('admin.prelim_definitions.index'); + } + + public function edit(PrelimDefinition $prelimDefinition) + { + + } +} diff --git a/app/Http/Requests/PrelimDefinitionStoreOrUpdateRequest.php b/app/Http/Requests/PrelimDefinitionStoreOrUpdateRequest.php new file mode 100644 index 0000000..d2cef01 --- /dev/null +++ b/app/Http/Requests/PrelimDefinitionStoreOrUpdateRequest.php @@ -0,0 +1,28 @@ + [ + 'required', + 'exists:auditions,id', + Rule::unique('prelim_definitions', 'audition_id')->ignore($this->prelimDefinition), + ], + 'room_id' => ['nullable', 'exists:rooms,id'], + 'scoring_guide_id' => ['nullable', 'exists:scoring_guides,id'], + 'passing_score' => ['required', 'integer', 'min:0', 'max:100'], + ]; + } + + public function authorize(): bool + { + return auth()->user()->is_admin; + } +} diff --git a/app/Policies/PrelimDefinitionPolicy.php b/app/Policies/PrelimDefinitionPolicy.php new file mode 100644 index 0000000..5b80664 --- /dev/null +++ b/app/Policies/PrelimDefinitionPolicy.php @@ -0,0 +1,45 @@ +is_admin; + } + + public function view(User $user, PrelimDefinition $prelimDefinition): bool + { + return $user->is_admin; + } + + public function create(User $user): bool + { + return $user->is_admin; + } + + public function update(User $user, PrelimDefinition $prelimDefinition): bool + { + return $user->is_admin; + } + + public function delete(User $user, PrelimDefinition $prelimDefinition): bool + { + return $user->is_admin; + } + + public function restore(User $user, PrelimDefinition $prelimDefinition): bool + { + } + + public function forceDelete(User $user, PrelimDefinition $prelimDefinition): bool + { + } +} diff --git a/resources/views/admin/prelim_definitions/createOrUpdate.blade.php b/resources/views/admin/prelim_definitions/createOrUpdate.blade.php new file mode 100644 index 0000000..be14659 --- /dev/null +++ b/resources/views/admin/prelim_definitions/createOrUpdate.blade.php @@ -0,0 +1,47 @@ + + Manage Prelim Auditions +
+ + Create Prelim Audition + + + + Audition + + @foreach($auditions as $audition) + + @endforeach + + @error('audition_id') +
{{ $message }}
+ @enderror + + + Room + @foreach($rooms as $room) + + @endforeach + + @error('room_id') +
{{ $message }}
+ @enderror + + + Scoring Guide + @foreach($guides as $guide) + + @endforeach + + @error('scoring_guide_id') +
{{ $message }}
+ @enderror + + + + + +
+
+
+
diff --git a/resources/views/admin/prelim_definitions/index.blade.php b/resources/views/admin/prelim_definitions/index.blade.php new file mode 100644 index 0000000..13a58fe --- /dev/null +++ b/resources/views/admin/prelim_definitions/index.blade.php @@ -0,0 +1,31 @@ + + Prelim Audition Setup + + + Preliminary Auditions + + Add Prelim + + + + + + Audition + Passing Score + Room + Scoring Guide + + + + @foreach ($prelims as $prelim) + + {{ $prelim->audition->name }} + {{ $prelim->passing_score }} + {{ $prelim->room->name }} + {{ $prelim->scoringGuide->name }} + + @endforeach + + + + diff --git a/resources/views/components/index.blade.php b/resources/views/components/index.blade.php new file mode 100644 index 0000000..b80e6e0 --- /dev/null +++ b/resources/views/components/index.blade.php @@ -0,0 +1,3 @@ +
+ +
diff --git a/routes/admin.php b/routes/admin.php index ee9c6bb..d5e505a 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -11,6 +11,7 @@ use App\Http\Controllers\Admin\EntryController; use App\Http\Controllers\Admin\EventController; use App\Http\Controllers\Admin\ExportEntriesController; use App\Http\Controllers\Admin\ExportResultsController; +use App\Http\Controllers\Admin\PrelimDefinitionController; use App\Http\Controllers\Admin\PrintCards; use App\Http\Controllers\Admin\PrintRoomAssignmentsController; use App\Http\Controllers\Admin\PrintSignInSheetsController; @@ -203,4 +204,13 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')-> // Print Room and Judge Assignment Report Route::get('room_assignment_report', PrintRoomAssignmentsController::class)->name('admin.print_room_assignment_report'); + + // PrelimDefinition Routes + Route::prefix('prelim_definitions')->controller(PrelimDefinitionController::class)->group(function () { + Route::get('/', 'index')->name('admin.prelim_definitions.index'); + Route::get('/new', 'create')->name('admin.prelim_definitions.create'); + Route::post('/', 'store')->name('admin.prelim_definitions.store'); + Route::get('/{prelimDefinition}', 'edit')->name('admin.prelim_definitions.edit'); + Route::delete('/{prelimDefinition}', 'destroy')->name('admin.prelim_definitions.destroy'); + }); }); diff --git a/tests/Feature/app/Http/Controllers/Admin/PrelimDefinitionControllerTest.php b/tests/Feature/app/Http/Controllers/Admin/PrelimDefinitionControllerTest.php new file mode 100644 index 0000000..06db972 --- /dev/null +++ b/tests/Feature/app/Http/Controllers/Admin/PrelimDefinitionControllerTest.php @@ -0,0 +1,90 @@ +get(route('admin.prelim_definitions.index'))->assertRedirect(route('home')); + actAsNormal(); + $this->get(route('admin.prelim_definitions.index'))->assertRedirect(route('dashboard')); + actAsTab(); + $this->get(route('admin.prelim_definitions.index'))->assertRedirect(route('dashboard')); + actAsAdmin(); + $this->get(route('admin.prelim_definitions.index'))->assertViewIs('admin.prelim_definitions.index'); + }); + it('lists existing prelim definitions', function () { + $audition = Audition::factory()->create(); + $prelim = PrelimDefinition::create([ + 'audition_id' => $audition->id, + 'room_id' => 0, + 'scoring_guide_id' => 0, + 'passing_score' => 75, + ]); + actAsAdmin(); + $this->get(route('admin.prelim_definitions.index')) + ->assertViewIs('admin.prelim_definitions.index') + ->assertSee($audition->name); + }); +}); + +describe('PrelimDefinitionController::create', function () { + it('denies access to a non-admin user', function () { + $this->get(route('admin.prelim_definitions.create'))->assertRedirect(route('home')); + actAsNormal(); + $this->get(route('admin.prelim_definitions.create'))->assertRedirect(route('dashboard')); + actAsTab(); + $this->get(route('admin.prelim_definitions.create'))->assertRedirect(route('dashboard')); + actAsAdmin(); + $this->get(route('admin.prelim_definitions.create'))->assertViewIs('admin.prelim_definitions.createOrUpdate'); + }); +}); + +describe('PrelimDefinitionController::store', function () { + beforeEach(function () { + $this->audition = Audition::factory()->create(); + }); + it('denies access to a non-admin user', function () { + $this->post(route('admin.prelim_definitions.store'))->assertRedirect(route('home')); + actAsNormal(); + $this->post(route('admin.prelim_definitions.store'))->assertRedirect(route('dashboard')); + actAsTab(); + $this->post(route('admin.prelim_definitions.store'))->assertRedirect(route('dashboard')); + + }); + it('can store a new prelim audition', function () { + actAsAdmin(); + $response = $this->post(route('admin.prelim_definitions.store'), [ + 'audition_id' => $this->audition->id, + 'room_id' => 0, + 'scoring_guide_id' => 0, + 'passing_score' => 75, + ]); + + $response + ->assertRedirect(route('admin.prelim_definitions.index')) + ->assertSessionDoesntHaveErrors(); + }); + it('will not allow us to create two prelims for the same audition', function () { + actAsAdmin(); + PrelimDefinition::create([ + 'audition_id' => $this->audition->id, + 'room_id' => 0, + 'scoring_guide_id' => 0, + 'passing_score' => 75, + ]); + + $response = $this->from(route('admin.prelim_definitions.create')) + ->post(route('admin.prelim_definitions.store'), [ + 'audition_id' => $this->audition->id, + 'room_id' => 0, + 'scoring_guide_id' => 0, + 'passing_score' => 75, + ]); + $response->assertSessionHasErrors('audition_id') + ->assertRedirect(route('admin.prelim_definitions.create')); + }); +});