package com.vaessl.app.connection; 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.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 ConnectionResponse 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); if (existing != null) { provider.updateToRepository(existing, response); } else { ConnectionEntity newEntity = provider.connectionToEntity(request, response); cRepository.save(newEntity); } return response; } }