Add admin option to reset site.

This commit is contained in:
Matt Young 2025-05-29 18:20:37 -05:00
parent 3a9f5ab123
commit b5cb2a7870
5 changed files with 68 additions and 10 deletions

View File

@ -13,6 +13,7 @@ use App\Models\JudgeAdvancementVote;
use App\Models\NominationEnsembleEntry;
use App\Models\ScoreSheet;
use App\Models\Seat;
use App\Models\Student;
use Illuminate\Support\Facades\DB;
use function auth;
@ -23,20 +24,20 @@ class YearEndCleanup
{
}
public function __invoke(): void
public function __invoke(array $options = []): void
{
$this->cleanup();
$this->cleanup($options);
}
/**
* @param $options array array of reset options - possible values are deleteRooms
* removeAuditionsFromRoom unassignJudges
*
* @throws AuditionAdminException
*/
public function cleanup($options = []): true
public function cleanup(array $options = []): true
{
if (! auth()->user() or ! auth()->user()->is_admin) {
throw new AuditionAdminException('Only administrators may perform this action');
}
@ -54,20 +55,22 @@ class YearEndCleanup
DB::table('entries')->delete();
NominationEnsembleEntry::truncate();
Student::query()->increment('grade');
if (in_array('deleteRooms', $options)) {
DB::table('auditions')->update(['room_id' => null]);
DB::table('auditions')->update(['order_in_room' => null]);
DB::table('room_judges')->truncate();
DB::table('rooms')->truncate();
DB::table('auditions')->update(['order_in_room' => '0']);
DB::table('room_user')->truncate();
DB::table('rooms')->delete();
}
if (in_array('removeAuditionsFromRoom', $options)) {
DB::table('auditions')->update(['room_id' => null]);
DB::table('auditions')->update(['order_in_room' => null]);
DB::table('auditions')->update(['order_in_room' => '0']);
}
if (in_array('unassignJudges', $options)) {
DB::table('room_judges')->truncate();
DB::table('room_user')->truncate();
}
return true;

View File

@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Actions\YearEndProcedures\YearEndCleanup;
use App\Http\Controllers\Controller;
use function auditionLog;
class YearEndResetController extends Controller
{
public function index()
{
return view('admin.year_end_reset');
}
public function execute()
{
$cleanUpProcedure = new YearEndCleanup;
$options = request()->options;
$cleanUpProcedure($options);
auditionLog('Executed year end reset.', []);
return redirect()->route('dashboard')->with('success', 'Year end reset completed');
}
}

View File

@ -0,0 +1,23 @@
<x-layout.app>
<x-layout.page-header>Year End Reset</x-layout.page-header>
<x-card.card class="mt-5 max-w-xl m-auto">
<x-card.heading>Reset Options</x-card.heading>
<x-form.form action="{{ route('admin.year_end_procedures') }}">
<x-form.checkbox name="options[]" label="Delete Rooms" value="deleteRooms" />
<x-form.checkbox name="options[]" label="Remove Auditions From Rooms" value="removeAuditionsFromRoom" />
<x-form.checkbox name="options[]" label="Unassign Judges" value="unassignJudges" />
<x-form.footer class="mb-3" x-data="{ 'showModal': false }" @keydown.escape="showModal = false">
<x-form.button type="button" @click="showModal = true">
Complete Year End Reset
</x-form.button>
<x-modal-body>
<x-slot:title>Confirm Year End Reset</x-slot:title>
Confirm you would like to perform a year end reset. This will delete all seats, scores, entries, and log entries,
as well as any optional data you chose. It will also increment the grade of all students in the database.
This action will result in data loss and cannot be undone.
<x-form.button class="mt-3">Confirm Reset</x-form.button>
</x-modal-body>
</x-form.footer>
</x-form.form>
</x-card.card>
</x-layout.app>

View File

@ -32,6 +32,7 @@
<a href="{{route('admin.export_results')}}" class="block p-2 hover:text-indigo-600">Export Results</a>
<a href="{{route('admin.export_entries')}}" class="block p-2 hover:text-indigo-600">Export Entries</a>
<a href="{{route('admin.print_stand_name_tags')}}" class="block p-2 hover:text-indigo-600">Print Stand Name Tags</a>
<a href="{{route('admin.year_end_procedures')}}" class="block p-2 hover:text-indigo-600">Year End Reset</a>
</div>
</div>
</div>

View File

@ -21,6 +21,7 @@ use App\Http\Controllers\Admin\SchoolController;
use App\Http\Controllers\Admin\ScoringGuideController;
use App\Http\Controllers\Admin\StudentController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\YearEndResetController;
use App\Http\Middleware\CheckIfAdmin;
use Illuminate\Support\Facades\Route;
@ -33,6 +34,10 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
Route::get('/recap', [RecapController::class, 'selectAudition'])->name('admin.recap.selectAudition');
Route::get('/recap/{audition}', [RecapController::class, 'showRecap'])->name('admin.recap.recap');
// Year end prodecures
Route::get('/year_end_procedures', [YearEndResetController::class, 'index'])->name('admin.year_end_procedures');
Route::post('/year_end_procedures', [YearEndResetController::class, 'execute'])->name('admin.year_end_procedures');
Route::post('/auditions/roomUpdate', [
AuditionController::class, 'roomUpdate',
]); // Endpoint for JS assigning auditions to rooms