From e4146288f1286a3843628243bc03b413898a301c Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 4 Sep 2026 12:47:29 -0300 Subject: [PATCH] refactor(integration): generalizar el requisito de configuracion Renombra requires_client_configuration a requires_configuration conservando los valores existentes y su rollback. Actualiza el modelo, la validacion, los seeders y los consumidores del campo para permitir configuraciones de cliente o tipo de sitio. --- .../Integration/Models/Integration.php | 4 ++-- .../Requests/StoreIntegrationRequest.php | 2 +- .../Requests/UpdateIntegrationRequest.php | 2 +- .../Services/BaseIntegrationService.php | 2 +- ..._integration_configuration_requirement.php | 22 +++++++++++++++++++ database/seeders/EmailIntegrationSeeder.php | 2 +- .../seeders/TelepagosIntegrationSeeder.php | 4 ++-- tests/Feature/Integration/MailServiceTest.php | 2 +- .../NotificationMailServiceTest.php | 2 +- tests/Unit/IntegrationInstanceSchemaTest.php | 3 +++ 10 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 database/migrations/2026_09_04_000003_rename_integration_configuration_requirement.php diff --git a/app/Domains/Integration/Models/Integration.php b/app/Domains/Integration/Models/Integration.php index 78b4d9f..ea03ae8 100644 --- a/app/Domains/Integration/Models/Integration.php +++ b/app/Domains/Integration/Models/Integration.php @@ -14,12 +14,12 @@ class Integration extends Model 'name', 'url', 'integration_data_schema', - 'requires_client_configuration', + 'requires_configuration', ]; protected $casts = [ 'integration_data_schema' => 'array', - 'requires_client_configuration' => 'boolean', + 'requires_configuration' => 'boolean', ]; /** @return HasMany */ diff --git a/app/Domains/Integration/Requests/StoreIntegrationRequest.php b/app/Domains/Integration/Requests/StoreIntegrationRequest.php index 9fb824d..cf19bbe 100644 --- a/app/Domains/Integration/Requests/StoreIntegrationRequest.php +++ b/app/Domains/Integration/Requests/StoreIntegrationRequest.php @@ -18,7 +18,7 @@ class StoreIntegrationRequest extends FormRequest 'name' => ['required', 'string', 'max:255'], 'url' => ['nullable', 'url', 'max:255'], 'integration_data_schema' => ['nullable', 'array'], - 'requires_client_configuration' => ['sometimes', 'boolean'], + 'requires_configuration' => ['sometimes', 'boolean'], ]; } } diff --git a/app/Domains/Integration/Requests/UpdateIntegrationRequest.php b/app/Domains/Integration/Requests/UpdateIntegrationRequest.php index 210d27e..3c626ac 100644 --- a/app/Domains/Integration/Requests/UpdateIntegrationRequest.php +++ b/app/Domains/Integration/Requests/UpdateIntegrationRequest.php @@ -19,7 +19,7 @@ class UpdateIntegrationRequest extends FormRequest 'name' => ['sometimes', 'required', 'string', 'max:255'], 'url' => ['nullable', 'url', 'max:255'], 'integration_data_schema' => ['nullable', 'array'], - 'requires_client_configuration' => ['sometimes', 'boolean'], + 'requires_configuration' => ['sometimes', 'boolean'], // the code shouldn't ideally be updatable, but if it is: 'integration_code' => ['sometimes', 'required', 'string', 'unique:integrations,integration_code,'.($integration->id ?? '')], ]; diff --git a/app/Domains/Integration/Services/BaseIntegrationService.php b/app/Domains/Integration/Services/BaseIntegrationService.php index daa638c..865ab56 100644 --- a/app/Domains/Integration/Services/BaseIntegrationService.php +++ b/app/Domains/Integration/Services/BaseIntegrationService.php @@ -108,7 +108,7 @@ abstract class BaseIntegrationService ->where('integration_code', $this->integrationCode) ->first(); - if (! $this->clientIntegration && $this->integration->requires_client_configuration) { + if (! $this->clientIntegration && $this->integration->requires_configuration) { throw new Exception("Client '{$this->clientContext->code}' does not have integration '{$this->integrationCode}' configured."); } } diff --git a/database/migrations/2026_09_04_000003_rename_integration_configuration_requirement.php b/database/migrations/2026_09_04_000003_rename_integration_configuration_requirement.php new file mode 100644 index 0000000..d4bb9ac --- /dev/null +++ b/database/migrations/2026_09_04_000003_rename_integration_configuration_requirement.php @@ -0,0 +1,22 @@ +renameColumn('requires_client_configuration', 'requires_configuration'); + }); + } + + public function down(): void + { + Schema::table('integrations', function (Blueprint $table): void { + $table->renameColumn('requires_configuration', 'requires_client_configuration'); + }); + } +}; diff --git a/database/seeders/EmailIntegrationSeeder.php b/database/seeders/EmailIntegrationSeeder.php index 6217bcf..1eeff2c 100644 --- a/database/seeders/EmailIntegrationSeeder.php +++ b/database/seeders/EmailIntegrationSeeder.php @@ -17,7 +17,7 @@ class EmailIntegrationSeeder extends Seeder [ 'name' => 'Email', 'url' => null, - 'requires_client_configuration' => false, + 'requires_configuration' => false, 'integration_data_schema' => [ 'MAIL_MAILER' => 'required|string|in:smtp', 'MAIL_SCHEME' => 'required|string|in:smtp', diff --git a/database/seeders/TelepagosIntegrationSeeder.php b/database/seeders/TelepagosIntegrationSeeder.php index fad8b4d..bbaf657 100644 --- a/database/seeders/TelepagosIntegrationSeeder.php +++ b/database/seeders/TelepagosIntegrationSeeder.php @@ -17,7 +17,7 @@ class TelepagosIntegrationSeeder extends Seeder [ 'name' => 'Telepagos', 'url' => 'https://api.telepagos.com.ar', - 'requires_client_configuration' => true, + 'requires_configuration' => true, 'integration_data_schema' => [ 'username' => 'required|string', 'password' => 'required|string', @@ -30,7 +30,7 @@ class TelepagosIntegrationSeeder extends Seeder [ 'name' => 'Telepagos Homologación', 'url' => 'https://api.homo.telepagos.com.ar', - 'requires_client_configuration' => true, + 'requires_configuration' => true, 'integration_data_schema' => [ 'username' => 'required|string', 'password' => 'required|string', diff --git a/tests/Feature/Integration/MailServiceTest.php b/tests/Feature/Integration/MailServiceTest.php index 622e976..a252681 100644 --- a/tests/Feature/Integration/MailServiceTest.php +++ b/tests/Feature/Integration/MailServiceTest.php @@ -65,7 +65,7 @@ class MailServiceTest extends TestCase Integration::create([ 'integration_code' => 'email', 'name' => 'Email', - 'requires_client_configuration' => false, + 'requires_configuration' => false, ]); $service = (new MailService)->forTenant($tenant->codigo); diff --git a/tests/Feature/Notification/NotificationMailServiceTest.php b/tests/Feature/Notification/NotificationMailServiceTest.php index 26dbc29..db1e6eb 100644 --- a/tests/Feature/Notification/NotificationMailServiceTest.php +++ b/tests/Feature/Notification/NotificationMailServiceTest.php @@ -35,7 +35,7 @@ class NotificationMailServiceTest extends TestCase 'integration_code' => 'email', 'name' => 'Email', 'url' => null, - 'requires_client_configuration' => false, + 'requires_configuration' => false, 'integration_data_schema' => [], ]); $header = Attachment::query()->create([ diff --git a/tests/Unit/IntegrationInstanceSchemaTest.php b/tests/Unit/IntegrationInstanceSchemaTest.php index eddb3b9..d00560c 100644 --- a/tests/Unit/IntegrationInstanceSchemaTest.php +++ b/tests/Unit/IntegrationInstanceSchemaTest.php @@ -53,6 +53,9 @@ class IntegrationInstanceSchemaTest extends TestCase $table->string('codigo')->unique(); }); (require __DIR__.'/../../database/migrations/2026_07_03_000001_create_integrations_table.php')->up(); + $schema->table('integrations', function (Blueprint $table): void { + $table->boolean('requires_client_configuration')->default(true); + }); $schema->create('client_integrations', function (Blueprint $table): void { $table->id(); $table->foreignId('client_id')->constrained('clients')->cascadeOnDelete();