diff --git a/database/migrations/2026_05_15_300000_create_workspaces_table.php b/database/migrations/2026_05_15_300000_create_workspaces_table.php index 5e04fa1..274926a 100644 --- a/database/migrations/2026_05_15_300000_create_workspaces_table.php +++ b/database/migrations/2026_05_15_300000_create_workspaces_table.php @@ -12,7 +12,7 @@ return new class extends Migration $table->id(); $table->string('ulid', 26)->unique(); $table->string('name'); - $table->string('slug', 64); + $table->string('slug', 64)->unique(); $table->foreignId('owner_id')->constrained('users')->cascadeOnDelete(); $table->foreignId('plan_id')->nullable()->constrained('plans')->nullOnDelete(); $table->timestamp('trial_ends_at')->nullable(); diff --git a/database/migrations/2026_05_15_300002_create_workspace_invitations_table.php b/database/migrations/2026_05_15_300002_create_workspace_invitations_table.php index 2e4c936..6b3c93d 100644 --- a/database/migrations/2026_05_15_300002_create_workspace_invitations_table.php +++ b/database/migrations/2026_05_15_300002_create_workspace_invitations_table.php @@ -18,6 +18,7 @@ return new class extends Migration $table->timestamp('expires_at'); $table->timestamp('accepted_at')->nullable(); $table->timestamps(); + $table->index(['workspace_id', 'email']); }); } diff --git a/database/migrations/2026_05_15_300020_create_links_table.php b/database/migrations/2026_05_15_300020_create_links_table.php index b43804a..63d724f 100644 --- a/database/migrations/2026_05_15_300020_create_links_table.php +++ b/database/migrations/2026_05_15_300020_create_links_table.php @@ -29,7 +29,7 @@ return new class extends Migration $table->foreignId('updated_by')->nullable()->constrained('users')->nullOnDelete(); $table->softDeletes(); $table->timestamps(); - $table->unique(['domain_id', 'slug']); + $table->unique(['workspace_id', 'domain_id', 'slug'], 'links_workspace_domain_slug_unique'); $table->index('workspace_id'); $table->index('status'); }); diff --git a/database/migrations/2026_05_15_300040_create_bio_pages_table.php b/database/migrations/2026_05_15_300040_create_bio_pages_table.php index 1e2f952..628a676 100644 --- a/database/migrations/2026_05_15_300040_create_bio_pages_table.php +++ b/database/migrations/2026_05_15_300040_create_bio_pages_table.php @@ -21,7 +21,7 @@ return new class extends Migration $table->boolean('is_published')->default(false); $table->softDeletes(); $table->timestamps(); - $table->unique(['domain_id', 'slug']); + $table->unique(['workspace_id', 'domain_id', 'slug'], 'bio_pages_workspace_domain_slug_unique'); $table->index('workspace_id'); }); } diff --git a/database/migrations/2026_05_15_300051_create_clicks_hourly_table.php b/database/migrations/2026_05_15_300051_create_clicks_hourly_table.php index d30fa68..8462a3c 100644 --- a/database/migrations/2026_05_15_300051_create_clicks_hourly_table.php +++ b/database/migrations/2026_05_15_300051_create_clicks_hourly_table.php @@ -12,8 +12,8 @@ return new class extends Migration $table->id(); $table->foreignId('link_id')->constrained()->cascadeOnDelete(); $table->timestamp('hour'); - $table->string('country', 2)->nullable(); - $table->enum('device', ['desktop', 'mobile', 'tablet', 'bot', 'unknown'])->nullable(); + $table->string('country', 2)->default(''); + $table->enum('device', ['desktop', 'mobile', 'tablet', 'bot', 'unknown'])->default('unknown'); $table->unsignedBigInteger('count')->default(0); $table->unsignedBigInteger('unique_visitors')->default(0); $table->unique(['link_id', 'hour', 'country', 'device']); diff --git a/database/migrations/2026_05_15_300052_create_clicks_daily_table.php b/database/migrations/2026_05_15_300052_create_clicks_daily_table.php index 73b5845..84f440f 100644 --- a/database/migrations/2026_05_15_300052_create_clicks_daily_table.php +++ b/database/migrations/2026_05_15_300052_create_clicks_daily_table.php @@ -12,8 +12,8 @@ return new class extends Migration $table->id(); $table->foreignId('link_id')->constrained()->cascadeOnDelete(); $table->date('day'); - $table->string('country', 2)->nullable(); - $table->enum('device', ['desktop', 'mobile', 'tablet', 'bot', 'unknown'])->nullable(); + $table->string('country', 2)->default(''); + $table->enum('device', ['desktop', 'mobile', 'tablet', 'bot', 'unknown'])->default('unknown'); $table->unsignedBigInteger('count')->default(0); $table->unsignedBigInteger('unique_visitors')->default(0); $table->unique(['link_id', 'day', 'country', 'device']); diff --git a/database/migrations/2026_05_15_300053_create_clicks_by_referrer_table.php b/database/migrations/2026_05_15_300053_create_clicks_by_referrer_table.php index 1c2e40a..4b70f77 100644 --- a/database/migrations/2026_05_15_300053_create_clicks_by_referrer_table.php +++ b/database/migrations/2026_05_15_300053_create_clicks_by_referrer_table.php @@ -12,7 +12,7 @@ return new class extends Migration $table->id(); $table->foreignId('link_id')->constrained()->cascadeOnDelete(); $table->date('day'); - $table->string('referrer_host', 253)->nullable(); + $table->string('referrer_host', 191)->default(''); $table->unsignedBigInteger('count')->default(0); $table->unique(['link_id', 'day', 'referrer_host']); $table->index(['link_id', 'day']); diff --git a/database/migrations/2026_05_15_300054_create_clicks_by_utm_table.php b/database/migrations/2026_05_15_300054_create_clicks_by_utm_table.php index c36c104..d93d9d1 100644 --- a/database/migrations/2026_05_15_300054_create_clicks_by_utm_table.php +++ b/database/migrations/2026_05_15_300054_create_clicks_by_utm_table.php @@ -12,9 +12,9 @@ return new class extends Migration $table->id(); $table->foreignId('link_id')->constrained()->cascadeOnDelete(); $table->date('day'); - $table->string('utm_source', 128)->nullable(); - $table->string('utm_medium', 128)->nullable(); - $table->string('utm_campaign', 128)->nullable(); + $table->string('utm_source', 128)->default(''); + $table->string('utm_medium', 128)->default(''); + $table->string('utm_campaign', 128)->default(''); $table->unsignedBigInteger('count')->default(0); $table->unique(['link_id', 'day', 'utm_source', 'utm_medium', 'utm_campaign'], 'clicks_by_utm_unique'); $table->index(['link_id', 'day']); diff --git a/database/migrations/2026_05_15_300081_create_webhook_deliveries_table.php b/database/migrations/2026_05_15_300081_create_webhook_deliveries_table.php index f502bd9..5b6a306 100644 --- a/database/migrations/2026_05_15_300081_create_webhook_deliveries_table.php +++ b/database/migrations/2026_05_15_300081_create_webhook_deliveries_table.php @@ -12,7 +12,7 @@ return new class extends Migration $table->id(); $table->foreignId('webhook_id')->constrained()->cascadeOnDelete(); $table->string('event', 64); - $table->text('payload'); + $table->json('payload'); $table->enum('status', ['success', 'failed', 'pending'])->default('pending'); $table->unsignedSmallInteger('response_code')->nullable(); $table->unsignedTinyInteger('attempts')->default(1);