feat(domains): update unique constraint to composite with type and provider
- Remove single unique constraint on domain name - Add composite unique constraint on name, domain_type, and provider_type - Update Filament domain form validation with custom unique rule - Add descriptive validation message for duplicate domains
This commit is contained in:
@@ -9,7 +9,9 @@ use Filament\Forms\Components\Select;
|
|||||||
use Filament\Forms\Components\TextInput;
|
use Filament\Forms\Components\TextInput;
|
||||||
use Filament\Forms\Components\ToggleButtons;
|
use Filament\Forms\Components\ToggleButtons;
|
||||||
use Filament\Infolists\Components\TextEntry;
|
use Filament\Infolists\Components\TextEntry;
|
||||||
|
use Filament\Schemas\Components\Utilities\Get;
|
||||||
use Filament\Schemas\Schema;
|
use Filament\Schemas\Schema;
|
||||||
|
use Illuminate\Validation\Rules\Unique;
|
||||||
|
|
||||||
class DomainForm
|
class DomainForm
|
||||||
{
|
{
|
||||||
@@ -20,7 +22,19 @@ class DomainForm
|
|||||||
TextInput::make('name')
|
TextInput::make('name')
|
||||||
->columnSpan(1)
|
->columnSpan(1)
|
||||||
->helperText('Domain name: example.com')
|
->helperText('Domain name: example.com')
|
||||||
->required(),
|
->required()
|
||||||
|
->unique(
|
||||||
|
table: 'domains',
|
||||||
|
ignoreRecord: true,
|
||||||
|
modifyRuleUsing: function (Unique $rule, Get $get) {
|
||||||
|
return $rule
|
||||||
|
->where('domain_type', $get('domain_type'))
|
||||||
|
->where('provider_type', $get('provider_type'));
|
||||||
|
},
|
||||||
|
)
|
||||||
|
->validationMessages([
|
||||||
|
'unique' => 'The domain name already exists for this type and provider.',
|
||||||
|
]),
|
||||||
TextInput::make('daily_mailbox_limit')
|
TextInput::make('daily_mailbox_limit')
|
||||||
->integer()
|
->integer()
|
||||||
->minValue(1)
|
->minValue(1)
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('domains', function (Blueprint $table) {
|
||||||
|
// Drop the existing unique constraint on 'name' column
|
||||||
|
$table->dropUnique('domains_name_unique');
|
||||||
|
|
||||||
|
// Add a composite unique constraint on name, domain_type, and provider_type
|
||||||
|
// This allows the same domain name with different type combinations
|
||||||
|
$table->unique(['name', 'domain_type', 'provider_type'], 'domains_name_type_provider_unique');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('domains', function (Blueprint $table) {
|
||||||
|
// Drop the composite unique constraint
|
||||||
|
$table->dropUnique('domains_name_type_provider_unique');
|
||||||
|
|
||||||
|
// Restore the original single unique constraint on 'name'
|
||||||
|
$table->unique('name', 'domains_name_unique');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user