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'));
+ });
+});