integrations() ->where('integration_code', $integrationCode) ->first(); } /** @return Collection */ public function getAllForClient(Client $client): Collection { return $client->integrations()->with('integration')->get(); } public function updateOrCreateIntegration( Client $client, Integration $integration, array $data, ): ClientIntegration { return DB::transaction(function () use ($client, $integration, $data): ClientIntegration { $clientIntegration = ClientIntegration::query()->updateOrCreate( [ 'client_id' => $client->id, 'integration_code' => $integration->integration_code, ], ['integration_data' => $data], ); $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, }; } }