fix: create eatery when manager signup (#33)
Release package / release (push) Failing after 1m26s
Release package / release (push) Failing after 1m26s
Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com> Reviewed-on: #33
This commit was merged in pull request #33.
This commit is contained in:
@@ -38,7 +38,10 @@ jobs:
|
|||||||
- name: Cache Maven packages
|
- name: Cache Maven packages
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: |
|
||||||
|
~/.m2/repository
|
||||||
|
**/target/native-image-cache
|
||||||
|
**/target/reports
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-maven-
|
${{ runner.os }}-maven-
|
||||||
|
|||||||
@@ -30,7 +30,10 @@ jobs:
|
|||||||
- name: Cache Maven packages
|
- name: Cache Maven packages
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: |
|
||||||
|
~/.m2/repository
|
||||||
|
**/target/native-image-cache
|
||||||
|
**/target/reports
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-maven-
|
${{ runner.os }}-maven-
|
||||||
@@ -46,10 +49,13 @@ jobs:
|
|||||||
apt-get install -y --no-install-recommends --no-install-suggests \
|
apt-get install -y --no-install-recommends --no-install-suggests \
|
||||||
openjdk-25-jdk-headless docker-cli docker-buildx
|
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: |
|
run: |
|
||||||
./mvnw -B install \
|
./mvnw -B clean install -Pnative \
|
||||||
-Dquarkus.container-image.push=false -Pnative
|
-Dquarkus.container-image.push=false \
|
||||||
|
-Dquarkus.container-image.registry=git.demonkernel.io.vn
|
||||||
|
|
||||||
- name: Publish Test Report
|
- name: Publish Test Report
|
||||||
uses: dorny/test-reporter@v3
|
uses: dorny/test-reporter@v3
|
||||||
|
|||||||
@@ -49,6 +49,20 @@
|
|||||||
<artifactId>lib</artifactId>
|
<artifactId>lib</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bitbucket.b_c</groupId>
|
||||||
|
<artifactId>jose4j</artifactId>
|
||||||
|
<version>0.9.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-messaging-kafka</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-test-kafka-companion</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.quarkus</groupId>
|
<groupId>io.quarkus</groupId>
|
||||||
<artifactId>quarkus-jdbc-h2</artifactId>
|
<artifactId>quarkus-jdbc-h2</artifactId>
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -8,24 +8,7 @@ import jakarta.persistence.*;
|
|||||||
@Table(name = Role.Manager)
|
@Table(name = Role.Manager)
|
||||||
public class ManagerEntity extends UserModel {
|
public class ManagerEntity extends UserModel {
|
||||||
|
|
||||||
public String eateryName;
|
|
||||||
|
|
||||||
public boolean isVerified;
|
|
||||||
|
|
||||||
public ManagerEntity() {
|
public ManagerEntity() {
|
||||||
super(Role.Manager);
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.drinkool.models;
|
package com.drinkool.models;
|
||||||
|
|
||||||
import com.drinkool.entities.BaseEntity;
|
import com.drinkool.lib.entities.BaseEntity;
|
||||||
import com.drinkool.utils.PhoneValidator;
|
import com.drinkool.utils.PhoneValidator;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.password4j.Password;
|
import com.password4j.Password;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import jakarta.inject.Inject;
|
|||||||
import jakarta.ws.rs.*;
|
import jakarta.ws.rs.*;
|
||||||
import jakarta.ws.rs.core.Response;
|
import jakarta.ws.rs.core.Response;
|
||||||
|
|
||||||
@Path("")
|
@Path("/")
|
||||||
public class AccountService {
|
public class AccountService {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.drinkool.services;
|
|||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
import com.drinkool.entities.CustomerEntity;
|
import com.drinkool.entities.CustomerEntity;
|
||||||
|
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import jakarta.ws.rs.*;
|
import jakarta.ws.rs.*;
|
||||||
|
|||||||
@@ -2,13 +2,24 @@ package com.drinkool.services;
|
|||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
|
import com.drinkool.dtos.event.ManagerCreate;
|
||||||
import com.drinkool.entities.ManagerEntity;
|
import com.drinkool.entities.ManagerEntity;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import jakarta.ws.rs.*;
|
import jakarta.ws.rs.*;
|
||||||
import jakarta.ws.rs.core.*;
|
import jakarta.ws.rs.core.*;
|
||||||
|
import org.eclipse.microprofile.reactive.messaging.*;
|
||||||
|
|
||||||
@Path(Role.Manager)
|
@Path(Role.Manager)
|
||||||
public class ManagerService {
|
@ApplicationScoped
|
||||||
|
public class ManagerService extends BaseService<ManagerEntity> {
|
||||||
|
|
||||||
|
public ManagerService() {
|
||||||
|
super(ManagerEntity.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Channel("manager-out")
|
||||||
|
Emitter<ManagerCreate> managerEmitter;
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Path(Url.Signup)
|
@Path(Url.Signup)
|
||||||
@@ -16,12 +27,13 @@ public class ManagerService {
|
|||||||
public Response signup(ManagerSignup input) {
|
public Response signup(ManagerSignup input) {
|
||||||
ManagerEntity newManager = new ManagerEntity();
|
ManagerEntity newManager = new ManagerEntity();
|
||||||
|
|
||||||
newManager.signup(
|
newManager.signup(input.name, input.phone, input.password);
|
||||||
input.name,
|
|
||||||
input.phone,
|
ManagerCreate message = new ManagerCreate();
|
||||||
input.password,
|
message.id = newManager.id;
|
||||||
input.eateryName
|
message.eateryName = input.eateryName;
|
||||||
);
|
|
||||||
|
managerEmitter.send(message);
|
||||||
|
|
||||||
return Response.status(Response.Status.CREATED)
|
return Response.status(Response.Status.CREATED)
|
||||||
.header(InternalValue.userId, newManager.id.toString())
|
.header(InternalValue.userId, newManager.id.toString())
|
||||||
|
|||||||
@@ -28,3 +28,12 @@ quarkus.native.container-build=true
|
|||||||
quarkus.native.remote-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.additional-build-args=--initialize-at-run-time=com.password4j.AlgorithmFinder,--future-defaults=all
|
||||||
quarkus.native.resources.includes=com/google/i18n/phonenumbers/data/**/*
|
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
|
||||||
@@ -4,6 +4,7 @@ import static io.restassured.RestAssured.*;
|
|||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
|
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import io.restassured.http.ContentType;
|
import io.restassured.http.ContentType;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import static org.hamcrest.CoreMatchers.*;
|
|||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
|
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import io.restassured.http.ContentType;
|
import io.restassured.http.ContentType;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package com.drinkool.services;
|
package com.drinkool.services;
|
||||||
|
|
||||||
import static io.restassured.RestAssured.*;
|
import static io.restassured.RestAssured.*;
|
||||||
import static org.hamcrest.CoreMatchers.*;
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
import com.drinkool.entities.CustomerEntity;
|
import com.drinkool.entities.CustomerEntity;
|
||||||
|
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import io.restassured.http.ContentType;
|
import io.restassured.http.ContentType;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
|
|||||||
@@ -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<String, String> 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
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-15
@@ -1,9 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
|
|
||||||
>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
@@ -20,11 +16,9 @@
|
|||||||
<compiler-plugin.version>3.15.0</compiler-plugin.version>
|
<compiler-plugin.version>3.15.0</compiler-plugin.version>
|
||||||
<maven.compiler.release>25</maven.compiler.release>
|
<maven.compiler.release>25</maven.compiler.release>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
|
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
|
||||||
<quarkus.platform.group-id
|
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
|
||||||
>io.quarkus.platform</quarkus.platform.group-id>
|
|
||||||
<quarkus.platform.version>3.32.4</quarkus.platform.version>
|
<quarkus.platform.version>3.32.4</quarkus.platform.version>
|
||||||
<skipITs>true</skipITs>
|
<skipITs>true</skipITs>
|
||||||
<surefire-plugin.version>3.5.4</surefire-plugin.version>
|
<surefire-plugin.version>3.5.4</surefire-plugin.version>
|
||||||
@@ -48,6 +42,20 @@
|
|||||||
<artifactId>lib</artifactId>
|
<artifactId>lib</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-messaging-kafka</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.smallrye.reactive</groupId>
|
||||||
|
<artifactId>smallrye-reactive-messaging-in-memory</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bitbucket.b_c</groupId>
|
||||||
|
<artifactId>jose4j</artifactId>
|
||||||
|
<version>0.9.3</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.quarkus</groupId>
|
<groupId>io.quarkus</groupId>
|
||||||
<artifactId>quarkus-jdbc-h2</artifactId>
|
<artifactId>quarkus-jdbc-h2</artifactId>
|
||||||
@@ -114,8 +122,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<argLine>@{argLine}</argLine>
|
<argLine>@{argLine}</argLine>
|
||||||
<systemPropertyVariables>
|
<systemPropertyVariables>
|
||||||
<java.util.logging.manager
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
|
||||||
<maven.home>${maven.home}</maven.home>
|
<maven.home>${maven.home}</maven.home>
|
||||||
</systemPropertyVariables>
|
</systemPropertyVariables>
|
||||||
<forkCount>1</forkCount>
|
<forkCount>1</forkCount>
|
||||||
@@ -137,10 +144,8 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<argLine>@{argLine}</argLine>
|
<argLine>@{argLine}</argLine>
|
||||||
<systemPropertyVariables>
|
<systemPropertyVariables>
|
||||||
<native.image.path>
|
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
|
||||||
${project.build.directory}/${project.build.finalName}-runner</native.image.path>
|
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
||||||
<java.util.logging.manager
|
|
||||||
>org.jboss.logmanager.LogManager</java.util.logging.manager>
|
|
||||||
<maven.home>${maven.home}</maven.home>
|
<maven.home>${maven.home}</maven.home>
|
||||||
</systemPropertyVariables>
|
</systemPropertyVariables>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
|
import com.drinkool.lib.entities.BaseEntity;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
|
import com.drinkool.lib.entities.BaseEntity;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
|
import com.drinkool.lib.entities.BaseEntity;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
|
import com.drinkool.lib.entities.BaseEntity;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
import com.drinkool.models.ReviewModel;
|
import com.drinkool.lib.models.ReviewModel;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
quarkus.datasource.db-kind=postgresql
|
quarkus.datasource.db-kind=postgresql
|
||||||
quarkus.datasource.username=postgres
|
quarkus.datasource.username=postgres
|
||||||
quarkus.datasource.password=password
|
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)
|
## Tự động tạo bảng từ Entity (chỉ dùng cho môi trường dev)
|
||||||
quarkus.hibernate-orm.database.generation=update
|
quarkus.hibernate-orm.database.generation=update
|
||||||
@@ -25,3 +25,12 @@ quarkus.index-dependency.lib.artifact-id=lib
|
|||||||
quarkus.native.container-build=true
|
quarkus.native.container-build=true
|
||||||
quarkus.native.remote-container-build=true
|
quarkus.native.remote-container-build=true
|
||||||
quarkus.native.additional-build-args=--future-defaults=all
|
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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.entities;
|
||||||
|
|
||||||
import com.drinkool.models.ReviewModel;
|
import com.drinkool.lib.models.ReviewModel;
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.*;
|
|||||||
|
|
||||||
import com.drinkool.dtos.SendReview;
|
import com.drinkool.dtos.SendReview;
|
||||||
import com.drinkool.entities.ReviewEntity;
|
import com.drinkool.entities.ReviewEntity;
|
||||||
import com.drinkool.models.ReviewModel;
|
import com.drinkool.lib.models.ReviewModel;
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import io.restassured.http.ContentType;
|
import io.restassured.http.ContentType;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|||||||
@@ -8,3 +8,6 @@ quarkus.http.host=0.0.0.0
|
|||||||
|
|
||||||
## Orm
|
## Orm
|
||||||
%test.quarkus.hibernate-orm.database.generation=drop-and-create
|
%test.quarkus.hibernate-orm.database.generation=drop-and-create
|
||||||
|
|
||||||
|
# Kafka
|
||||||
|
mp.messaging.incoming.manager-in.connector=smallrye-in-memory
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
# You can find more information about the UBI base runtime images and their configuration here:
|
# You can find more information about the UBI base runtime images and their configuration here:
|
||||||
# https://rh-openjdk.github.io/redhat-openjdk-containers/
|
# 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'
|
ENV LANGUAGE='en_US:en'
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package com.drinkool.controller;
|
package com.drinkool.controller;
|
||||||
|
|
||||||
import com.drinkool.InternalValue;
|
|
||||||
import com.drinkool.Url;
|
|
||||||
import jakarta.ws.rs.POST;
|
import jakarta.ws.rs.POST;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
import jakarta.ws.rs.core.NewCookie;
|
import jakarta.ws.rs.core.NewCookie;
|
||||||
import org.jboss.resteasy.reactive.RestResponse;
|
import org.jboss.resteasy.reactive.RestResponse;
|
||||||
|
|
||||||
|
import com.drinkool.InternalValue;
|
||||||
|
import com.drinkool.Url;
|
||||||
|
|
||||||
public abstract class BaseController {
|
public abstract class BaseController {
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
|
|||||||
@@ -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<Response> proxySignup(ManagerSignup input) {
|
||||||
|
return managerService.signup(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path(Url.Login)
|
||||||
|
public Uni<Response> proxyLogin(Login input) {
|
||||||
|
return managerService.login(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
public Uni<Response> me(@HeaderParam(InternalValue.userId) UUID id) {
|
||||||
|
return managerService.me(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.drinkool.filters;
|
package com.drinkool.filters;
|
||||||
|
|
||||||
import com.drinkool.InternalValue;
|
|
||||||
import io.smallrye.mutiny.Uni;
|
import io.smallrye.mutiny.Uni;
|
||||||
import jakarta.ws.rs.Priorities;
|
import jakarta.ws.rs.Priorities;
|
||||||
import jakarta.ws.rs.container.*;
|
import jakarta.ws.rs.container.*;
|
||||||
@@ -16,6 +15,8 @@ import org.jose4j.jwt.consumer.JwtConsumer;
|
|||||||
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
|
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
|
||||||
import org.jose4j.keys.HmacKey;
|
import org.jose4j.keys.HmacKey;
|
||||||
|
|
||||||
|
import com.drinkool.InternalValue;
|
||||||
|
|
||||||
public class InternalHeaderGatewayFilter {
|
public class InternalHeaderGatewayFilter {
|
||||||
|
|
||||||
@ConfigProperty(name = "gateway.jwt.secret")
|
@ConfigProperty(name = "gateway.jwt.secret")
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.drinkool.services;
|
|||||||
|
|
||||||
import com.drinkool.Url;
|
import com.drinkool.Url;
|
||||||
import com.drinkool.dtos.SmsOtp;
|
import com.drinkool.dtos.SmsOtp;
|
||||||
|
|
||||||
import io.smallrye.mutiny.Uni;
|
import io.smallrye.mutiny.Uni;
|
||||||
import jakarta.ws.rs.POST;
|
import jakarta.ws.rs.POST;
|
||||||
import jakarta.ws.rs.Path;
|
import jakarta.ws.rs.Path;
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.drinkool.services;
|
package com.drinkool.services;
|
||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.InternalValue;
|
||||||
|
import com.drinkool.Role;
|
||||||
|
import com.drinkool.Url;
|
||||||
import com.drinkool.dtos.*;
|
import com.drinkool.dtos.*;
|
||||||
|
|
||||||
import io.smallrye.mutiny.Uni;
|
import io.smallrye.mutiny.Uni;
|
||||||
import jakarta.ws.rs.*;
|
import jakarta.ws.rs.*;
|
||||||
import jakarta.ws.rs.core.Response;
|
import jakarta.ws.rs.core.Response;
|
||||||
|
|||||||
@@ -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<Response> signup(ManagerSignup input);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path(Url.Login)
|
||||||
|
Uni<Response> login(Login input);
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path(Url.Me)
|
||||||
|
Uni<Response> me(@HeaderParam(InternalValue.userId) UUID id);
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import static io.restassured.RestAssured.*;
|
|||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
|
|
||||||
import com.drinkool.*;
|
import com.drinkool.*;
|
||||||
|
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -4,7 +4,6 @@ import static io.restassured.RestAssured.*;
|
|||||||
import static org.hamcrest.CoreMatchers.*;
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
import com.drinkool.InternalValue;
|
|
||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import io.restassured.response.Response;
|
import io.restassured.response.Response;
|
||||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
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.DisplayName;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import com.drinkool.InternalValue;
|
||||||
|
|
||||||
@QuarkusTest
|
@QuarkusTest
|
||||||
public class InternalHeaderGatewayFilterTest {
|
public class InternalHeaderGatewayFilterTest {
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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"
|
||||||
@@ -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
|
||||||
+10
@@ -26,6 +26,16 @@
|
|||||||
<artifactId>jackson-annotations</artifactId>
|
<artifactId>jackson-annotations</artifactId>
|
||||||
<version>2.15.2</version>
|
<version>2.15.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus</groupId>
|
||||||
|
<artifactId>quarkus-kafka-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>jakarta.persistence</groupId>
|
<groupId>jakarta.persistence</groupId>
|
||||||
<artifactId>jakarta.persistence-api</artifactId>
|
<artifactId>jakarta.persistence-api</artifactId>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.drinkool.dtos;
|
package com.drinkool.dtos;
|
||||||
|
|
||||||
import com.drinkool.models.ReviewModel;
|
import com.drinkool.lib.models.ReviewModel;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class SendReview {
|
public class SendReview {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.drinkool.entities;
|
package com.drinkool.lib.entities;
|
||||||
|
|
||||||
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
|
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
+2
-2
@@ -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 jakarta.persistence.*;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
mvn clean package -DskipTests -Pnative \
|
mvn clean package -DskipTests \
|
||||||
-Dquarkus.container-image.push=false \
|
-Dquarkus.container-image.push=false \
|
||||||
-Dquarkus.container-image.registry=git.demonkernel.io.vn
|
-Dquarkus.container-image.registry=git.demonkernel.io.vn
|
||||||
|
|||||||
+1
-1
@@ -6,6 +6,6 @@ SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
|||||||
cd "$SCRIPT_DIR/.."
|
cd "$SCRIPT_DIR/.."
|
||||||
|
|
||||||
kubectl delete all --all -n drinkool-backend
|
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"
|
cd "$CURRENT_DIR"
|
||||||
Reference in New Issue
Block a user