package com.vaessl.app.connection; import java.time.Instant; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.springframework.stereotype.Service; import com.vaessl.app.dto.ConnectionRequest; import com.vaessl.app.dto.ConnectionResponse; import com.vaessl.app.dto.ConnectionStatusResponse; import com.vaessl.app.dto.LoginResult; import com.vaessl.app.exception.WrongServiceTypeException; @Service public class ConnectionService { private final Map providerRegistry; private final ConnectionRepository cRepository; public ConnectionService(List providers, ConnectionRepository cRepository) { this.providerRegistry = providers.stream() .collect(Collectors.toMap(ConnectionProvider::getServiceType, p -> p)); this.cRepository = cRepository; } public LoginResult login(ConnectionRequest request) { ConnectionProvider provider = providerRegistry.get(request.serviceType()); if (provider == null) { throw new WrongServiceTypeException(); } provider.checkCredentials(request); ConnectionResponse response = provider.authenticate(request); ConnectionEntity existing = provider.findUniqueConnectionEntry(request); ConnectionEntity saved; if (existing != null) { provider.updateToRepository(existing, response); saved = existing; } else { ConnectionEntity newEntity = provider.connectionToEntity(request, response); saved = cRepository.save(newEntity); } return new LoginResult(saved.getId(), response.expiresAt()); } public ConnectionStatusResponse getConnectionStatus(String serviceType, Long connectionId) { ConnectionEntity entity = cRepository.findById(connectionId).orElse(null); if (entity == null) return null; ConnectionProvider provider = providerRegistry.get(serviceType); Instant expiresAt = (provider != null) ? provider.getTokenExpiry(entity) : null; boolean connected = expiresAt == null || expiresAt.isAfter(Instant.now()); return new ConnectionStatusResponse(serviceType, entity.getAppUrl(), entity.getUsername(), expiresAt, connected); } }