nimuli/database/migrations
boban deb5f310a1 fix(bio): plan-aware URL + plan-seeder + ulid→slug fix
- Migration: add bio_pages_limit to plans, make limit cols nullable (agency=unlimited)
- PlanSeeder: 4 plans (free/pro/business/agency) with tier/features/bio_pages_limit
- workspaces:assign-default-plan command: assigns free plan to unassigned workspaces
- BioPage::publicUrl(): free=apex-path, pro+=subdomain, custom=custom-domain
  - Security: str_ends_with check uses '.'.$apex to prevent evilnimu.li bypass
- BioPage::shortPublicUrl(): URL without scheme for display
- PlanLimitsService: use bio_pages_limit column (was features['bio_pages']), null=unlimited
- BioPageController: fix $bio → $page variable (view expects $page)
- Bio index/edit views: use publicUrl()/shortPublicUrl(), not hardcoded ULID URLs
- Bio edit view: publicUrlBase/displayUrlBase from component (plan-aware prefix)
- Create-bio modal: plan-aware URL prefix display
- PlanFactory/WorkspaceFactory: free()/pro() states for tests
- Tests: PublicUrlTest (5 cases), Free404FixTest (3 cases)

Known pre-existing failure (not caused by this change):
- Tests\Feature\Auth\EmailVerificationTest::email can be verified

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:44:54 +02:00
..
0001_01_01_000000_create_users_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
0001_01_01_000001_create_cache_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
0001_01_01_000002_create_jobs_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2022_12_14_083707_create_settings_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212318_create_customer_columns.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212318_create_permission_tables.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212319_create_subscriptions_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212320_create_subscription_items_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212321_add_meter_id_to_subscription_items_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212322_add_meter_event_name_to_subscription_items_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212323_create_activity_log_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212323_create_media_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_212329_create_personal_access_tokens_table.php feat: initial Nimuli scaffold with Laravel 12, Livewire 3, Octane, Reverb, Docker 2026-05-15 23:51:57 +02:00
2026_05_15_299000_create_plans_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300000_create_workspaces_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300001_create_workspace_members_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300002_create_workspace_invitations_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300003_create_billing_profiles_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300004_add_payment_method_columns_to_workspaces_table.php fix(billing): pm_type/pm_last_four migration, narrow CSRF exclusion, EU paper size 2026-05-16 01:46:54 +02:00
2026_05_15_300010_create_domains_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300020_create_links_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300021_create_link_variants_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300030_create_qr_codes_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300040_create_bio_pages_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300041_create_bio_blocks_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300050_create_clicks_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300051_create_clicks_hourly_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300052_create_clicks_daily_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300053_create_clicks_by_referrer_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300054_create_clicks_by_utm_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_15_300070_create_translations_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300080_create_webhooks_table.php feat(db): add all Phase 1 migrations 2026-05-16 00:04:01 +02:00
2026_05_15_300081_create_webhook_deliveries_table.php fix(db): null-safe unique keys on rollup tables, workspace slug unique, link slug scoping 2026-05-16 00:11:39 +02:00
2026_05_16_123150_create_notifications_table.php feat: QR wizard, UTM Builder, A/B variants, AI features, analytics URL filters 2026-05-16 15:14:19 +02:00
2026_05_16_125714_extend_qr_codes_type_enum.php fix: bio public /b/{slug} route + QR types + code cleanup 2026-05-16 16:41:05 +02:00
2026_05_17_500000_add_bio_pages_limit_and_agency_plan.php fix(bio): plan-aware URL + plan-seeder + ulid→slug fix 2026-05-17 22:44:54 +02:00