Luke Jones

intervle - commit 2c7a1a4

feat: create endpoint and submission logic which returns results2c7a1a42a7b19d346970029391294debf4126e80LukeJ<luke.jones.2567@gmail.com>2026-03-08T12:58:17Z
diff --git a/app/Http/Controllers/GameController.php b/app/Http/Controllers/GameController.php index 6295313..5c382f5 100644 --- a/app/Http/Controllers/GameController.php +++ b/app/Http/Controllers/GameController.php @@ -36,6 +36,32 @@ class GameController extends Controller return $seed; } - return view('game.show', compact('events')); + public function submit(Request $request, string $date) + { + $seed = $this->getSeedFromDate($date); + + if ($seed == -1) { + return response('', 400); + } + + $submitted = $request->input('order'); + + $correct = Event::dailyRandomOrdered($seed) + ->pluck('id') + ->toArray(); + + $results = []; + + foreach ($submitted as $index => $eventId) { + $results[] = [ + 'id' => $eventId, + 'correct' => ($correct[$index] ?? null) == $eventId + ]; + } + + return response()->json([ + 'correct_order' => $correct, + 'results' => $results + ]); } } diff --git a/app/Models/Event.php b/app/Models/Event.php index c3f999a..4c166cb 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -22,4 +22,12 @@ class Event extends Model ->orderByRaw("md5(id::text || ?)", [$seed]) ->limit(5); } + + public function scopeDailyRandomOrdered($query, $seed) + { + return $query + ->orderByRaw("md5(id::text || ?)", [$seed]) + ->limit(5) + ->orderBy('date', 'desc'); + } } diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0..934b8f2 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,40 @@ import './bootstrap'; + +document.addEventListener('DOMContentLoaded', () => { + if (/^\/(today|\d{8})\/?$/.test(window.location.pathname)) { + const currentDate = window.location.pathname; + + const eventsContainer = document.getElementById('events-container'); + if (eventsContainer) { + const eventContainers = eventsContainer.querySelectorAll('.event-container'); + eventContainers.forEach(eventContainer => { + // will add dragging logic later + }); + } + + const submitOrderBtn = document.getElementById('submit-order-button'); + + if (submitOrderBtn) { + const token = document.querySelector('meta[name="csrf-token"]')?.content; + submitOrderBtn.addEventListener('click', () => { + const order = [...document.querySelectorAll('.event-container')] + .map(e => parseInt(e.dataset.event)); + + fetch(`${currentDate}/submit`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': token + }, + body: JSON.stringify({ order }) + }) + .then(res => res.json()) + .then(data => { + console.log(data); + }); + + submitOrderBtn.remove(); + }); + } + } +}); diff --git a/resources/views/game/show.blade.php b/resources/views/game/show.blade.php index 30e97e3..3ad8018 100644 --- a/resources/views/game/show.blade.php +++ b/resources/views/game/show.blade.php @@ -12,6 +12,7 @@ </div> @endforeach </div> + <button id="submit-order-button">Submit</button> </div> @endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5f53ca5..314d078 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -5,6 +5,8 @@ <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{ config('app.name', 'Intervle') }}</title> + <meta name="csrf-token" content="{{ csrf_token() }}"> + @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) @vite(['resources/css/app.css', 'resources/js/app.js', 'resources/css/game.css']) @endif diff --git a/routes/web.php b/routes/web.php index 88fbe25..84cf5d6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,3 +7,5 @@ use Illuminate\Support\Facades\Route; Route::redirect('/', '/today'); Route::get('/{date}', [GameController::class, 'show']); + +Route::post('/{date}/submit', [GameController::class, 'submit']);