package com.vaessl.app.connection; import java.time.Instant; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; import com.vaessl.app.dto.ConnectionRequest; import com.vaessl.app.dto.ConnectionResponse; import static com.vaessl.app.connection.Endpoint.*; @Component public class HomeBoxConnectionProvider implements ConnectionProvider { private final RestClient.Builder restClientBuilder; private final ConnectionRepository cRepository; public HomeBoxConnectionProvider(RestClient.Builder restClientBuilder, ConnectionRepository cRepository) { this.restClientBuilder = restClientBuilder; this.cRepository = cRepository; } @Override public String getServiceType() { return "HOMEBOX"; } @Override public ConnectionResponse authenticate(ConnectionRequest request) { Map homeboxPayload = Map.of("username", request.credentials().get("username"), "password", request.credentials().get("password"), "stayLoggedIn", request.stayLoggedIn()); HomeboxLoginResponse hbResponse = restClientBuilder.baseUrl(request.appUrl()) .build() .post() .uri(HOMEBOX_LOGIN.getValue()) .body(homeboxPayload) .retrieve() .body(HomeboxLoginResponse.class); if (hbResponse == null) { throw new IllegalStateException("Remote API returned an empty body for " + request.appUrl()); } Map attachmentToken = new HashMap<>(); attachmentToken.put("attachmentToken", hbResponse.attachmentToken()); return new ConnectionResponse(hbResponse.token(), hbResponse.expiresAt(), attachmentToken); } @Override public ConnectionEntity connectionToEntity(ConnectionRequest request, ConnectionResponse response) { return HomeboxEntity.from(request, response); } @Override public void updateToRepository(ConnectionEntity existing, ConnectionResponse response) { if (existing instanceof HomeboxEntity hbE) { hbE.setToken(response.token()); hbE.setExpiresAt(response.expiresAt()); hbE.setAttachmentToken(response.getExtraVar("attachmentToken")); cRepository.save(hbE); } } private record HomeboxLoginResponse(String token, String attachmentToken, Instant expiresAt) { } }