build: initialize RetroHub with Laravel, Inertia, Vue, and Horizon

This commit is contained in:
2026-08-10 13:45:18 +02:00
commit 717db65139
218 changed files with 28356 additions and 0 deletions
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('consoles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->string('icon_path')->nullable();
$table->json('rom_extensions');
$table->integer('igdb_platform_id')->nullable();
$table->integer('tgdb_platform_id')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('consoles');
}
};
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('games', function (Blueprint $table) {
$table->id();
$table->foreignId('console_id')->constrained()->cascadeOnDelete();
$table->string('title');
$table->string('slug');
$table->integer('igdb_id')->nullable();
$table->integer('tgdb_id')->nullable();
$table->text('description')->nullable();
$table->integer('release_year')->nullable();
$table->string('developer')->nullable();
$table->string('publisher')->nullable();
$table->string('genre')->nullable();
$table->decimal('rating', 3, 1)->nullable();
$table->string('cover_path')->nullable();
$table->string('thumbnail_path')->nullable();
$table->timestamps();
$table->unique(['console_id', 'slug']);
});
}
public function down(): void
{
Schema::dropIfExists('games');
}
};
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('rom_files', function (Blueprint $table) {
$table->id();
$table->foreignId('game_id')->constrained()->cascadeOnDelete();
$table->string('file_path');
$table->string('file_name');
$table->bigInteger('file_size');
$table->string('file_hash')->unique();
$table->string('region')->nullable();
$table->string('language')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('rom_files');
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('save_files', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->foreignId('game_id')->constrained()->cascadeOnDelete();
$table->string('file_path');
$table->string('file_name');
$table->bigInteger('file_size');
$table->timestamp('last_synced_at')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('save_files');
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('user_settings', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('setting_key');
$table->text('setting_value')->nullable();
$table->timestamps();
$table->unique(['user_id', 'setting_key']);
});
}
public function down(): void
{
Schema::dropIfExists('user_settings');
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
public function down(): void
{
Schema::dropIfExists('password_reset_tokens');
}
};
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
}
public function down(): void
{
Schema::dropIfExists('sessions');
}
};
@@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('webdav_accounts', function (Blueprint $table): void {
$table->id();
// Credentials
$table->string('username')->unique();
$table->text('password_encrypted');
// State
$table->boolean('enabled')->default(true);
// Optional relation to application user
$table->unsignedBigInteger('user_id')->nullable()->index();
// Display name
$table->string('display_name')->nullable();
// Meta / extensibility
$table->json('meta')->nullable();
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->nullOnDelete();
});
}
public function down(): void
{
Schema::dropIfExists('webdav_accounts');
}
};