Resuelve primero la instancia del cliente y luego la del tipo de sitio cuando existe contexto de tenant. Adapta SMTP y Telepagos, con tokens identificados por instancia y version de credenciales. Separa la edicion de instancias de sus asociaciones y conserva el guardado por cliente creando una instancia nueva. Impide eliminar instancias en uso y adapta las pruebas existentes, incluida la herencia SMTP.
41 lines
1.4 KiB
PHP
41 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Integration\Services;
|
|
|
|
use App\Domains\Integration\Models\IntegrationInstance;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class IntegrationInstanceService
|
|
{
|
|
public function create(array $data): IntegrationInstance
|
|
{
|
|
return IntegrationInstance::create($data);
|
|
}
|
|
|
|
public function update(IntegrationInstance $instance, array $data): IntegrationInstance
|
|
{
|
|
return DB::transaction(function () use ($instance, $data): IntegrationInstance {
|
|
$instance = IntegrationInstance::query()->lockForUpdate()->findOrFail($instance->id);
|
|
$cacheKey = $instance->tokenCacheKey();
|
|
$instance->update($data);
|
|
if (array_key_exists('integration_data', $data)) {
|
|
DB::afterCommit(fn () => Cache::forget($cacheKey));
|
|
}
|
|
|
|
return $instance;
|
|
});
|
|
}
|
|
|
|
public function delete(IntegrationInstance $instance): void
|
|
{
|
|
DB::transaction(function () use ($instance): void {
|
|
$instance = IntegrationInstance::query()->lockForUpdate()->findOrFail($instance->id);
|
|
abort_if($instance->clientIntegrations()->exists() || $instance->websiteTypeIntegrations()->exists(), 409, 'Unlink the instance before deleting it.');
|
|
$cacheKey = $instance->tokenCacheKey();
|
|
$instance->delete();
|
|
DB::afterCommit(fn () => Cache::forget($cacheKey));
|
|
});
|
|
}
|
|
}
|