Compare commits

...

1 Commits

Author SHA1 Message Date
TakahashiNguyen a20720541b fix: add eatery query (#35)
Release package / release (push) Failing after 14m6s
Co-authored-by: TakahashiNg <83152264+TakahashiNguyen@users.noreply.github.com>
Reviewed-on: #35
2026-04-22 08:32:41 +00:00
10 changed files with 170 additions and 17 deletions
+16 -3
View File
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -42,6 +44,16 @@
<artifactId>lib</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-graphql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-messaging-kafka</artifactId>
@@ -144,7 +156,8 @@
<configuration>
<argLine>@{argLine}</argLine>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<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>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
@@ -168,4 +181,4 @@
</properties>
</profile>
</profiles>
</project>
</project>
@@ -3,6 +3,8 @@ package com.drinkool.entities;
import com.drinkool.lib.entities.BaseEntity;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Entity
@@ -18,10 +20,17 @@ public class EateryEntity extends BaseEntity {
@Column(nullable = false)
public boolean isVerified = false;
@OneToMany(
mappedBy = "eatery",
cascade = CascadeType.ALL,
orphanRemoval = true
)
public List<MenuItemEntity> menus = new ArrayList<>();
public EateryEntity() {}
@Transactional
public void create(UUID ownerId, String name) {
public EateryEntity create(UUID ownerId, String name) {
EateryEntity existedEatery = EateryEntity.find(
"ownerId",
ownerId
@@ -33,5 +42,7 @@ public class EateryEntity extends BaseEntity {
this.name = name;
this.persist();
return this;
}
}
@@ -9,9 +9,16 @@ import java.util.*;
@Table
public class MenuItemEntity extends BaseEntity {
@Column(nullable = false)
public String name;
@Column(nullable = false)
public double price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "eatery_id")
public EateryEntity eatery;
// Danh sách các nguyên liệu cấu thành món ăn này
@OneToMany(
mappedBy = "menuItem",
@@ -2,12 +2,17 @@ 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 java.util.List;
import java.util.UUID;
import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Name;
import org.eclipse.microprofile.graphql.Query;
import org.eclipse.microprofile.reactive.messaging.Incoming;
@ApplicationScoped
@GraphQLApi
public class EateryService {
@Incoming("manager-in")
@@ -17,4 +22,14 @@ public class EateryService {
eatery.create(input.id, input.eateryName);
}
@Query("allEateries")
public List<EateryEntity> getAll() {
return EateryEntity.listAll();
}
@Query("eateryById")
public EateryEntity getEatery(@Name("id") UUID id) {
return EateryEntity.findById(id);
}
}
@@ -1,19 +1,30 @@
package com.drinkool.services;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.Matchers.hasItems;
import com.drinkool.dtos.event.ManagerCreate;
import com.drinkool.entities.EateryEntity;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import io.smallrye.reactive.messaging.memory.InMemoryConnector;
import jakarta.enterprise.context.control.ActivateRequestContext;
import jakarta.enterprise.inject.Any;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import java.util.UUID;
import net.datafaker.Faker;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@QuarkusTest
public class EateryServiceTest {
private final Faker faker = new Faker();
@Inject
@Any
InMemoryConnector connector;
@@ -40,4 +51,59 @@ public class EateryServiceTest {
Assertions.assertNotNull(eatery, "Eatery should be created in DB");
Assertions.assertEquals("Quan Bun Cha Test", eatery.name);
}
private UUID lastSavedId;
private String lastSavedName;
@BeforeEach
@Transactional
void setup() {
EateryEntity.deleteAll();
lastSavedName = faker.restaurant().name();
EateryEntity eatery = new EateryEntity();
lastSavedId = eatery.create(UUID.randomUUID(), lastSavedName).id;
for (int i = 0; i < 2; i++) {
EateryEntity e = new EateryEntity();
e.create(UUID.randomUUID(), faker.restaurant().name());
}
}
@Test
void testGetAllEateries() {
// Cấu trúc query GraphQL
String query = "{ \"query\": \"{ allEateries { ownerId name } }\" }";
given()
.contentType(ContentType.JSON)
.body(query)
.when()
.post("/graphql")
.then()
.statusCode(200)
// GraphQL trả về dữ liệu bọc trong object "data"
.body("data.allEateries", notNullValue())
.body("data.allEateries.name", hasItems(lastSavedName));
}
@Test
void testGetEateryById() {
// Sử dụng biến id đã lưu ở setup
// Lưu ý: Trong GraphQL, String/UUID phải nằm trong dấu ngoặc kép
String query = String.format(
"{ \"query\": \"{ eateryById(id: \\\"%s\\\") { ownerId name } }\" }",
lastSavedId
);
given()
.contentType(ContentType.JSON)
.body(query)
.when()
.post("/graphql")
.then()
.statusCode(200)
.body("data.eateryById.name", is(lastSavedName));
}
}
+4
View File
@@ -48,6 +48,10 @@
<artifactId>jose4j</artifactId>
<version>0.9.6</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-graphql-client</artifactId>
</dependency>
<dependency>
<groupId>com.drinkool</groupId>
<artifactId>lib</artifactId>
@@ -0,0 +1,34 @@
package com.drinkool.controller;
import io.smallrye.graphql.client.GraphQLClient;
import io.smallrye.graphql.client.dynamic.api.DynamicGraphQLClient;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import java.util.concurrent.ExecutionException;
@Path("/api/eatery")
public class EateryController {
@GraphQLClient("eatery")
DynamicGraphQLClient dynamicClient;
@POST
@Path("/graphql")
public Response forward(String query)
throws ExecutionException, InterruptedException {
io.smallrye.graphql.client.Response response = dynamicClient.executeSync(
query
);
if (response.hasError()) {
return jakarta.ws.rs.core.Response.status(500)
.entity(response.getErrors())
.build();
}
return jakarta.ws.rs.core.Response.ok(
response.getData().toString()
).build();
}
}
@@ -3,8 +3,9 @@ package com.drinkool.controller;
import static io.restassured.RestAssured.*;
import static org.hamcrest.CoreMatchers.*;
import com.drinkool.*;
import com.drinkool.InternalValue;
import com.drinkool.Role;
import com.drinkool.Url;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
+2
View File
@@ -21,6 +21,8 @@ spec:
env:
- name: QUARKUS_REST_CLIENT_ACCOUNT_URL
value: "http://account-service"
- name: QUARKUS_SMALLRYE_GRAPHQL_CLIENT_EATERY_URL
value: "http://eatery-service/graphql"
- name: GATEWAY_JWT_SECRET
valueFrom:
secretKeyRef:
+10 -10
View File
@@ -13,13 +13,13 @@ spec:
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
- name: kafdrop
image: obsidiandynamics/kafdrop
ports:
- containerPort: 9000
env:
- name: KAFKA_BROKERCONNECT
value: "kafka-service:9092"
---
apiVersion: v1
kind: Service
@@ -30,6 +30,6 @@ spec:
selector:
app: kafdrop
ports:
- protocol: TCP
port: 9000
nodePort: 30900
- protocol: TCP
port: 9000
nodePort: 30900