intervle - commit 2c7a1a4
feat: create endpoint and submission logic which returns results2c7a1a42a7b19d346970029391294debf4126e80LukeJ<luke.jones.2567@gmail.com>2026-03-08T12:58:17Zdiff --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']);