diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 492af3c..12d0c67 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -20,11 +20,19 @@ RUN apt-get update && apt-get install -y ca-certificates && apt-get clean RUN apt-get update --fix-missing && apt-get install --no-install-recommends --no-install-suggests -y \ git \ docker-buildx \ + locales \ docker-cli \ docker.io \ kubectl \ openjdk-25-jdk-headless \ + redis-server \ maven RUN jbang trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/ RUN jbang app install --fresh --force quarkus@quarkusio + +# Fix Locale +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ + locale-gen +ENV LANG=en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 8c894ad..e44a899 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -32,6 +32,7 @@ "QUARKUS_DEBUG_HOST": "0.0.0.0", "http_proxy": "http://host.docker.internal:3142" }, + "postStartCommand": "redis-server --daemonize yes", "postCreateCommand": "git config --global --add safe.directory '*'", "forwardPorts": [5005, 8080] } diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml index 9423c75..639cf30 100644 --- a/.gitea/workflows/test.yaml +++ b/.gitea/workflows/test.yaml @@ -49,7 +49,7 @@ jobs: - name: Build and Test all modules run: | ./mvnw -B install \ - -Dquarkus.container-image.push=false + -Dquarkus.container-image.push=false -Pnative - name: Publish Test Report uses: dorny/test-reporter@v3 diff --git a/.gitignore b/.gitignore index 9851e15..68c9671 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ nb-configuration.xml # Visual Studio Code .vscode .factorypath +*.rdb # OSX .DS_Store diff --git a/.releaserc.yaml b/.releaserc.yaml index 190d4eb..88e101a 100644 --- a/.releaserc.yaml +++ b/.releaserc.yaml @@ -13,7 +13,7 @@ plugins: ./mvnw versions:set -DnewVersion=${nextRelease.version} && sed -i "/-service:/ s|:[^:]*$|:${nextRelease.version}|" k8s.yaml && if [ "${branch.name}" = "main" ]; then - ./mvnw package -B -Dquarkus.container-image.tag=${nextRelease.version} -DskipTests + ./mvnw package -B -Pnative -Dquarkus.container-image.tag=${nextRelease.version} -DskipTests fi - - "@saithodev/semantic-release-gitea" - giteaUrl: "https://git.demonkernel.io.vn/" diff --git a/account-service/pom.xml b/account-service/pom.xml index 688d404..f717c1d 100644 --- a/account-service/pom.xml +++ b/account-service/pom.xml @@ -17,9 +17,7 @@ quarkus - false - false - true + 3.15.0 25 UTF-8 @@ -164,4 +162,20 @@ + + + + native + + + native + + + + false + false + true + + + diff --git a/account-service/src/main/java/com/drinkool/mapper/ExceptionHandlersMapper.java b/account-service/src/main/java/com/drinkool/mapper/ExceptionHandlersMapper.java new file mode 100644 index 0000000..4372d2a --- /dev/null +++ b/account-service/src/main/java/com/drinkool/mapper/ExceptionHandlersMapper.java @@ -0,0 +1,16 @@ +package com.drinkool.mapper; + +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.BadRequestException; +import org.jboss.resteasy.reactive.server.ServerExceptionMapper; + +public class ExceptionHandlersMapper { + + @ServerExceptionMapper + public Response mapBadRequestException(BadRequestException x) { + return Response.status(Response.Status.BAD_REQUEST) + .entity(x.getMessage()) + .type("text/plain") + .build(); + } +} diff --git a/account-service/src/main/java/com/drinkool/services/CustomerService.java b/account-service/src/main/java/com/drinkool/services/CustomerService.java index 7b2db10..87e09eb 100644 --- a/account-service/src/main/java/com/drinkool/services/CustomerService.java +++ b/account-service/src/main/java/com/drinkool/services/CustomerService.java @@ -42,9 +42,6 @@ public class CustomerService extends BaseService { newCustomer.signup(input.phone); return Response.status(Response.Status.CREATED) - .header(InternalValue.userId, newCustomer.id.toString()) - .header(InternalValue.role, Role.Customer) - .entity(newCustomer) .build(); } diff --git a/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java b/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java index 497b8bd..2838545 100644 --- a/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java +++ b/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java @@ -15,14 +15,16 @@ public class BaseServiceTest { @Test public void testMeEndpointWithHeader() { String phone = Utils.generateRandomPhone(); - QuickSignup input = new QuickSignup(); + Signup input = new Signup(); + input.name = "Test User"; input.phone = phone; + input.password = "password123"; String testUserId = given() .contentType(ContentType.JSON) .body(input) .when() - .post(Role.Customer + Url.QuickSignup) + .post(Role.Customer + Url.Signup) .then() .extract() .header(InternalValue.userId); diff --git a/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java b/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java index 5bede45..a823961 100644 --- a/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java +++ b/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java @@ -50,8 +50,6 @@ public class CustomerServiceTest { .when() .post(Role.Customer + Url.QuickSignup) .then() - .header(InternalValue.userId, notNullValue()) - .header(InternalValue.role, is(Role.Customer)) .statusCode(201); assertEquals(1, CustomerEntity.find("phone", phone).count()); diff --git a/build.dev.sh b/build.dev.sh deleted file mode 100755 index 3ed6693..0000000 --- a/build.dev.sh +++ /dev/null @@ -1,5 +0,0 @@ -mvn package -DskipTests -Dquarkus.container-image.push=false \ - -Dquarkus.container-image.registry=git.demonkernel.io.vn \ - -Dquarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG \ - -Dquarkus.rest-client.logging.scope=full \ - -Dquarkus.rest-client.logging.body-limit=1024 diff --git a/eatery-service/pom.xml b/eatery-service/pom.xml index 4d293e7..8ae5b17 100644 --- a/eatery-service/pom.xml +++ b/eatery-service/pom.xml @@ -17,9 +17,6 @@ quarkus - false - false - true 3.15.0 25 UTF-8 @@ -150,4 +147,20 @@ + + + + native + + + native + + + + false + false + true + + + diff --git a/gateway-service/pom.xml b/gateway-service/pom.xml index 1294947..74f1078 100644 --- a/gateway-service/pom.xml +++ b/gateway-service/pom.xml @@ -17,9 +17,6 @@ quarkus - false - false - true 3.15.0 25 UTF-8 @@ -142,4 +139,19 @@ + + + native + + + native + + + + false + false + true + + + diff --git a/gateway-service/src/main/java/com/drinkool/controller/BaseController.java b/gateway-service/src/main/java/com/drinkool/controller/BaseController.java new file mode 100644 index 0000000..c87ecb6 --- /dev/null +++ b/gateway-service/src/main/java/com/drinkool/controller/BaseController.java @@ -0,0 +1,26 @@ +package com.drinkool.controller; + +import com.drinkool.InternalValue; +import com.drinkool.Url; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.NewCookie; +import org.jboss.resteasy.reactive.RestResponse; + +public abstract class BaseController { + + @POST + @Path(Url.Logout) + public RestResponse logout() { + NewCookie cookie = new NewCookie.Builder(InternalValue.cookieName) + .secure(true) + .maxAge(0) + .path("/") + .httpOnly(true) + .build(); + + return RestResponse.ResponseBuilder.noContent() + .cookie(cookie) + .build(); + } +} diff --git a/gateway-service/src/main/java/com/drinkool/controller/CustomerController.java b/gateway-service/src/main/java/com/drinkool/controller/CustomerController.java index e064799..ee38f53 100644 --- a/gateway-service/src/main/java/com/drinkool/controller/CustomerController.java +++ b/gateway-service/src/main/java/com/drinkool/controller/CustomerController.java @@ -11,7 +11,7 @@ import java.util.*; import org.eclipse.microprofile.rest.client.inject.RestClient; @Path("/api/" + Role.Customer) -public class CustomerController { +public class CustomerController extends BaseController { @Inject @RestClient @@ -29,6 +29,18 @@ public class CustomerController { return accountService.login(input); } + @POST + @Path(Url.QuickSignup) + public Uni proxyQuickSignup(QuickSignup input) { + return accountService.quickSignup(input); + } + + @POST() + @Path(Url.QuickLogin) + public Uni proxyQuickLogin(QuickLogin input) { + return accountService.quickLogin(input); + } + @GET public Uni me(@HeaderParam(InternalValue.userId) UUID id) { return accountService.me(id); diff --git a/gateway-service/src/main/java/com/drinkool/services/CustomerService.java b/gateway-service/src/main/java/com/drinkool/services/CustomerService.java index 28d09f6..123d3f8 100644 --- a/gateway-service/src/main/java/com/drinkool/services/CustomerService.java +++ b/gateway-service/src/main/java/com/drinkool/services/CustomerService.java @@ -25,7 +25,7 @@ public interface CustomerService { @POST @Path(Url.QuickLogin) - Uni quickLogin(QuickSignup input); + Uni quickLogin(QuickLogin input); @GET @Path(Url.Me) diff --git a/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java b/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java new file mode 100644 index 0000000..91c0680 --- /dev/null +++ b/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java @@ -0,0 +1,24 @@ +package com.drinkool.controller; + +import static io.restassured.RestAssured.*; +import static org.hamcrest.CoreMatchers.*; + +import com.drinkool.*; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +public class BaseControllerTest { + + @Test + public void testLogoutShouldClearCookie() { + given() + .when() + .post("/api/" + Role.Customer + Url.Logout) + .then() + .statusCode(204) + .header("Set-Cookie", containsString(InternalValue.cookieName)) + .header("Set-Cookie", containsString("Max-Age=0")) + .header("Set-Cookie", containsString("HttpOnly")); + } +} diff --git a/gateway-service/src/test/resources/application.properties b/gateway-service/src/test/resources/application.properties index bf4225d..9f91177 100644 --- a/gateway-service/src/test/resources/application.properties +++ b/gateway-service/src/test/resources/application.properties @@ -2,4 +2,7 @@ quarkus.http.host=0.0.0.0 # JWT -gateway.jwt.secret=1uZk07Hqu1316z9YqrcSGPTTJDhMWU1ZhFSLBrDQvmU= \ No newline at end of file +gateway.jwt.secret=1uZk07Hqu1316z9YqrcSGPTTJDhMWU1ZhFSLBrDQvmU= + +# App configuration +quarkus.rest-client.account.url=http://account-service:8080 \ No newline at end of file diff --git a/lib/src/main/java/com/drinkool/Url.java b/lib/src/main/java/com/drinkool/Url.java index 8aa4a01..e547d3c 100644 --- a/lib/src/main/java/com/drinkool/Url.java +++ b/lib/src/main/java/com/drinkool/Url.java @@ -8,4 +8,5 @@ public class Url { public static final String QuickLogin = "/quick_login"; public static final String SmsOtp = "/sms_otp"; public static final String Me = "/me"; + public static final String Logout = "/logout"; } diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..17b5426 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,3 @@ +mvn clean package -DskipTests -Pnative \ + -Dquarkus.container-image.push=false \ + -Dquarkus.container-image.registry=git.demonkernel.io.vn diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 0000000..cfcde0e --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,3 @@ +mvn clean install -DskipTests \ + -Dquarkus.container-image.build=false \ + -Dquarkus.container-image.push=false \ No newline at end of file diff --git a/scripts/publish.sh b/scripts/publish.sh new file mode 100755 index 0000000..1becc04 --- /dev/null +++ b/scripts/publish.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +CURRENT_DIR=$(pwd) +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) + +cd "$SCRIPT_DIR/.." + +kubectl delete all --all -n drinkool-backend +kubectl apply -f k8s.yaml -n drinkool-backend + +cd "$CURRENT_DIR" \ No newline at end of file diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 0000000..3b7a38f --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1 @@ +mvn clean package -Dquarkus.container-image.push=false -Dquarkus.container-image.build=false \ No newline at end of file