diff --git a/.run/Testing.run.xml b/.run/Testing.run.xml
new file mode 100644
index 0000000..25c6c38
--- /dev/null
+++ b/.run/Testing.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 240b07a..f975148 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,7 @@
24.4.0.beta4
2023.0.1
5.4.1
+ 1.1.6
@@ -72,6 +73,13 @@
pom
import
+
+ org.springframework.modulith
+ spring-modulith-bom
+ ${spring-modulith.version}
+ pom
+ import
+
@@ -110,10 +118,6 @@
com.google.cloud
spring-cloud-gcp-starter
-
- org.springframework.cloud
- spring-cloud-starter-openfeign
-
org.projectlombok
lombok
@@ -123,6 +127,25 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.modulith
+ spring-modulith-starter-core
+
+
+ org.springframework.modulith
+ spring-modulith-starter-test
+ test
+
+
+ org.springframework.modulith
+ spring-modulith-actuator
+ runtime
+
+
+ org.springframework.modulith
+ spring-modulith-observability
+ runtime
+
diff --git a/src/main/java/dev/mars3142/fhq/account/AccountService.java b/src/main/java/dev/mars3142/fhq/account/AccountService.java
new file mode 100644
index 0000000..fc4bb50
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/AccountService.java
@@ -0,0 +1,4 @@
+package dev.mars3142.fhq.account;
+
+public interface AccountService{
+}
diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java b/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java
new file mode 100644
index 0000000..3d6ae18
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/AccountRepository.java
@@ -0,0 +1,17 @@
+package dev.mars3142.fhq.account.repositories;
+
+import dev.mars3142.fhq.account.repositories.impl.responses.LoginResponse;
+import dev.mars3142.fhq.account.repositories.impl.responses.AccountDeleteResponse;
+import dev.mars3142.fhq.account.repositories.impl.responses.AccountRegisterResponse;
+import dev.mars3142.fhq.account.repositories.impl.responses.RefreshTokenResponse;
+
+public interface AccountRepository {
+
+ AccountRegisterResponse register(String username, String email, String password);
+
+ LoginResponse login(String username, String password);
+
+ RefreshTokenResponse refreshToken(String token);
+
+ AccountDeleteResponse 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
new file mode 100644
index 0000000..b94eeee
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/AccountRepositoryImpl.java
@@ -0,0 +1,68 @@
+package dev.mars3142.fhq.account.repositories.impl;
+
+import dev.mars3142.fhq.account.repositories.impl.responses.AccountRegisterResponse;
+import dev.mars3142.fhq.account.repositories.impl.responses.LoginResponse;
+import dev.mars3142.fhq.account.repositories.AccountRepository;
+import dev.mars3142.fhq.account.repositories.impl.requests.AccountDeleteRequest;
+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.AccountDeleteResponse;
+import dev.mars3142.fhq.account.repositories.impl.responses.RefreshTokenResponse;
+import dev.mars3142.fhq.account.repositories.impl.requests.AccountRegisterRequest;
+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 AccountRegisterResponse 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(AccountRegisterResponse.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/account/refresh")
+ .body(request)
+ .retrieve()
+ .body(RefreshTokenResponse.class);
+ }
+
+ @Override
+ public AccountDeleteResponse delete(String token) {
+ val request = new AccountDeleteRequest(token);
+ return client
+ .post()
+ .uri("/v1/account/delete")
+ .body(request)
+ .retrieve()
+ .body(AccountDeleteResponse.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
new file mode 100644
index 0000000..065b3f0
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountDeleteRequest.java
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..fa4f209
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/AccountRegisterRequest.java
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..e8a4223
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/LoginRequest.java
@@ -0,0 +1,4 @@
+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
new file mode 100644
index 0000000..25d39e2
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/requests/RefreshTokenRequest.java
@@ -0,0 +1,4 @@
+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/AccountDeleteResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/AccountDeleteResponse.java
new file mode 100644
index 0000000..ef3d386
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/AccountDeleteResponse.java
@@ -0,0 +1,4 @@
+package dev.mars3142.fhq.account.repositories.impl.responses;
+
+public record AccountDeleteResponse() {
+}
diff --git a/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/AccountRegisterResponse.java b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/AccountRegisterResponse.java
new file mode 100644
index 0000000..4985ece
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/AccountRegisterResponse.java
@@ -0,0 +1,4 @@
+package dev.mars3142.fhq.account.repositories.impl.responses;
+
+public record AccountRegisterResponse() {
+}
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
new file mode 100644
index 0000000..61adc03
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/LoginResponse.java
@@ -0,0 +1,4 @@
+package dev.mars3142.fhq.account.repositories.impl.responses;
+
+public record LoginResponse() {
+}
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
new file mode 100644
index 0000000..5bccd9f
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/repositories/impl/responses/RefreshTokenResponse.java
@@ -0,0 +1,4 @@
+package dev.mars3142.fhq.account.repositories.impl.responses;
+
+public record RefreshTokenResponse() {
+}
diff --git a/src/main/java/dev/mars3142/fhq/account/services/AccountServiceImpl.java b/src/main/java/dev/mars3142/fhq/account/services/AccountServiceImpl.java
new file mode 100644
index 0000000..f0faa83
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/account/services/AccountServiceImpl.java
@@ -0,0 +1,14 @@
+package dev.mars3142.fhq.account.services;
+
+import dev.mars3142.fhq.account.repositories.AccountRepository;
+import dev.mars3142.fhq.account.AccountService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class AccountServiceImpl implements AccountService {
+
+ private final AccountRepository repository;
+
+}
diff --git a/src/main/java/dev/mars3142/fhq/config/AppConfig.java b/src/main/java/dev/mars3142/fhq/config/AppConfig.java
new file mode 100644
index 0000000..ce555d4
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/config/AppConfig.java
@@ -0,0 +1,18 @@
+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/views/MainLayout.java b/src/main/java/dev/mars3142/fhq/views/MainLayout.java
index f10d12a..bafc391 100644
--- a/src/main/java/dev/mars3142/fhq/views/MainLayout.java
+++ b/src/main/java/dev/mars3142/fhq/views/MainLayout.java
@@ -26,8 +26,8 @@ import com.vaadin.flow.theme.lumo.LumoUtility.Padding;
import com.vaadin.flow.theme.lumo.LumoUtility.TextColor;
import com.vaadin.flow.theme.lumo.LumoUtility.Whitespace;
import com.vaadin.flow.theme.lumo.LumoUtility.Width;
-import dev.mars3142.fhq.views.checkoutform.CheckoutFormView;
-import dev.mars3142.fhq.views.myview.MyViewView;
+import dev.mars3142.fhq.views.checkout_form.CheckoutFormView;
+import dev.mars3142.fhq.views.my_view.MyViewView;
import org.vaadin.lineawesome.LineAwesomeIcon;
/**
diff --git a/src/main/java/dev/mars3142/fhq/views/checkoutform/CheckoutFormView.java b/src/main/java/dev/mars3142/fhq/views/checkout_form/CheckoutFormView.java
similarity index 99%
rename from src/main/java/dev/mars3142/fhq/views/checkoutform/CheckoutFormView.java
rename to src/main/java/dev/mars3142/fhq/views/checkout_form/CheckoutFormView.java
index 041bb43..c7ec03e 100644
--- a/src/main/java/dev/mars3142/fhq/views/checkoutform/CheckoutFormView.java
+++ b/src/main/java/dev/mars3142/fhq/views/checkout_form/CheckoutFormView.java
@@ -1,4 +1,4 @@
-package dev.mars3142.fhq.views.checkoutform;
+package dev.mars3142.fhq.views.checkout_form;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
diff --git a/src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageLayout.java b/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageLayout.java
similarity index 94%
rename from src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageLayout.java
rename to src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageLayout.java
index 266a748..8cf8cbb 100644
--- a/src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageLayout.java
+++ b/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageLayout.java
@@ -1,4 +1,4 @@
-package dev.mars3142.fhq.views.landingpage;
+package dev.mars3142.fhq.views.landing_page;
import com.vaadin.flow.component.applayout.AppLayout;
import com.vaadin.flow.component.html.Div;
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
new file mode 100644
index 0000000..ce762e1
--- /dev/null
+++ b/src/main/java/dev/mars3142/fhq/views/landing_page/LandingPageView.java
@@ -0,0 +1,17 @@
+package dev.mars3142.fhq.views.landing_page;
+
+import com.vaadin.flow.component.Composite;
+import com.vaadin.flow.component.orderedlayout.VerticalLayout;
+import com.vaadin.flow.router.PageTitle;
+import com.vaadin.flow.router.Route;
+import lombok.extern.slf4j.Slf4j;
+
+@PageTitle("Firmware HQ")
+@Route(value = "", layout = LandingPageLayout.class)
+@Slf4j
+public class LandingPageView extends Composite {
+
+ public LandingPageView() {
+
+ }
+}
diff --git a/src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageView.java b/src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageView.java
deleted file mode 100644
index 2582690..0000000
--- a/src/main/java/dev/mars3142/fhq/views/landingpage/LandingPageView.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package dev.mars3142.fhq.views.landingpage;
-
-import com.vaadin.flow.component.Composite;
-import com.vaadin.flow.component.orderedlayout.VerticalLayout;
-import com.vaadin.flow.router.PageTitle;
-import com.vaadin.flow.router.Route;
-import lombok.extern.slf4j.Slf4j;
-import lombok.val;
-import org.springframework.web.client.RestClient;
-
-@PageTitle("Firmware HQ")
-@Route(value = "", layout = LandingPageLayout.class)
-@Slf4j
-public class LandingPageView extends Composite {
- public LandingPageView() {
- val client = RestClient
- .builder()
- .baseUrl("https://user-service-ggxookssmq-ew.a.run.app/v1")
- .build();
- val response = client.get()
- .uri("/users")
- .retrieve()
- .body(String.class);
- log.info("Response: {}", response);
- }
-}
diff --git a/src/main/java/dev/mars3142/fhq/views/myview/MyViewView.java b/src/main/java/dev/mars3142/fhq/views/my_view/MyViewView.java
similarity index 97%
rename from src/main/java/dev/mars3142/fhq/views/myview/MyViewView.java
rename to src/main/java/dev/mars3142/fhq/views/my_view/MyViewView.java
index d0d5483..05f4384 100644
--- a/src/main/java/dev/mars3142/fhq/views/myview/MyViewView.java
+++ b/src/main/java/dev/mars3142/fhq/views/my_view/MyViewView.java
@@ -1,4 +1,4 @@
-package dev.mars3142.fhq.views.myview;
+package dev.mars3142.fhq.views.my_view;
import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml
index f506a59..01df4d0 100644
--- a/src/main/resources/application-dev.yaml
+++ b/src/main/resources/application-dev.yaml
@@ -5,3 +5,6 @@ vaadin:
# To improve the performance during development.
# For more information https://vaadin.com/docs/latest/integrations/spring/configuration#special-configuration-parameters
allowed-packages : com.vaadin,org.vaadin,dev.hilla,dev.mars3142
+
+backend:
+ uri: http://localhost:8091/v1
diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml
index 264c5bc..175e134 100644
--- a/src/main/resources/application.yaml
+++ b/src/main/resources/application.yaml
@@ -10,3 +10,6 @@ spring:
check-template-location: false
jpa:
defer-datasource-initialization: true
+
+backend:
+ uri: https://api.firmware-hq.dev/v1
diff --git a/src/test/java/dev/mars3142/fhq/ApplicationTest.java b/src/test/java/dev/mars3142/fhq/ApplicationTest.java
new file mode 100644
index 0000000..b92f07d
--- /dev/null
+++ b/src/test/java/dev/mars3142/fhq/ApplicationTest.java
@@ -0,0 +1,35 @@
+package dev.mars3142.fhq;
+
+import lombok.val;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.modulith.core.ApplicationModules;
+import org.springframework.modulith.docs.Documenter;
+
+@SpringBootTest
+class ApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+ @Test
+ void modules() {
+ ApplicationModules.of(Application.class).forEach(System.out::println);
+ }
+
+ @Test
+ void verify() {
+ ApplicationModules.of(Application.class).verify();
+ }
+
+ @Test
+ void documentation() {
+ val modules = ApplicationModules.of(Application.class);
+
+ new Documenter(modules)
+ .writeDocumentation()
+ .writeModuleCanvases()
+ .writeModulesAsPlantUml();
+ }
+}