diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml
index ec7bdc4..5bf62e3 100644
--- a/.gitea/workflows/publish.yaml
+++ b/.gitea/workflows/publish.yaml
@@ -38,7 +38,10 @@ jobs:
- name: Cache Maven packages
uses: actions/cache@v4
with:
- path: ~/.m2/repository
+ path: |
+ ~/.m2/repository
+ **/target/native-image-cache
+ **/target/reports
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml
index 639cf30..c7e167f 100644
--- a/.gitea/workflows/test.yaml
+++ b/.gitea/workflows/test.yaml
@@ -30,7 +30,10 @@ jobs:
- name: Cache Maven packages
uses: actions/cache@v4
with:
- path: ~/.m2/repository
+ path: |
+ ~/.m2/repository
+ **/target/native-image-cache
+ **/target/reports
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
@@ -46,10 +49,13 @@ jobs:
apt-get install -y --no-install-recommends --no-install-suggests \
openjdk-25-jdk-headless docker-cli docker-buildx
- - name: Build and Test all modules
+ - name: Build and Test all module
+ env:
+ TESTCONTAINERS_RYUK_DISABLED: true
run: |
- ./mvnw -B install \
- -Dquarkus.container-image.push=false -Pnative
+ ./mvnw -B clean install -Pnative \
+ -Dquarkus.container-image.push=false \
+ -Dquarkus.container-image.registry=git.demonkernel.io.vn
- name: Publish Test Report
uses: dorny/test-reporter@v3
diff --git a/account-service/pom.xml b/account-service/pom.xml
index 1b44ac7..5f1e025 100644
--- a/account-service/pom.xml
+++ b/account-service/pom.xml
@@ -49,6 +49,20 @@
lib
${project.version}
+
+ org.bitbucket.b_c
+ jose4j
+ 0.9.3
+
+
+ io.quarkus
+ quarkus-messaging-kafka
+
+
+ io.quarkus
+ quarkus-test-kafka-companion
+ test
+
io.quarkus
quarkus-jdbc-h2
diff --git a/account-service/src/main/docker/Dockerfile.jvm b/account-service/src/main/docker/Dockerfile.jvm
index 6a6f0e5..49bfabc 100644
--- a/account-service/src/main/docker/Dockerfile.jvm
+++ b/account-service/src/main/docker/Dockerfile.jvm
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/account-service/src/main/docker/Dockerfile.legacy-jar b/account-service/src/main/docker/Dockerfile.legacy-jar
index 53dfe67..192280b 100644
--- a/account-service/src/main/docker/Dockerfile.legacy-jar
+++ b/account-service/src/main/docker/Dockerfile.legacy-jar
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/account-service/src/main/java/com/drinkool/entities/ManagerEntity.java b/account-service/src/main/java/com/drinkool/entities/ManagerEntity.java
index 1f7e2ea..6d4691d 100644
--- a/account-service/src/main/java/com/drinkool/entities/ManagerEntity.java
+++ b/account-service/src/main/java/com/drinkool/entities/ManagerEntity.java
@@ -8,24 +8,7 @@ import jakarta.persistence.*;
@Table(name = Role.Manager)
public class ManagerEntity extends UserModel {
- public String eateryName;
-
- public boolean isVerified;
-
public ManagerEntity() {
super(Role.Manager);
}
-
- public void signup(
- String name,
- String phone,
- String rawPassword,
- String eateryName
- ) {
- this.eateryName = eateryName;
-
- this.isVerified = false;
-
- this.signup(name, phone, rawPassword);
- }
}
diff --git a/account-service/src/main/java/com/drinkool/models/UserModel.java b/account-service/src/main/java/com/drinkool/models/UserModel.java
index fcdb2d2..e3a1346 100644
--- a/account-service/src/main/java/com/drinkool/models/UserModel.java
+++ b/account-service/src/main/java/com/drinkool/models/UserModel.java
@@ -1,6 +1,6 @@
package com.drinkool.models;
-import com.drinkool.entities.BaseEntity;
+import com.drinkool.lib.entities.BaseEntity;
import com.drinkool.utils.PhoneValidator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.password4j.Password;
diff --git a/account-service/src/main/java/com/drinkool/services/AccountService.java b/account-service/src/main/java/com/drinkool/services/AccountService.java
index 5c7cb22..a6c3002 100644
--- a/account-service/src/main/java/com/drinkool/services/AccountService.java
+++ b/account-service/src/main/java/com/drinkool/services/AccountService.java
@@ -7,7 +7,7 @@ import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
-@Path("")
+@Path("/")
public class AccountService {
@Inject
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 ea00033..c03301d 100644
--- a/account-service/src/main/java/com/drinkool/services/CustomerService.java
+++ b/account-service/src/main/java/com/drinkool/services/CustomerService.java
@@ -3,6 +3,7 @@ package com.drinkool.services;
import com.drinkool.*;
import com.drinkool.dtos.*;
import com.drinkool.entities.CustomerEntity;
+
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
diff --git a/account-service/src/main/java/com/drinkool/services/ManagerService.java b/account-service/src/main/java/com/drinkool/services/ManagerService.java
index f69f601..cffc147 100644
--- a/account-service/src/main/java/com/drinkool/services/ManagerService.java
+++ b/account-service/src/main/java/com/drinkool/services/ManagerService.java
@@ -2,13 +2,24 @@ package com.drinkool.services;
import com.drinkool.*;
import com.drinkool.dtos.*;
+import com.drinkool.dtos.event.ManagerCreate;
import com.drinkool.entities.ManagerEntity;
+import jakarta.enterprise.context.ApplicationScoped;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.*;
+import org.eclipse.microprofile.reactive.messaging.*;
@Path(Role.Manager)
-public class ManagerService {
+@ApplicationScoped
+public class ManagerService extends BaseService {
+
+ public ManagerService() {
+ super(ManagerEntity.class);
+ }
+
+ @Channel("manager-out")
+ Emitter managerEmitter;
@POST
@Path(Url.Signup)
@@ -16,12 +27,13 @@ public class ManagerService {
public Response signup(ManagerSignup input) {
ManagerEntity newManager = new ManagerEntity();
- newManager.signup(
- input.name,
- input.phone,
- input.password,
- input.eateryName
- );
+ newManager.signup(input.name, input.phone, input.password);
+
+ ManagerCreate message = new ManagerCreate();
+ message.id = newManager.id;
+ message.eateryName = input.eateryName;
+
+ managerEmitter.send(message);
return Response.status(Response.Status.CREATED)
.header(InternalValue.userId, newManager.id.toString())
diff --git a/account-service/src/main/resources/application.properties b/account-service/src/main/resources/application.properties
index af3a9a5..e26a74b 100644
--- a/account-service/src/main/resources/application.properties
+++ b/account-service/src/main/resources/application.properties
@@ -27,4 +27,13 @@ quarkus.index-dependency.lib.artifact-id=lib
quarkus.native.container-build=true
quarkus.native.remote-container-build=true
quarkus.native.additional-build-args=--initialize-at-run-time=com.password4j.AlgorithmFinder,--future-defaults=all
-quarkus.native.resources.includes=com/google/i18n/phonenumbers/data/**/*
\ No newline at end of file
+quarkus.native.resources.includes=com/google/i18n/phonenumbers/data/**/*
+
+# Kafka
+%prod.mp.messaging.connector.smallrye-kafka.bootstrap.servers=${KAFKA_SERVICE_SERVICE_HOST:host.docker.internal}:9092
+
+## Create restaurant topic
+mp.messaging.outgoing.manager-out.connector=smallrye-kafka
+mp.messaging.outgoing.manager-out.topic=create-restaurant
+mp.messaging.outgoing.manager-out.value.serializer=io.quarkus.kafka.client.serialization.ObjectMapperSerializer
+quarkus.messaging.kafka.serializer-generation.enabled=true
\ No newline at end of file
diff --git a/account-service/src/test/java/com/drinkool/services/AccountServiceTest.java b/account-service/src/test/java/com/drinkool/services/AccountServiceTest.java
index c8880af..cf06231 100644
--- a/account-service/src/test/java/com/drinkool/services/AccountServiceTest.java
+++ b/account-service/src/test/java/com/drinkool/services/AccountServiceTest.java
@@ -4,6 +4,7 @@ import static io.restassured.RestAssured.*;
import com.drinkool.*;
import com.drinkool.dtos.*;
+
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
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 2838545..4737e7e 100644
--- a/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java
+++ b/account-service/src/test/java/com/drinkool/services/BaseServiceTest.java
@@ -5,6 +5,7 @@ import static org.hamcrest.CoreMatchers.*;
import com.drinkool.*;
import com.drinkool.dtos.*;
+
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
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 a823961..50d8459 100644
--- a/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java
+++ b/account-service/src/test/java/com/drinkool/services/CustomerServiceTest.java
@@ -1,12 +1,12 @@
package com.drinkool.services;
import static io.restassured.RestAssured.*;
-import static org.hamcrest.CoreMatchers.*;
import static org.junit.jupiter.api.Assertions.*;
import com.drinkool.*;
import com.drinkool.dtos.*;
import com.drinkool.entities.CustomerEntity;
+
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import jakarta.inject.Inject;
diff --git a/account-service/src/test/java/com/drinkool/services/ManagerServiceTest.java b/account-service/src/test/java/com/drinkool/services/ManagerServiceTest.java
new file mode 100644
index 0000000..c2343a0
--- /dev/null
+++ b/account-service/src/test/java/com/drinkool/services/ManagerServiceTest.java
@@ -0,0 +1,122 @@
+package com.drinkool.services;
+
+import static io.restassured.RestAssured.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import com.drinkool.*;
+import com.drinkool.dtos.*;
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.kafka.*;
+import io.restassured.http.ContentType;
+import io.smallrye.reactive.messaging.kafka.companion.ConsumerTask;
+import io.smallrye.reactive.messaging.kafka.companion.KafkaCompanion;
+import java.time.Duration;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+@QuarkusTestResource(KafkaCompanionResource.class)
+public class ManagerServiceTest {
+
+ @InjectKafkaCompanion
+ KafkaCompanion companion;
+
+ @ConfigProperty(name = "mp.messaging.outgoing.manager-out.topic")
+ String topicName;
+
+ @Test
+ void testSignupSuccessAndKafkaMessageSent() {
+ ManagerSignup input = new ManagerSignup();
+ input.name = "Ho Van Quan";
+ input.phone = Utils.generateRandomPhone();
+ input.password = "strong_password";
+ input.eateryName = "Quan Com Ngon";
+
+ ConsumerTask consumer = companion
+ .consumeStrings()
+ .fromTopics(topicName, 1);
+
+ // 2. Gọi API POST /signup
+ var response = given()
+ .contentType("application/json")
+ .body(input)
+ .when()
+ .post(Role.Manager + Url.Signup)
+ .then()
+ .statusCode(201)
+ .header(InternalValue.userId, org.hamcrest.Matchers.notNullValue())
+ .header(InternalValue.role, Role.Manager)
+ .extract();
+
+ String userId = response.header(InternalValue.userId);
+
+ var records = consumer.awaitCompletion(Duration.ofSeconds(15)).getRecords();
+
+ assertEquals(1, records.size());
+ String kafkaPayload = records.get(0).value();
+
+ assertTrue(kafkaPayload.contains(userId));
+ assertTrue(kafkaPayload.contains("Quan Com Ngon"));
+ }
+
+ @Test
+ void testLoginSuccess() {
+ // BƯỚC 1: Tạo user trước bằng signup
+ String phone = Utils.generateRandomPhone();
+ ManagerSignup signupData = new ManagerSignup();
+ signupData.name = "Login User";
+ signupData.phone = phone;
+ signupData.password = "secure_pass";
+ signupData.eateryName = "Test Eatery";
+
+ given()
+ .contentType(ContentType.JSON)
+ .body(signupData)
+ .post(Role.Manager + Url.Signup)
+ .then()
+ .statusCode(201);
+
+ // BƯỚC 2: Thử đăng nhập
+ Login loginInput = new Login();
+ loginInput.phone = phone;
+ loginInput.password = "secure_pass";
+
+ given()
+ .contentType(ContentType.JSON)
+ .body(loginInput)
+ .when()
+ .post(Role.Manager + Url.Login)
+ .then()
+ .statusCode(202);
+ }
+
+ @Test
+ void testLoginFailWrongPassword() {
+ String phone = Utils.generateRandomPhone();
+ ManagerSignup signupData = new ManagerSignup();
+ signupData.name = "Wrong Pass User";
+ signupData.phone = phone;
+ signupData.password = "correct_password";
+ signupData.eateryName = "Test Eatery";
+
+ given()
+ .contentType(ContentType.JSON)
+ .body(signupData)
+ .post(Role.Manager + Url.Signup)
+ .then()
+ .statusCode(201);
+
+ Login loginInput = new Login();
+ loginInput.phone = phone;
+ loginInput.password = "wrong_password";
+
+ given()
+ .contentType(ContentType.JSON)
+ .body(loginInput)
+ .when()
+ .post(Role.Manager + Url.Login)
+ .then()
+ .statusCode(400); // BadRequestException
+ }
+}
diff --git a/eatery-service/pom.xml b/eatery-service/pom.xml
index 60415e3..9f926e5 100644
--- a/eatery-service/pom.xml
+++ b/eatery-service/pom.xml
@@ -1,9 +1,5 @@
-
-
+
+
4.0.0
@@ -20,11 +16,9 @@
3.15.0
25
UTF-8
- UTF-8
+ UTF-8
quarkus-bom
- io.quarkus.platform
+ io.quarkus.platform
3.32.4
true
3.5.4
@@ -48,6 +42,20 @@
lib
${project.version}
+
+ io.quarkus
+ quarkus-messaging-kafka
+
+
+ io.smallrye.reactive
+ smallrye-reactive-messaging-in-memory
+ test
+
+
+ org.bitbucket.b_c
+ jose4j
+ 0.9.3
+
io.quarkus
quarkus-jdbc-h2
@@ -114,8 +122,7 @@
@{argLine}
- org.jboss.logmanager.LogManager
+ org.jboss.logmanager.LogManager
${maven.home}
1
@@ -137,10 +144,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/eatery-service/src/main/docker/Dockerfile.jvm b/eatery-service/src/main/docker/Dockerfile.jvm
index 23c1893..2431b4b 100644
--- a/eatery-service/src/main/docker/Dockerfile.jvm
+++ b/eatery-service/src/main/docker/Dockerfile.jvm
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/eatery-service/src/main/docker/Dockerfile.legacy-jar b/eatery-service/src/main/docker/Dockerfile.legacy-jar
index 5059b5c..735c308 100644
--- a/eatery-service/src/main/docker/Dockerfile.legacy-jar
+++ b/eatery-service/src/main/docker/Dockerfile.legacy-jar
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/eatery-service/src/main/java/com/drinkool/entities/EateryEntity.java b/eatery-service/src/main/java/com/drinkool/entities/EateryEntity.java
new file mode 100644
index 0000000..ae47d29
--- /dev/null
+++ b/eatery-service/src/main/java/com/drinkool/entities/EateryEntity.java
@@ -0,0 +1,37 @@
+package com.drinkool.entities;
+
+import com.drinkool.lib.entities.BaseEntity;
+import jakarta.persistence.*;
+import jakarta.transaction.Transactional;
+import java.util.UUID;
+
+@Entity
+@Table
+public class EateryEntity extends BaseEntity {
+
+ @Column(unique = true, nullable = false)
+ public UUID ownerId;
+
+ @Column(unique = true, nullable = false)
+ public String name;
+
+ @Column(nullable = false)
+ public boolean isVerified = false;
+
+ public EateryEntity() {}
+
+ @Transactional
+ public void create(UUID ownerId, String name) {
+ EateryEntity existedEatery = EateryEntity.find(
+ "ownerId",
+ ownerId
+ ).firstResult();
+
+ if (existedEatery != null) throw new RuntimeException("ExistedEatery");
+
+ this.ownerId = ownerId;
+ this.name = name;
+
+ this.persist();
+ }
+}
diff --git a/eatery-service/src/main/java/com/drinkool/entities/EateryInventoryItemEntity.java b/eatery-service/src/main/java/com/drinkool/entities/EateryInventoryItemEntity.java
index 334655b..e428384 100644
--- a/eatery-service/src/main/java/com/drinkool/entities/EateryInventoryItemEntity.java
+++ b/eatery-service/src/main/java/com/drinkool/entities/EateryInventoryItemEntity.java
@@ -1,5 +1,6 @@
package com.drinkool.entities;
+import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
diff --git a/eatery-service/src/main/java/com/drinkool/entities/InventoryItemEntity.java b/eatery-service/src/main/java/com/drinkool/entities/InventoryItemEntity.java
index d83d1d0..e85a8e1 100644
--- a/eatery-service/src/main/java/com/drinkool/entities/InventoryItemEntity.java
+++ b/eatery-service/src/main/java/com/drinkool/entities/InventoryItemEntity.java
@@ -1,5 +1,6 @@
package com.drinkool.entities;
+import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.transaction.Transactional;
diff --git a/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java b/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java
index 81da14b..efbd32a 100644
--- a/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java
+++ b/eatery-service/src/main/java/com/drinkool/entities/MenuItemEntity.java
@@ -1,5 +1,6 @@
package com.drinkool.entities;
+import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
import java.util.*;
diff --git a/eatery-service/src/main/java/com/drinkool/entities/MenuItemIngredientEntity.java b/eatery-service/src/main/java/com/drinkool/entities/MenuItemIngredientEntity.java
index 2c01f3c..17f7cd8 100644
--- a/eatery-service/src/main/java/com/drinkool/entities/MenuItemIngredientEntity.java
+++ b/eatery-service/src/main/java/com/drinkool/entities/MenuItemIngredientEntity.java
@@ -1,5 +1,6 @@
package com.drinkool.entities;
+import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.*;
@Entity
diff --git a/eatery-service/src/main/java/com/drinkool/entities/ReviewEntity.java b/eatery-service/src/main/java/com/drinkool/entities/ReviewEntity.java
index efd5e77..4477958 100644
--- a/eatery-service/src/main/java/com/drinkool/entities/ReviewEntity.java
+++ b/eatery-service/src/main/java/com/drinkool/entities/ReviewEntity.java
@@ -1,6 +1,6 @@
package com.drinkool.entities;
-import com.drinkool.models.ReviewModel;
+import com.drinkool.lib.models.ReviewModel;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
import java.util.UUID;
diff --git a/eatery-service/src/main/java/com/drinkool/services/EateryService.java b/eatery-service/src/main/java/com/drinkool/services/EateryService.java
new file mode 100644
index 0000000..68844ef
--- /dev/null
+++ b/eatery-service/src/main/java/com/drinkool/services/EateryService.java
@@ -0,0 +1,20 @@
+package com.drinkool.services;
+
+import com.drinkool.dtos.event.ManagerCreate;
+import com.drinkool.entities.EateryEntity;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.transaction.Transactional;
+import org.eclipse.microprofile.reactive.messaging.Incoming;
+
+@ApplicationScoped
+public class EateryService {
+
+ @Incoming("manager-in")
+ @Transactional
+ public void consumeManagerSignup(ManagerCreate input) {
+ EateryEntity eatery = new EateryEntity();
+
+ eatery.create(input.id, input.eateryName);
+ }
+}
diff --git a/eatery-service/src/main/resources/application.properties b/eatery-service/src/main/resources/application.properties
index ff3d981..6652b84 100644
--- a/eatery-service/src/main/resources/application.properties
+++ b/eatery-service/src/main/resources/application.properties
@@ -3,7 +3,7 @@
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=postgres
quarkus.datasource.password=password
-quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/eatery
+quarkus.datasource.jdbc.url=jdbc:postgresql://host.docker.internal:5432/postgres
## Tự động tạo bảng từ Entity (chỉ dùng cho môi trường dev)
quarkus.hibernate-orm.database.generation=update
@@ -24,4 +24,13 @@ quarkus.index-dependency.lib.artifact-id=lib
# Build
quarkus.native.container-build=true
quarkus.native.remote-container-build=true
-quarkus.native.additional-build-args=--future-defaults=all
\ No newline at end of file
+quarkus.native.additional-build-args=--future-defaults=all
+
+# Kafka
+mp.messaging.connector.smallrye-kafka.bootstrap.servers=${KAFKA_SERVICE_SERVICE_HOST:host.docker.internal}:9092
+
+## Create restaurant topic
+mp.messaging.incoming.manager-in.connector=smallrye-kafka
+mp.messaging.incoming.manager-in.topic=create-restaurant
+mp.messaging.incoming.manager-in.auto.offset.reset=earliest
+quarkus.messaging.kafka.serializer-generation.enabled=true
\ No newline at end of file
diff --git a/eatery-service/src/test/java/com/drinkool/entities/ReviewEntityTest.java b/eatery-service/src/test/java/com/drinkool/entities/ReviewEntityTest.java
index 956b795..9dedee1 100644
--- a/eatery-service/src/test/java/com/drinkool/entities/ReviewEntityTest.java
+++ b/eatery-service/src/test/java/com/drinkool/entities/ReviewEntityTest.java
@@ -1,6 +1,6 @@
package com.drinkool.entities;
-import com.drinkool.models.ReviewModel;
+import com.drinkool.lib.models.ReviewModel;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.transaction.Transactional;
import java.util.UUID;
diff --git a/eatery-service/src/test/java/com/drinkool/services/EateryServiceTest.java b/eatery-service/src/test/java/com/drinkool/services/EateryServiceTest.java
new file mode 100644
index 0000000..897be96
--- /dev/null
+++ b/eatery-service/src/test/java/com/drinkool/services/EateryServiceTest.java
@@ -0,0 +1,43 @@
+package com.drinkool.services;
+
+import com.drinkool.dtos.event.ManagerCreate;
+import com.drinkool.entities.EateryEntity;
+import io.quarkus.test.junit.QuarkusTest;
+import io.smallrye.reactive.messaging.memory.InMemoryConnector;
+import jakarta.enterprise.context.control.ActivateRequestContext;
+import jakarta.enterprise.inject.Any;
+import jakarta.inject.Inject;
+import java.util.UUID;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+public class EateryServiceTest {
+
+ @Inject
+ @Any
+ InMemoryConnector connector;
+
+ @Test
+ @ActivateRequestContext
+ void testConsumeManagerSignup() throws InterruptedException {
+ // 1. Chuẩn bị dữ liệu giả lập
+ ManagerCreate input = new ManagerCreate();
+ input.id = UUID.randomUUID(); // Giả sử manager ID là 99
+ input.eateryName = "Quan Bun Cha Test";
+
+ // 2. Đẩy tin nhắn vào channel "manager-in" bằng InMemoryConnector
+ connector.source("manager-in").send(input);
+
+ Thread.sleep(1000);
+
+ // 3. Kiểm tra kết quả trong Database
+ // Lưu ý: Vì xử lý Kafka là bất đồng bộ, đôi khi cần đợi vài miligiây
+ // nhưng với InMemoryConnector thì thường là tức thì.
+
+ EateryEntity eatery = EateryEntity.find("ownerId", input.id).firstResult();
+
+ Assertions.assertNotNull(eatery, "Eatery should be created in DB");
+ Assertions.assertEquals("Quan Bun Cha Test", eatery.name);
+ }
+}
diff --git a/eatery-service/src/test/java/com/drinkool/services/ReviewServiceTest.java b/eatery-service/src/test/java/com/drinkool/services/ReviewServiceTest.java
index 69c5c34..5ed751e 100644
--- a/eatery-service/src/test/java/com/drinkool/services/ReviewServiceTest.java
+++ b/eatery-service/src/test/java/com/drinkool/services/ReviewServiceTest.java
@@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.*;
import com.drinkool.dtos.SendReview;
import com.drinkool.entities.ReviewEntity;
-import com.drinkool.models.ReviewModel;
+import com.drinkool.lib.models.ReviewModel;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import java.util.Random;
diff --git a/eatery-service/src/test/resources/application.properties b/eatery-service/src/test/resources/application.properties
index 42128a9..f69780f 100644
--- a/eatery-service/src/test/resources/application.properties
+++ b/eatery-service/src/test/resources/application.properties
@@ -7,4 +7,7 @@ quarkus.http.host=0.0.0.0
%test.quarkus.datasource.jdbc.url=jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1
## Orm
-%test.quarkus.hibernate-orm.database.generation=drop-and-create
\ No newline at end of file
+%test.quarkus.hibernate-orm.database.generation=drop-and-create
+
+# Kafka
+mp.messaging.incoming.manager-in.connector=smallrye-in-memory
\ No newline at end of file
diff --git a/gateway-service/src/main/docker/Dockerfile.jvm b/gateway-service/src/main/docker/Dockerfile.jvm
index 5d81f84..fe587ea 100644
--- a/gateway-service/src/main/docker/Dockerfile.jvm
+++ b/gateway-service/src/main/docker/Dockerfile.jvm
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/gateway-service/src/main/docker/Dockerfile.legacy-jar b/gateway-service/src/main/docker/Dockerfile.legacy-jar
index 604f97d..15bc9a6 100644
--- a/gateway-service/src/main/docker/Dockerfile.legacy-jar
+++ b/gateway-service/src/main/docker/Dockerfile.legacy-jar
@@ -80,7 +80,7 @@
# You can find more information about the UBI base runtime images and their configuration here:
# https://rh-openjdk.github.io/redhat-openjdk-containers/
###
-FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:1.24
+FROM registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24
ENV LANGUAGE='en_US:en'
diff --git a/gateway-service/src/main/java/com/drinkool/controller/BaseController.java b/gateway-service/src/main/java/com/drinkool/controller/BaseController.java
index c87ecb6..7937ab4 100644
--- a/gateway-service/src/main/java/com/drinkool/controller/BaseController.java
+++ b/gateway-service/src/main/java/com/drinkool/controller/BaseController.java
@@ -1,12 +1,13 @@
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;
+import com.drinkool.InternalValue;
+import com.drinkool.Url;
+
public abstract class BaseController {
@POST
diff --git a/gateway-service/src/main/java/com/drinkool/controller/ManagerController.java b/gateway-service/src/main/java/com/drinkool/controller/ManagerController.java
new file mode 100644
index 0000000..6e3667f
--- /dev/null
+++ b/gateway-service/src/main/java/com/drinkool/controller/ManagerController.java
@@ -0,0 +1,36 @@
+package com.drinkool.controller;
+
+import com.drinkool.*;
+import com.drinkool.dtos.*;
+import com.drinkool.services.ManagerService;
+import io.smallrye.mutiny.Uni;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import java.util.*;
+import org.eclipse.microprofile.rest.client.inject.RestClient;
+
+@Path("/api/" + Role.Manager)
+public class ManagerController extends BaseController {
+
+ @Inject
+ @RestClient
+ ManagerService managerService;
+
+ @POST
+ @Path(Url.Signup)
+ public Uni proxySignup(ManagerSignup input) {
+ return managerService.signup(input);
+ }
+
+ @POST
+ @Path(Url.Login)
+ public Uni proxyLogin(Login input) {
+ return managerService.login(input);
+ }
+
+ @GET
+ public Uni me(@HeaderParam(InternalValue.userId) UUID id) {
+ return managerService.me(id);
+ }
+}
diff --git a/gateway-service/src/main/java/com/drinkool/filters/InternalHeaderGatewayFilter.java b/gateway-service/src/main/java/com/drinkool/filters/InternalHeaderGatewayFilter.java
index 99afa06..0cef877 100644
--- a/gateway-service/src/main/java/com/drinkool/filters/InternalHeaderGatewayFilter.java
+++ b/gateway-service/src/main/java/com/drinkool/filters/InternalHeaderGatewayFilter.java
@@ -1,6 +1,5 @@
package com.drinkool.filters;
-import com.drinkool.InternalValue;
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.container.*;
@@ -16,6 +15,8 @@ import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.keys.HmacKey;
+import com.drinkool.InternalValue;
+
public class InternalHeaderGatewayFilter {
@ConfigProperty(name = "gateway.jwt.secret")
diff --git a/gateway-service/src/main/java/com/drinkool/services/BaseService.java b/gateway-service/src/main/java/com/drinkool/services/BaseService.java
index 48a87a5..9b0828c 100644
--- a/gateway-service/src/main/java/com/drinkool/services/BaseService.java
+++ b/gateway-service/src/main/java/com/drinkool/services/BaseService.java
@@ -2,6 +2,7 @@ package com.drinkool.services;
import com.drinkool.Url;
import com.drinkool.dtos.SmsOtp;
+
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
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 123d3f8..42147a6 100644
--- a/gateway-service/src/main/java/com/drinkool/services/CustomerService.java
+++ b/gateway-service/src/main/java/com/drinkool/services/CustomerService.java
@@ -1,7 +1,10 @@
package com.drinkool.services;
-import com.drinkool.*;
+import com.drinkool.InternalValue;
+import com.drinkool.Role;
+import com.drinkool.Url;
import com.drinkool.dtos.*;
+
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
diff --git a/gateway-service/src/main/java/com/drinkool/services/ManagerService.java b/gateway-service/src/main/java/com/drinkool/services/ManagerService.java
new file mode 100644
index 0000000..aeb0c3d
--- /dev/null
+++ b/gateway-service/src/main/java/com/drinkool/services/ManagerService.java
@@ -0,0 +1,28 @@
+package com.drinkool.services;
+
+import com.drinkool.InternalValue;
+import com.drinkool.Role;
+import com.drinkool.Url;
+import com.drinkool.dtos.*;
+
+import io.smallrye.mutiny.Uni;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import java.util.*;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+@RegisterRestClient(configKey = "account")
+@Path(Role.Manager)
+public interface ManagerService {
+ @POST
+ @Path(Url.Signup)
+ Uni signup(ManagerSignup input);
+
+ @POST
+ @Path(Url.Login)
+ Uni login(Login input);
+
+ @GET
+ @Path(Url.Me)
+ Uni me(@HeaderParam(InternalValue.userId) UUID id);
+}
diff --git a/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java b/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java
index 91c0680..3b04780 100644
--- a/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java
+++ b/gateway-service/src/test/java/com/drinkool/controller/BaseControllerTest.java
@@ -4,6 +4,7 @@ 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;
diff --git a/gateway-service/src/test/java/com/drinkool/filters/InternalHeaderGatewayFilterTest.java b/gateway-service/src/test/java/com/drinkool/filters/InternalHeaderGatewayFilterTest.java
index 205c5b8..a53e7a2 100644
--- a/gateway-service/src/test/java/com/drinkool/filters/InternalHeaderGatewayFilterTest.java
+++ b/gateway-service/src/test/java/com/drinkool/filters/InternalHeaderGatewayFilterTest.java
@@ -4,7 +4,6 @@ import static io.restassured.RestAssured.*;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.jupiter.api.Assertions.*;
-import com.drinkool.InternalValue;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.response.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -15,6 +14,8 @@ import org.jose4j.keys.HmacKey;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import com.drinkool.InternalValue;
+
@QuarkusTest
public class InternalHeaderGatewayFilterTest {
diff --git a/k8s.yaml b/k8s.yaml
deleted file mode 100644
index 006c114..0000000
--- a/k8s.yaml
+++ /dev/null
@@ -1,208 +0,0 @@
-# 1. ACCOUNT SERVICE
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: account-deploy
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: account
- template:
- metadata:
- labels:
- app: account
- spec:
- containers:
- - name: account-pod
- image: git.demonkernel.io.vn/foodsurf/account-service:1.5.10
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 8080
- env:
- - name: REDIS_SERVICE
- value: "redis-service"
- - name: QUARKUS_DATASOURCE_PASSWORD
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: password
- - name: QUARKUS_DATASOURCE_USERNAME
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: username
- - name: QUARKUS_DATASOURCE_JDBC_URL
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: url
- resources:
- requests:
- memory: "32Mi"
- cpu: "50m"
- limits:
- memory: "64Mi"
- cpu: "250m"
----
-apiVersion: v1
-kind: Service
-metadata:
- name: account-service
-spec:
- selector:
- app: account
- ports:
- - port: 80
- targetPort: 8080
----
-# 2. EATERY SERVICE
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: eatery-deploy
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: eatery
- template:
- metadata:
- labels:
- app: eatery
- spec:
- containers:
- - name: eatery-pod
- image: git.demonkernel.io.vn/foodsurf/eatery-service:1.5.10
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 8080
- env:
- - name: QUARKUS_DATASOURCE_PASSWORD
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: password
- - name: QUARKUS_DATASOURCE_USERNAME
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: username
- - name: QUARKUS_DATASOURCE_JDBC_URL
- valueFrom:
- secretKeyRef:
- name: postgres-credentials
- key: url
- resources:
- requests:
- memory: "32Mi"
- cpu: "50m"
- limits:
- memory: "64Mi"
- cpu: "250m"
----
-apiVersion: v1
-kind: Service
-metadata:
- name: eatery-service
-spec:
- selector:
- app: eatery
- ports:
- - port: 80
- targetPort: 8080
----
-# 3. GATEWAY SERVICE
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: gateway-deploy
-spec:
- replicas: 1
- selector:
- matchLabels:
- app: gateway
- template:
- metadata:
- labels:
- app: gateway
- spec:
- containers:
- - name: gateway-pod
- image: git.demonkernel.io.vn/foodsurf/gateway-service:1.5.10
- imagePullPolicy: IfNotPresent
- ports:
- - containerPort: 8080
- env:
- - name: QUARKUS_REST_CLIENT_ACCOUNT_URL
- value: "http://account-service"
- - name: GATEWAY_JWT_SECRET
- valueFrom:
- secretKeyRef:
- name: jwt-secret
- key: secret
- resources:
- requests:
- memory: "32Mi"
- cpu: "50m"
- limits:
- memory: "64Mi"
- cpu: "250m"
----
-apiVersion: v1
-kind: Service
-metadata:
- name: gateway-service
-spec:
- type: NodePort
- selector:
- app: gateway
- ports:
- - port: 80
- targetPort: 8080
- nodePort: 32080
----
-# 4. REDIS
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: redis-deploy
-spec:
- selector:
- matchLabels:
- app: redis
- template:
- metadata:
- labels:
- app: redis
- spec:
- containers:
- - name: redis-pod
- image: redis:alpine
- ports:
- - containerPort: 6379
- resources:
- limits:
- cpu: "100m"
- memory: "128Mi"
- requests:
- cpu: "20m"
- memory: "64Mi"
- command:
- [
- "redis-server",
- "--maxmemory",
- "96mb",
- "--maxmemory-policy",
- "allkeys-lru",
- ]
----
-apiVersion: v1
-kind: Service
-metadata:
- name: redis-service
-spec:
- selector:
- app: redis
- ports:
- - port: 6379
diff --git a/k8s/account.yaml b/k8s/account.yaml
new file mode 100644
index 0000000..67bf1c5
--- /dev/null
+++ b/k8s/account.yaml
@@ -0,0 +1,58 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: account-deploy
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: account
+ template:
+ metadata:
+ labels:
+ app: account
+ spec:
+ containers:
+ - name: account-pod
+ image: git.demonkernel.io.vn/foodsurf/account-service:1.5.10
+ imagePullPolicy: IfNotPresent
+ ports:
+ - containerPort: 8080
+ env:
+ - name: REDIS_SERVICE
+ value: "redis-service"
+ - name: KAFKA_SERVICE
+ value: "kafka-service"
+ - name: QUARKUS_DATASOURCE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: password
+ - name: QUARKUS_DATASOURCE_USERNAME
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: username
+ - name: QUARKUS_DATASOURCE_JDBC_URL
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: url
+ resources:
+ requests:
+ memory: "32Mi"
+ cpu: "50m"
+ limits:
+ memory: "64Mi"
+ cpu: "250m"
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: account-service
+spec:
+ selector:
+ app: account
+ ports:
+ - port: 80
+ targetPort: 8080
\ No newline at end of file
diff --git a/k8s/eatery.yaml b/k8s/eatery.yaml
new file mode 100644
index 0000000..62523f9
--- /dev/null
+++ b/k8s/eatery.yaml
@@ -0,0 +1,57 @@
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: eatery-deploy
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: eatery
+ template:
+ metadata:
+ labels:
+ app: eatery
+ spec:
+ containers:
+ - name: eatery-pod
+ image: git.demonkernel.io.vn/foodsurf/eatery-service:1.5.10
+ imagePullPolicy: IfNotPresent
+ ports:
+ - containerPort: 8080
+ env:
+ - name: KAFKA_SERVICE
+ value: "kafka-service"
+ - name: QUARKUS_DATASOURCE_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: password
+ - name: QUARKUS_DATASOURCE_USERNAME
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: username
+ - name: QUARKUS_DATASOURCE_JDBC_URL
+ valueFrom:
+ secretKeyRef:
+ name: postgres-credentials
+ key: url
+ resources:
+ requests:
+ memory: "32Mi"
+ cpu: "50m"
+ limits:
+ memory: "64Mi"
+ cpu: "250m"
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: eatery-service
+spec:
+ selector:
+ app: eatery
+ ports:
+ - port: 80
+ targetPort: 8080
\ No newline at end of file
diff --git a/k8s/gateway.yaml b/k8s/gateway.yaml
new file mode 100644
index 0000000..d4bc419
--- /dev/null
+++ b/k8s/gateway.yaml
@@ -0,0 +1,48 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: gateway-deploy
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: gateway
+ template:
+ metadata:
+ labels:
+ app: gateway
+ spec:
+ containers:
+ - name: gateway-pod
+ image: git.demonkernel.io.vn/foodsurf/gateway-service:1.5.10
+ imagePullPolicy: IfNotPresent
+ ports:
+ - containerPort: 8080
+ env:
+ - name: QUARKUS_REST_CLIENT_ACCOUNT_URL
+ value: "http://account-service"
+ - name: GATEWAY_JWT_SECRET
+ valueFrom:
+ secretKeyRef:
+ name: jwt-secret
+ key: secret
+ resources:
+ requests:
+ memory: "32Mi"
+ cpu: "50m"
+ limits:
+ memory: "64Mi"
+ cpu: "250m"
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: gateway-service
+spec:
+ type: NodePort
+ selector:
+ app: gateway
+ ports:
+ - port: 80
+ targetPort: 8080
+ nodePort: 32080
\ No newline at end of file
diff --git a/k8s/kafdrop.yaml b/k8s/kafdrop.yaml
new file mode 100644
index 0000000..9e0a2ed
--- /dev/null
+++ b/k8s/kafdrop.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: kafdrop
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: kafdrop
+ template:
+ metadata:
+ labels:
+ app: kafdrop
+ spec:
+ containers:
+ - name: kafdrop
+ image: obsidiandynamics/kafdrop
+ ports:
+ - containerPort: 9000
+ env:
+ - name: KAFKA_BROKERCONNECT
+ value: "kafka-service:9092" # Trỏ vào service Kafka của bạn
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: kafdrop-svc
+spec:
+ type: NodePort
+ selector:
+ app: kafdrop
+ ports:
+ - protocol: TCP
+ port: 9000
+ nodePort: 30900
\ No newline at end of file
diff --git a/k8s/kafka.yaml b/k8s/kafka.yaml
new file mode 100644
index 0000000..951ba58
--- /dev/null
+++ b/k8s/kafka.yaml
@@ -0,0 +1,52 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: kafka-service
+spec:
+ ports:
+ - port: 9092
+ selector:
+ app: kafka
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: kafka-deployment
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: kafka
+ template:
+ metadata:
+ labels:
+ app: kafka
+ spec:
+ containers:
+ - name: kafka
+ image: apache/kafka:latest
+ ports:
+ - containerPort: 9092
+ env:
+ - name: KAFKA_NODE_ID
+ value: "1"
+ - name: KAFKA_PROCESS_ROLES
+ value: "broker,controller"
+ - name: KAFKA_LISTENERS
+ value: "PLAINTEXT://:9092,CONTROLLER://:9093"
+ - name: KAFKA_ADVERTISED_LISTENERS
+ value: "PLAINTEXT://kafka-service:9092"
+ - name: KAFKA_CONTROLLER_QUORUM_VOTERS
+ value: "1@127.0.0.1:9093"
+ - name: KAFKA_CONTROLLER_LISTENER_NAMES
+ value: "CONTROLLER"
+ - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
+ value: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
+ - name: KAFKA_AUTO_CREATE_TOPICS_ENABLE
+ value: "true"
+ - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
+ value: "1"
+ - name: KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR
+ value: "1"
+ - name: KAFKA_TRANSACTION_STATE_LOG_MIN_ISR
+ value: "1"
\ No newline at end of file
diff --git a/k8s/redis.yaml b/k8s/redis.yaml
new file mode 100644
index 0000000..1f11a6b
--- /dev/null
+++ b/k8s/redis.yaml
@@ -0,0 +1,43 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: redis-deploy
+spec:
+ selector:
+ matchLabels:
+ app: redis
+ template:
+ metadata:
+ labels:
+ app: redis
+ spec:
+ containers:
+ - name: redis-pod
+ image: redis:alpine
+ ports:
+ - containerPort: 6379
+ resources:
+ limits:
+ cpu: "100m"
+ memory: "128Mi"
+ requests:
+ cpu: "20m"
+ memory: "64Mi"
+ command:
+ [
+ "redis-server",
+ "--maxmemory",
+ "96mb",
+ "--maxmemory-policy",
+ "allkeys-lru",
+ ]
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: redis-service
+spec:
+ selector:
+ app: redis
+ ports:
+ - port: 6379
\ No newline at end of file
diff --git a/lib/pom.xml b/lib/pom.xml
index 5446ca6..56ee628 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -26,6 +26,16 @@
jackson-annotations
2.15.2
+
+ io.quarkus
+ quarkus-kafka-client
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+ provided
+
jakarta.persistence
jakarta.persistence-api
diff --git a/lib/src/main/java/com/drinkool/dtos/SendReview.java b/lib/src/main/java/com/drinkool/dtos/SendReview.java
index 637f40b..c0fb899 100644
--- a/lib/src/main/java/com/drinkool/dtos/SendReview.java
+++ b/lib/src/main/java/com/drinkool/dtos/SendReview.java
@@ -1,6 +1,6 @@
package com.drinkool.dtos;
-import com.drinkool.models.ReviewModel;
+import com.drinkool.lib.models.ReviewModel;
import java.util.UUID;
public class SendReview {
diff --git a/lib/src/main/java/com/drinkool/dtos/event/ManagerCreate.java b/lib/src/main/java/com/drinkool/dtos/event/ManagerCreate.java
new file mode 100644
index 0000000..e337a6f
--- /dev/null
+++ b/lib/src/main/java/com/drinkool/dtos/event/ManagerCreate.java
@@ -0,0 +1,17 @@
+package com.drinkool.dtos.event;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
+import java.util.UUID;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@RegisterForReflection
+@Getter
+@Setter
+@NoArgsConstructor
+public class ManagerCreate {
+
+ public UUID id;
+ public String eateryName;
+}
diff --git a/lib/src/main/java/com/drinkool/entities/BaseEntity.java b/lib/src/main/java/com/drinkool/lib/entities/BaseEntity.java
similarity index 88%
rename from lib/src/main/java/com/drinkool/entities/BaseEntity.java
rename to lib/src/main/java/com/drinkool/lib/entities/BaseEntity.java
index 984cab9..0ee8e50 100644
--- a/lib/src/main/java/com/drinkool/entities/BaseEntity.java
+++ b/lib/src/main/java/com/drinkool/lib/entities/BaseEntity.java
@@ -1,4 +1,4 @@
-package com.drinkool.entities;
+package com.drinkool.lib.entities;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import jakarta.persistence.*;
diff --git a/lib/src/main/java/com/drinkool/models/ReviewModel.java b/lib/src/main/java/com/drinkool/lib/models/ReviewModel.java
similarity index 87%
rename from lib/src/main/java/com/drinkool/models/ReviewModel.java
rename to lib/src/main/java/com/drinkool/lib/models/ReviewModel.java
index 58c4279..6412d6f 100644
--- a/lib/src/main/java/com/drinkool/models/ReviewModel.java
+++ b/lib/src/main/java/com/drinkool/lib/models/ReviewModel.java
@@ -1,6 +1,6 @@
-package com.drinkool.models;
+package com.drinkool.lib.models;
-import com.drinkool.entities.BaseEntity;
+import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.*;
import java.time.LocalDateTime;
diff --git a/scripts/build.sh b/scripts/build.sh
index 17b5426..8f96807 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -1,3 +1,3 @@
-mvn clean package -DskipTests -Pnative \
+mvn clean package -DskipTests \
-Dquarkus.container-image.push=false \
- -Dquarkus.container-image.registry=git.demonkernel.io.vn
+ -Dquarkus.container-image.registry=git.demonkernel.io.vn
diff --git a/scripts/publish.sh b/scripts/publish.sh
index 1becc04..e15d5d6 100755
--- a/scripts/publish.sh
+++ b/scripts/publish.sh
@@ -6,6 +6,6 @@ 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
+kubectl apply -f k8s -n drinkool-backend
cd "$CURRENT_DIR"
\ No newline at end of file