diff --git a/pom.xml b/pom.xml index b48ffae..3de4f11 100644 --- a/pom.xml +++ b/pom.xml @@ -108,6 +108,10 @@ vaadin-testbench-junit5 test + + org.springframework.cloud + spring-cloud-starter-bootstrap + org.projectlombok lombok @@ -117,6 +121,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.cloud + spring-cloud-starter-loadbalancer + org.springframework.modulith spring-modulith-starter-core @@ -140,6 +148,15 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-client + + com.github.ben-manes.caffeine + caffeine + 3.1.8 + + + org.springframework.cloud + spring-cloud-starter-config + diff --git a/src/main/java/dev/mars3142/fhq/account/AccountService.java b/src/main/java/dev/mars3142/fhq/account/AccountService.java deleted file mode 100644 index 2839e3f..0000000 --- a/src/main/java/dev/mars3142/fhq/account/AccountService.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.mars3142.fhq.account; - -public interface AccountService { - - RegisterResponse register(String username, String email, String password); - - LoginResponse login(String email, String password); - - RefreshTokenResponse refreshToken(String token); - - DeleteResponse delete(String token); -} diff --git a/src/main/java/dev/mars3142/fhq/account/DeleteResponse.java b/src/main/java/dev/mars3142/fhq/account/DeleteResponse.java deleted file mode 100644 index b16d0e4..0000000 --- a/src/main/java/dev/mars3142/fhq/account/DeleteResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record DeleteResponse(boolean success) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/DeletedCompleted.java b/src/main/java/dev/mars3142/fhq/account/DeletedCompleted.java deleted file mode 100644 index ddff218..0000000 --- a/src/main/java/dev/mars3142/fhq/account/DeletedCompleted.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record DeletedCompleted(String localId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/LoginCompleted.java b/src/main/java/dev/mars3142/fhq/account/LoginCompleted.java deleted file mode 100644 index d8bf4ab..0000000 --- a/src/main/java/dev/mars3142/fhq/account/LoginCompleted.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record LoginCompleted(String localId, String email, String displayName) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/LoginResponse.java b/src/main/java/dev/mars3142/fhq/account/LoginResponse.java deleted file mode 100644 index 407dad6..0000000 --- a/src/main/java/dev/mars3142/fhq/account/LoginResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.mars3142.fhq.account; - -public record LoginResponse(String localId, String email, String displayName, String idToken, String registered, - String refreshToken, String expiresIn) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/RefreshTokenCompleted.java b/src/main/java/dev/mars3142/fhq/account/RefreshTokenCompleted.java deleted file mode 100644 index e7616f4..0000000 --- a/src/main/java/dev/mars3142/fhq/account/RefreshTokenCompleted.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record RefreshTokenCompleted(String localId, String token) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/RefreshTokenResponse.java b/src/main/java/dev/mars3142/fhq/account/RefreshTokenResponse.java deleted file mode 100644 index d60bf72..0000000 --- a/src/main/java/dev/mars3142/fhq/account/RefreshTokenResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.mars3142.fhq.account; - -public record RefreshTokenResponse(String expiresIn, String tokenType, String refreshToken, String idToken, String userId, - String projectId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/RegisterResponse.java b/src/main/java/dev/mars3142/fhq/account/RegisterResponse.java deleted file mode 100644 index 68e931f..0000000 --- a/src/main/java/dev/mars3142/fhq/account/RegisterResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record RegisterResponse(String idToken, String email, String refreshToken, String expiresId, String localId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/RegistrationCompleted.java b/src/main/java/dev/mars3142/fhq/account/RegistrationCompleted.java deleted file mode 100644 index 8593194..0000000 --- a/src/main/java/dev/mars3142/fhq/account/RegistrationCompleted.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account; - -public record RegistrationCompleted(String email, String localId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java b/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java deleted file mode 100644 index f290f61..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.mars3142.fhq.account.repositories; - -import dev.mars3142.fhq.account.repositories.impl.responses.DeleteResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.LoginResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.RefreshTokenResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.RegisterResponse; - -public interface AccountRepository { - - RegisterResponse register(String username, String email, String password); - - LoginResponse login(String username, String password); - - RefreshTokenResponse refreshToken(String token); - - DeleteResponse delete(String token); -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/AccountRepositoryImpl.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/AccountRepositoryImpl.java deleted file mode 100644 index 2c1628d..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/AccountRepositoryImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl; - -import dev.mars3142.fhq.account.repositories.AccountRepository; -import dev.mars3142.fhq.account.repositories.impl.requests.AccountDeleteRequest; -import dev.mars3142.fhq.account.repositories.impl.requests.AccountRegisterRequest; -import dev.mars3142.fhq.account.repositories.impl.requests.LoginRequest; -import dev.mars3142.fhq.account.repositories.impl.requests.RefreshTokenRequest; -import dev.mars3142.fhq.account.repositories.impl.responses.DeleteResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.LoginResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.RefreshTokenResponse; -import dev.mars3142.fhq.account.repositories.impl.responses.RegisterResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.stereotype.Repository; -import org.springframework.web.client.RestClient; - -@Repository -@RequiredArgsConstructor -@Slf4j -public class AccountRepositoryImpl implements AccountRepository { - - private final RestClient client; - - @Override - public RegisterResponse register(String username, String email, String password) { - val request = new AccountRegisterRequest(username, email, password); - return client - .post() - .uri("/v1/account/register") - .body(request) - .retrieve() - .body(RegisterResponse.class); - } - - @Override - public LoginResponse login(String email, String password) { - val request = new LoginRequest(email, password); - return client - .post() - .uri("/v1/account/login") - .body(request) - .retrieve() - .body(LoginResponse.class); - } - - @Override - public RefreshTokenResponse refreshToken(String token) { - val request = new RefreshTokenRequest(token); - return client - .post() - .uri("/v1/token/refresh") - .body(request) - .retrieve() - .body(RefreshTokenResponse.class); - } - - @Override - public DeleteResponse delete(String token) { - val request = new AccountDeleteRequest(token); - return client - .post() - .uri("/v1/account/delete") - .body(request) - .retrieve() - .body(DeleteResponse.class); - } -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountDeleteRequest.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountDeleteRequest.java deleted file mode 100644 index 065b3f0..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountDeleteRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.requests; - -public record AccountDeleteRequest(String token) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountRegisterRequest.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountRegisterRequest.java deleted file mode 100644 index fa4f209..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountRegisterRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.requests; - -public record AccountRegisterRequest(String username, String email, String password) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/LoginRequest.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/LoginRequest.java deleted file mode 100644 index e8a4223..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/LoginRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.requests; - -public record LoginRequest(String email, String password) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/RefreshTokenRequest.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/RefreshTokenRequest.java deleted file mode 100644 index 25d39e2..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/RefreshTokenRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.requests; - -public record RefreshTokenRequest(String token) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/DeleteResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/DeleteResponse.java deleted file mode 100644 index 6e45855..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/DeleteResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.responses; - -public record DeleteResponse(boolean deleted) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/LoginResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/LoginResponse.java deleted file mode 100644 index d87a4b1..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/LoginResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.responses; - -public record LoginResponse(String localId, String email, String displayName, String idToken, String registered, - String refreshToken, String expiresIn) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RefreshTokenResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RefreshTokenResponse.java deleted file mode 100644 index 0aab28e..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RefreshTokenResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.responses; - -public record RefreshTokenResponse(String expiresIn, String tokenType, String refreshToken, String idToken, String userId, - String projectId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RegisterResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RegisterResponse.java deleted file mode 100644 index e63cb2b..0000000 --- a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RegisterResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.mars3142.fhq.account.repositories.impl.responses; - -public record RegisterResponse(String idToken, String email, String refreshToken, String expiresId, String localId) { -} diff --git a/src/main/java/dev/mars3142/fhq/account/services/impl/AccountServiceImpl.java b/src/main/java/dev/mars3142/fhq/account/services/impl/AccountServiceImpl.java deleted file mode 100644 index 0d0fe51..0000000 --- a/src/main/java/dev/mars3142/fhq/account/services/impl/AccountServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package dev.mars3142.fhq.account.services.impl; - -import dev.mars3142.fhq.account.*; -import dev.mars3142.fhq.account.repositories.AccountRepository; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class AccountServiceImpl implements AccountService { - - private final ApplicationEventPublisher events; - private final AccountRepository repository; - - @Override - public RegisterResponse register(String username, String email, String password) { - val response = repository.register(username, email, password); - events.publishEvent(new RegistrationCompleted(response.email(), response.localId())); - return new RegisterResponse(response.idToken(), response.email(), response.refreshToken(), response.expiresId(), response.localId()); - } - - @Override - public LoginResponse login(String email, String password) { - val response = repository.login(email, password); - events.publishEvent(new LoginCompleted(response.localId(), response.email(), response.displayName())); - return new LoginResponse(response.localId(), response.email(), response.displayName(), response.idToken(), response.registered(), response.refreshToken(), response.expiresIn()); - } - - @Override - public RefreshTokenResponse refreshToken(String token) { - val response = repository.refreshToken(token); - events.publishEvent(new RefreshTokenCompleted(response.userId(), response.idToken())); - return new RefreshTokenResponse(response.expiresIn(), response.tokenType(), response.refreshToken(), response.idToken(), response.userId(), response.projectId()); - } - - @Override - public DeleteResponse delete(String token) { - val response = repository.delete(token); - events.publishEvent(new DeletedCompleted("")); - return new DeleteResponse(response.deleted()); - } -} diff --git a/src/main/java/dev/mars3142/fhq/client/TimeZoneClient.java b/src/main/java/dev/mars3142/fhq/client/TimeZoneClient.java new file mode 100644 index 0000000..1a8924f --- /dev/null +++ b/src/main/java/dev/mars3142/fhq/client/TimeZoneClient.java @@ -0,0 +1,9 @@ +package dev.mars3142.fhq.client; + +import org.springframework.web.service.annotation.GetExchange; + +public interface TimeZoneClient { + + @GetExchange("/v1/timezone") + String getTimeZone(); +} diff --git a/src/main/java/dev/mars3142/fhq/config/AppConfig.java b/src/main/java/dev/mars3142/fhq/config/AppConfig.java deleted file mode 100644 index ce555d4..0000000 --- a/src/main/java/dev/mars3142/fhq/config/AppConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.mars3142.fhq.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestClient; - -@Configuration -public class AppConfig { - - @Value("${backend.uri}") - private String baseUri; - - @Bean - public RestClient restClient() { - return RestClient.builder().baseUrl(baseUri).build(); - } -} diff --git a/src/main/java/dev/mars3142/fhq/config/RestClientConfig.java b/src/main/java/dev/mars3142/fhq/config/RestClientConfig.java new file mode 100644 index 0000000..3173785 --- /dev/null +++ b/src/main/java/dev/mars3142/fhq/config/RestClientConfig.java @@ -0,0 +1,38 @@ +package dev.mars3142.fhq.config; + +import dev.mars3142.fhq.client.TimeZoneClient; +import org.springframework.boot.web.client.ClientHttpRequestFactories; +import org.springframework.boot.web.client.ClientHttpRequestFactorySettings; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.web.client.RestClient; +import org.springframework.web.client.support.RestClientAdapter; +import org.springframework.web.service.invoker.HttpServiceProxyFactory; + +@Configuration +public class RestClientConfig { + + @LoadBalanced + @Bean + RestClient.Builder restClientBuilder() { + return RestClient.builder(); + } + + @Bean + public TimeZoneClient timeZoneClient(RestClient.Builder restClientBuilder) { + RestClient restClient = restClientBuilder + .baseUrl("http://timezone-service") + .requestFactory(getClientRequestFactory()) + .build(); + var restClientAdapter = RestClientAdapter.create(restClient); + var httpServiceProxyFactory = HttpServiceProxyFactory.builderFor(restClientAdapter).build(); + return httpServiceProxyFactory.createClient(TimeZoneClient.class); + } + + private ClientHttpRequestFactory getClientRequestFactory() { + ClientHttpRequestFactorySettings clientHttpRequestFactorySettings = ClientHttpRequestFactorySettings.DEFAULTS; + return ClientHttpRequestFactories.get(clientHttpRequestFactorySettings); + } +} diff --git a/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageView.java b/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageView.java index ce762e1..d997cf9 100644 --- a/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageView.java +++ b/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageView.java @@ -1,17 +1,24 @@ package dev.mars3142.fhq.views.landing_page; import com.vaadin.flow.component.Composite; +import com.vaadin.flow.component.Text; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import dev.mars3142.fhq.client.TimeZoneClient; import lombok.extern.slf4j.Slf4j; +import lombok.val; @PageTitle("Firmware HQ") @Route(value = "", layout = LandingPageLayout.class) @Slf4j public class LandingPageView extends Composite { - public LandingPageView() { - + public LandingPageView(TimeZoneClient client) { + val timeZone = client.getTimeZone(); + val verticalLayout = new VerticalLayout(); + verticalLayout.setSizeFull(); + verticalLayout.add(new Text(timeZone)); + getContent().add(verticalLayout); } } diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/_application-dev.yaml similarity index 100% rename from src/main/resources/application-dev.yaml rename to src/main/resources/_application-dev.yaml diff --git a/src/main/resources/application.yaml b/src/main/resources/_application.yaml similarity index 100% rename from src/main/resources/application.yaml rename to src/main/resources/_application.yaml diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..1aabc98 --- /dev/null +++ b/src/main/resources/bootstrap.yml @@ -0,0 +1,16 @@ +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: ${EUREKA} + +spring: + application: + name: website + cloud: + config: + discovery: + enabled: true + serviceId: config-service + fail-fast: true