From 87a98867672b1476faad0721a4c3cbc69a1c6136 Mon Sep 17 00:00:00 2001 From: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Date: Mon, 23 Mar 2026 10:47:57 +0000 Subject: [PATCH] feat: add quick login --- account-service/pom.xml | 27 +++++------ .../src/main/java/com/drinkool/RestAPI.java | 27 +++++++++++ .../com/drinkool/services/OtpService.java | 39 +++++++++++++++ .../src/main/resources/application.properties | 3 ++ gateway-service/pom.xml | 4 -- .../com/drinkool/MyMessagingApplication.java | 48 ------------------- .../java/com/drinkool/dtos/QuickLogin.java | 7 +++ .../main/java/com/drinkool/dtos/SmsOtp.java | 5 ++ 8 files changed, 92 insertions(+), 68 deletions(-) create mode 100644 account-service/src/main/java/com/drinkool/services/OtpService.java delete mode 100644 gateway-service/src/main/java/com/drinkool/MyMessagingApplication.java create mode 100644 lib/src/main/java/com/drinkool/dtos/QuickLogin.java create mode 100644 lib/src/main/java/com/drinkool/dtos/SmsOtp.java diff --git a/account-service/pom.xml b/account-service/pom.xml index 857a887..9540d04 100644 --- a/account-service/pom.xml +++ b/account-service/pom.xml @@ -1,9 +1,5 @@ - - + + 4.0.0 @@ -20,11 +16,9 @@ 3.15.0 21 UTF-8 - UTF-8 + UTF-8 quarkus-bom - io.quarkus.platform + io.quarkus.platform 3.32.4 true 3.5.4 @@ -76,6 +70,10 @@ io.quarkus quarkus-container-image-docker + + io.quarkus + quarkus-redis-client + io.quarkus quarkus-junit @@ -119,8 +117,7 @@ @{argLine} - org.jboss.logmanager.LogManager + org.jboss.logmanager.LogManager ${maven.home} @@ -139,10 +136,8 @@ @{argLine} - - ${project.build.directory}/${project.build.finalName}-runner - org.jboss.logmanager.LogManager + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager ${maven.home} diff --git a/account-service/src/main/java/com/drinkool/RestAPI.java b/account-service/src/main/java/com/drinkool/RestAPI.java index 74da797..899474f 100644 --- a/account-service/src/main/java/com/drinkool/RestAPI.java +++ b/account-service/src/main/java/com/drinkool/RestAPI.java @@ -2,6 +2,8 @@ package com.drinkool; import com.drinkool.dtos.*; import com.drinkool.models.Customer; +import com.drinkool.services.*; +import jakarta.inject.Inject; import jakarta.transaction.Transactional; import jakarta.ws.rs.*; import jakarta.ws.rs.core.*; @@ -9,6 +11,9 @@ import jakarta.ws.rs.core.*; @Path("/api") public class RestAPI { + @Inject + OtpService otpService; + @POST @Path("/signup") @Transactional @@ -44,4 +49,26 @@ public class RestAPI { return Response.accepted().build(); } + + @POST + @Path("/sms_otp") + public Response smsOtp(SmsOtp input) { + String otp = otpService.generateAndSaveOtp(input.phone); + + // Ở đây bạn sẽ gọi Kafka để gửi SMS thực tế + System.out.println("OTP cho " + input.phone + " là: " + otp); + + return Response.accepted().build(); + } + + @POST + @Path("/quicklogin") + public Response quickLogin(QuickLogin input) { + if (otpService.verifyOtp(input.phone, input.otp)) { + return Response.accepted().build(); + } + return Response.status(Response.Status.UNAUTHORIZED) + .entity("InvalidOTP") + .build(); + } } diff --git a/account-service/src/main/java/com/drinkool/services/OtpService.java b/account-service/src/main/java/com/drinkool/services/OtpService.java new file mode 100644 index 0000000..e97346b --- /dev/null +++ b/account-service/src/main/java/com/drinkool/services/OtpService.java @@ -0,0 +1,39 @@ +package com.drinkool.services; + +import io.quarkus.redis.datasource.RedisDataSource; +import io.quarkus.redis.datasource.value.ValueCommands; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.util.Random; + +@ApplicationScoped +public class OtpService { + + private final ValueCommands countCommands; + + @Inject + public OtpService(RedisDataSource ds) { + this.countCommands = ds.value(String.class); + } + + public String generateAndSaveOtp(String phone) { + String otp = String.format("%06d", new Random().nextInt(1000000)); + String key = "otp:" + phone; + + countCommands.setex(key, 300, otp); + + return otp; + } + + public boolean verifyOtp(String phone, String inputOtp) { + String key = "otp:" + phone; + String savedOtp = countCommands.get(key); + + if (savedOtp != null && savedOtp.equals(inputOtp)) { + countCommands.getdel(key); + return true; + } + + return false; + } +} diff --git a/account-service/src/main/resources/application.properties b/account-service/src/main/resources/application.properties index 7578a82..e2e690f 100644 --- a/account-service/src/main/resources/application.properties +++ b/account-service/src/main/resources/application.properties @@ -14,3 +14,6 @@ quarkus.container-image.name=account-service quarkus.container-image.push=true quarkus.container-image.build=true quarkus.container-image.builder=docker + +# Redis +quarkus.redis.hosts=redis://localhost:6379 \ No newline at end of file diff --git a/gateway-service/pom.xml b/gateway-service/pom.xml index f15f1e4..6734e03 100644 --- a/gateway-service/pom.xml +++ b/gateway-service/pom.xml @@ -52,10 +52,6 @@ io.quarkus quarkus-redis-client - - io.quarkus - quarkus-messaging-kafka - io.quarkus quarkus-rest-jackson diff --git a/gateway-service/src/main/java/com/drinkool/MyMessagingApplication.java b/gateway-service/src/main/java/com/drinkool/MyMessagingApplication.java deleted file mode 100644 index a9e0791..0000000 --- a/gateway-service/src/main/java/com/drinkool/MyMessagingApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.drinkool; - -import io.quarkus.runtime.StartupEvent; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.event.Observes; -import java.util.stream.Stream; -import org.eclipse.microprofile.reactive.messaging.Channel; -import org.eclipse.microprofile.reactive.messaging.Emitter; -import org.eclipse.microprofile.reactive.messaging.Incoming; -import org.eclipse.microprofile.reactive.messaging.Outgoing; - -@ApplicationScoped -public class MyMessagingApplication { - - /** - * Injects an emitter to send messages to the "words-out" channel. - */ - @Channel("words-out") - Emitter emitter; - - /** - * Sends message to the "words-out" channel, can be used from a JAX-RS resource or any bean of your application. - * Messages are sent to the broker. - **/ - void onStart(@Observes StartupEvent ev) { - Stream.of("Hello", "with", "Quarkus", "Messaging", "message").forEach( - string -> emitter.send(string) - ); - } - - /** - * Consume the message from the "words-in" channel, uppercase it and send it to the uppercase channel. - * This method is called by the framework when a message is received on the "words-in" channel (from the broker). - **/ - @Incoming("words-in") - @Outgoing("uppercase") - public String toUpperCase(String message) { - return message.toUpperCase(); - } - - /** - * Consume the uppercase channel (coming from within the application) and print the messages to the console. - **/ - @Incoming("uppercase") - public void sink(String word) { - System.out.println(">> " + word); - } -} diff --git a/lib/src/main/java/com/drinkool/dtos/QuickLogin.java b/lib/src/main/java/com/drinkool/dtos/QuickLogin.java new file mode 100644 index 0000000..6e4c3f8 --- /dev/null +++ b/lib/src/main/java/com/drinkool/dtos/QuickLogin.java @@ -0,0 +1,7 @@ +package com.drinkool.dtos; + +public class QuickLogin { + + public String phone; + public String otp; +} diff --git a/lib/src/main/java/com/drinkool/dtos/SmsOtp.java b/lib/src/main/java/com/drinkool/dtos/SmsOtp.java new file mode 100644 index 0000000..95b5dc4 --- /dev/null +++ b/lib/src/main/java/com/drinkool/dtos/SmsOtp.java @@ -0,0 +1,5 @@ +package com.drinkool.dtos; + +public class SmsOtp { + public String phone; +}