package com.danielbohry.stocks.client; import com.danielbohry.stocks.exception.UnauthorizedException; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.Cacheable; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; @Component @RequiredArgsConstructor public class AuthClient { private final RestTemplate rest; @Value("${auth.api}") private String BASE_URL; @Cacheable(value = "current", key = "#token") public CurrentUser current(String token) { HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", token); HttpEntity> entity = new HttpEntity<>(null, headers); try { ResponseEntity response = rest.exchange(BASE_URL + "/users/current", HttpMethod.GET, entity, CurrentUser.class); if (response.getStatusCode() == HttpStatus.OK) { return response.getBody(); } else { throw new UnauthorizedException("Unexpected response status: " + response.getStatusCode()); } } catch (HttpClientErrorException e) { throw new UnauthorizedException("Error: " + e.getStatusCode() + " - " + e.getResponseBodyAsString()); } catch (Exception e) { throw new UnauthorizedException("An error occurred: " + e.getMessage()); } } @Data @AllArgsConstructor @NoArgsConstructor public static class CurrentUser { private String id; private String username; private List roles; } }