integrations() ->with(['integration', 'integrationInstance']) ->where('integration_code', $integrationCode) ->first(); } /** @return Collection */ public function getAllForClient(Client $client): Collection { return $client->integrations()->with(['integration', 'integrationInstance'])->get(); } public function updateOrCreateIntegration( Client $client, Integration $integration, array $data, ): ClientIntegration { return DB::transaction(function () use ($client, $integration, $data): ClientIntegration { // Legacy configuration endpoint replaces this client's instance only. $instance = app(IntegrationInstanceService::class)->create([ 'integration_code' => $integration->integration_code, 'name' => $integration->name.' / '.$client->name, 'integration_data' => $data, ]); $clientIntegration = ClientIntegration::query()->updateOrCreate( [ 'client_id' => $client->id, 'integration_code' => $integration->integration_code, ], ['integration_instance_id' => $instance->id], ); $service = $this->resolveService($integration->integration_code); $service?->forClient($client)->onSetup(); return $clientIntegration; }); } protected function resolveService(string $integrationCode): ?BaseIntegrationService { return match ($integrationCode) { 'email' => new MailService, 'telepagos', 'telepagos_homo' => new TelepagosIntegrationService($integrationCode), default => null, }; } }