From c5fd3f9d79173aedd13b7647e6527333f43c2b0c Mon Sep 17 00:00:00 2001 From: ericasch6 Date: Sat, 15 Aug 2026 13:35:46 +0200 Subject: [PATCH] migrations and models adjusted --- app/Http/Controllers/RoomController.php | 11 + app/Http/Controllers/VoteController.php | 10 + app/Models/Player.php | 30 +- app/Models/Room.php | 29 ++ app/Models/Vote.php | 4 +- .../2026_08_14_164132_create_rooms_table.php | 1 + ...2026_08_14_164139_create_players_table.php | 3 +- .../2026_08_14_164147_create_votes_table.php | 2 +- resources/js/app.ts | 20 +- resources/js/layouts/PublicLayout.vue | 46 ++ .../js/layouts/auth/AuthSimpleLayout.vue | 4 +- resources/js/pages/Welcome.vue | 436 +----------------- resources/js/pages/rooms/CreateRoom.vue | 7 + resources/js/types/auth.ts | 2 +- routes/room.php | 6 + routes/web.php | 5 +- 16 files changed, 157 insertions(+), 459 deletions(-) create mode 100644 app/Http/Controllers/RoomController.php create mode 100644 app/Http/Controllers/VoteController.php create mode 100644 resources/js/layouts/PublicLayout.vue create mode 100644 resources/js/pages/rooms/CreateRoom.vue create mode 100644 routes/room.php diff --git a/app/Http/Controllers/RoomController.php b/app/Http/Controllers/RoomController.php new file mode 100644 index 0000000..34f1603 --- /dev/null +++ b/app/Http/Controllers/RoomController.php @@ -0,0 +1,11 @@ + 'boolean', + 'last_seen_at' => 'datetime', ]; } @@ -36,4 +38,30 @@ class Player extends Model { return $this->belongsTo(User::class); } + + public function currentVote(): ?Vote + { + return $this->votes() + ->where('round', $this->room->current_round) + ->first(); + } + + public function hasVoted(): bool + { + return $this->votes() + ->where('round', $this->room->current_round) + ->exists(); + } + + public function isModerator(): bool + { + return $this->is_moderator; + } + + public function markAsSeen(): void + { + $this->update([ + 'last_seen_at' => now(), + ]); + } } diff --git a/app/Models/Room.php b/app/Models/Room.php index 3aac27c..c1a85c9 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Override; class Room extends Model { @@ -29,10 +30,38 @@ class Room extends Model ]; } + protected static function booted() + { + static::creating(function (Room $room) { + $room->join_code ??= static::generateJoinCode(); + }); + } + + private static function generateJoinCode(): string + { + $alphabet = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; + + do { + $code = ''; + + for($i = 0; $i < 6; $i++) { + $code .= $alphabet[random_int(0,strlen($alphabet)-1)]; + } + } while (static::where('join_code', $code)->exists()); + + return $code; + + } + public function players(): HasMany { return $this->hasMany(Player::class); } + + public function vote(): HasMany + { + return $this->hasMany(Vote::class); + } } diff --git a/app/Models/Vote.php b/app/Models/Vote.php index 44a6833..ea9ff46 100644 --- a/app/Models/Vote.php +++ b/app/Models/Vote.php @@ -9,7 +9,9 @@ class Vote extends Model { protected $fillable = [ 'round', - 'value', + 'value', + 'room_id', + 'player_id' ]; diff --git a/database/migrations/2026_08_14_164132_create_rooms_table.php b/database/migrations/2026_08_14_164132_create_rooms_table.php index 4881c67..3b31fb8 100644 --- a/database/migrations/2026_08_14_164132_create_rooms_table.php +++ b/database/migrations/2026_08_14_164132_create_rooms_table.php @@ -15,6 +15,7 @@ return new class extends Migration $table->uuid('id')->primary(); $table->string('title', 100)->nullable(); $table->json('deck_config'); + $table->string('join_code', 6)->unique(); $table->unsignedInteger('current_round')->default(1); $table->timestamp('revealed_at')->nullable(); $table->unsignedBigInteger('state_version')->default(1); diff --git a/database/migrations/2026_08_14_164139_create_players_table.php b/database/migrations/2026_08_14_164139_create_players_table.php index 9bd515c..8ef54df 100644 --- a/database/migrations/2026_08_14_164139_create_players_table.php +++ b/database/migrations/2026_08_14_164139_create_players_table.php @@ -17,8 +17,9 @@ return new class extends Migration $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); $table->string('name', 50); $table->boolean('is_moderator')->default(false); + $table->timestamp('last_seen_at')->nullable(); $table->timestamps(); - $table->unique(['room_id', 'user_id']); + $table->unique(['room_id', 'name']); }); } diff --git a/database/migrations/2026_08_14_164147_create_votes_table.php b/database/migrations/2026_08_14_164147_create_votes_table.php index c481d80..e7d0f16 100644 --- a/database/migrations/2026_08_14_164147_create_votes_table.php +++ b/database/migrations/2026_08_14_164147_create_votes_table.php @@ -18,7 +18,7 @@ return new class extends Migration $table->unsignedInteger('round'); $table->string('value', 16); $table->timestamps(); - $table->unique(['player_id', 'room']); + $table->unique(['player_id', 'room_id', 'round']); }); } diff --git a/resources/js/app.ts b/resources/js/app.ts index 2ed2760..97c2594 100644 --- a/resources/js/app.ts +++ b/resources/js/app.ts @@ -1,26 +1,18 @@ import { createInertiaApp } from '@inertiajs/vue3'; import { initializeTheme } from '@/composables/useAppearance'; -import AppLayout from '@/layouts/AppLayout.vue'; -import AuthLayout from '@/layouts/AuthLayout.vue'; -import SettingsLayout from '@/layouts/settings/Layout.vue'; +import PublicLayout from './layouts/PublicLayout.vue'; import { initializeFlashToast } from '@/lib/flashToast'; const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; + createInertiaApp({ title: (title) => (title ? `${title} - ${appName}` : appName), - layout: (name) => { - switch (true) { - case name === 'Welcome': - return null; - case name.startsWith('auth/'): - return AuthLayout; - case name.startsWith('settings/'): - return [AppLayout, SettingsLayout]; - default: - return AppLayout; - } + + layout: () => { + return PublicLayout; }, + progress: { color: '#4B5563', }, diff --git a/resources/js/layouts/PublicLayout.vue b/resources/js/layouts/PublicLayout.vue new file mode 100644 index 0000000..1e9b6fc --- /dev/null +++ b/resources/js/layouts/PublicLayout.vue @@ -0,0 +1,46 @@ + + + diff --git a/resources/js/layouts/auth/AuthSimpleLayout.vue b/resources/js/layouts/auth/AuthSimpleLayout.vue index b54c094..ce5f554 100644 --- a/resources/js/layouts/auth/AuthSimpleLayout.vue +++ b/resources/js/layouts/auth/AuthSimpleLayout.vue @@ -1,7 +1,7 @@ diff --git a/resources/js/pages/rooms/CreateRoom.vue b/resources/js/pages/rooms/CreateRoom.vue new file mode 100644 index 0000000..88781d7 --- /dev/null +++ b/resources/js/pages/rooms/CreateRoom.vue @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/resources/js/types/auth.ts b/resources/js/types/auth.ts index a26c2f5..f06f73d 100644 --- a/resources/js/types/auth.ts +++ b/resources/js/types/auth.ts @@ -11,7 +11,7 @@ export type User = { }; export type Auth = { - user: User; + user: User | null; }; export type Passkey = { diff --git a/routes/room.php b/routes/room.php new file mode 100644 index 0000000..e0323dc --- /dev/null +++ b/routes/room.php @@ -0,0 +1,6 @@ +name('room.create'); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 4f0de56..a7eb7f0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,11 +1,10 @@ name('home'); +require __DIR__.'/settings.php'; +require __DIR__.'/room.php'; Route::middleware(['auth', 'verified'])->group(function () { Route::inertia('dashboard', 'Dashboard')->name('dashboard'); }); -require __DIR__.'/settings.php';