trying hateos

Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
2024-10-23 23:01:57 +02:00
parent 499b6d0c44
commit 1a924ebf6c
6 changed files with 42 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Application" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot"> <configuration default="false" name="Application" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<option name="ACTIVE_PROFILES" value="dev" />
<envs> <envs>
<env name="EUREKA" value="http://localhost:8761/eureka" /> <env name="EUREKA" value="http://localhost:8761/eureka" />
</envs> </envs>

View File

@@ -82,6 +82,10 @@
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.github.ben-manes.caffeine</groupId> <groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId> <artifactId>caffeine</artifactId>

View File

@@ -9,8 +9,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc @EnableWebMvc
public class WebConfig implements WebMvcConfigurer { public class WebConfig implements WebMvcConfigurer {
@Override @Override
public void addCorsMappings(CorsRegistry registry) { public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**"); registry.addMapping("/**");
} }
} }

View File

@@ -1,4 +1,4 @@
package dev.mars3142.fhq.timezone_service.timezone.web.controllers; package dev.mars3142.fhq.timezone_service.timezone.controllers;
import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.TimeApiTimezoneZoneResponse; import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.TimeApiTimezoneZoneResponse;
import dev.mars3142.fhq.timezone_service.timezone.domain.model.response.LocationResponse; import dev.mars3142.fhq.timezone_service.timezone.domain.model.response.LocationResponse;
@@ -7,6 +7,9 @@ import dev.mars3142.fhq.timezone_service.timezone.service.TimeZoneService;
import java.util.Objects; import java.util.Objects;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.val; import lombok.val;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestHeader;
@@ -21,12 +24,15 @@ public class TimeZoneController {
private final TimeZoneService timeZoneService; private final TimeZoneService timeZoneService;
@GetMapping @GetMapping
public TimeZoneResponse getTimeZone(@RequestHeader(value = "X-Forwarded-For", defaultValue = "127.0.0.1") String header) { public HttpEntity<TimeZoneResponse> getTimeZone(
@RequestHeader(value = "X-Forwarded-For", defaultValue = "127.0.0.1") String header) {
val clientIp = header.split(",")[0]; val clientIp = header.split(",")[0];
val ip = timeZoneService.getExternalIp(clientIp); val ip = timeZoneService.getExternalIp(clientIp);
val timezoneInfo = timeZoneService.getTimeZoneInfoByIp(ip); val timezoneInfo = timeZoneService.getTimeZoneInfoByIp(ip);
val posix = timeZoneService.getPosixTimeZone(timezoneInfo.timezone()); val posix = timeZoneService.getPosixTimeZone(timezoneInfo.timezone());
return new TimeZoneResponse(timezoneInfo.timezone(), timezoneInfo.abbreviation(), posix); return new ResponseEntity<>(
TimeZoneResponse.builder().timezone(timezoneInfo.timezone()).abbreviation(timezoneInfo.abbreviation())
.posix_tz(posix).build(), HttpStatus.OK);
} }
@GetMapping("{area}") @GetMapping("{area}")
@@ -36,11 +42,14 @@ public class TimeZoneController {
} }
@GetMapping("{area}/{location}") @GetMapping("{area}/{location}")
public TimeZoneResponse getTimeZoneForLocation(@PathVariable String area, @PathVariable String location) { public HttpEntity<TimeZoneResponse> getTimeZoneForLocation(@PathVariable String area, @PathVariable String location) {
val timezone = area + "/" + location; val timezone = area + "/" + location;
val timezoneInfo = timeZoneService.getTimeZoneInfo(timezone); val timezoneInfo = timeZoneService.getTimeZoneInfo(timezone);
val abbreviation = Objects.requireNonNullElse(timezoneInfo.dstInterval(), new TimeApiTimezoneZoneResponse.Interval(null)).dstName(); val abbreviation = Objects.requireNonNullElse(timezoneInfo.dstInterval(),
new TimeApiTimezoneZoneResponse.Interval(null)).dstName();
val posix = timeZoneService.getPosixTimeZone(timezone); val posix = timeZoneService.getPosixTimeZone(timezone);
return new TimeZoneResponse(timezone, abbreviation, posix); return new ResponseEntity<>(
TimeZoneResponse.builder().timezone(timezone).abbreviation(abbreviation).posix_tz(posix).build(),
HttpStatus.OK);
} }
} }

View File

@@ -1,5 +1,16 @@
package dev.mars3142.fhq.timezone_service.timezone.domain.model.response; package dev.mars3142.fhq.timezone_service.timezone.domain.model.response;
public record TimeZoneResponse(String timezone, String abbreviation, String posix_tz) { import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.hateoas.RepresentationModel;
@Getter
@Builder
@RequiredArgsConstructor
public class TimeZoneResponse extends RepresentationModel<TimeZoneResponse> {
private final String timezone;
private final String abbreviation;
private final String posix_tz;
} }

View File

@@ -5,13 +5,6 @@ import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.Ipify
import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.TimeApiTimezoneZoneResponse; import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.TimeApiTimezoneZoneResponse;
import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.WorldTimeApiIpResponse; import dev.mars3142.fhq.timezone_service.timezone.domain.entities.response.WorldTimeApiIpResponse;
import dev.mars3142.fhq.timezone_service.timezone.service.TimeZoneService; import dev.mars3142.fhq.timezone_service.timezone.service.TimeZoneService;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.HttpStatusCode;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -19,6 +12,12 @@ import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.HttpStatusCode;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@Service @Service
@Slf4j @Slf4j