chore: update

This commit is contained in:
TakahashiNg
2026-04-28 06:53:41 +00:00
parent 7d93561572
commit 8af9392883
4 changed files with 72 additions and 30 deletions
@@ -6,6 +6,7 @@ import static io.smallrye.graphql.client.core.Field.field;
import static io.smallrye.graphql.client.core.Operation.operation; import static io.smallrye.graphql.client.core.Operation.operation;
import com.drinkool.dtos.CartItemRequest; import com.drinkool.dtos.CartItemRequest;
import com.drinkool.dtos.event.MenuItemValidation;
import io.quarkus.redis.datasource.ReactiveRedisDataSource; import io.quarkus.redis.datasource.ReactiveRedisDataSource;
import io.quarkus.redis.datasource.hash.ReactiveHashCommands; import io.quarkus.redis.datasource.hash.ReactiveHashCommands;
import io.quarkus.redis.datasource.keys.ReactiveKeyCommands; import io.quarkus.redis.datasource.keys.ReactiveKeyCommands;
@@ -21,6 +22,7 @@ import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.eclipse.microprofile.reactive.messaging.Incoming;
@Path("/") @Path("/")
public class CartController { public class CartController {
@@ -41,7 +43,7 @@ public class CartController {
this.redisDataSource = ds; this.redisDataSource = ds;
this.valueCommands = ds.value(String.class); this.valueCommands = ds.value(String.class);
this.hashCommands = ds.hash(String.class); this.hashCommands = ds.hash(String.class);
this.keyCommands = ds.key(); this.keyCommands = ds.key();
} }
@POST @POST
@@ -58,16 +60,16 @@ public class CartController {
return valueCommands return valueCommands
.get(eateryCacheKey) .get(eateryCacheKey)
.chain((String existsInCache) -> { .<Boolean>chain(existsInCache -> {
if (existsInCache != null && existsInCache.equals("true")) { if (
return Uni.createFrom().item(Boolean.TRUE); existsInCache != null && Boolean.TRUE.equals(existsInCache)
} ) return Uni.createFrom().item(Boolean.TRUE);
var query = document( var query = document(
operation( operation(
field( field(
"eateryById", "eateryById",
List.of(arg("id", eateryId.toString())), // Bọc arg vào List.of() List.of(arg("id", eateryId.toString())),
field("id") field("id")
) )
) )
@@ -75,28 +77,21 @@ public class CartController {
return dynamicClient return dynamicClient
.executeAsync(query) .executeAsync(query)
.map(response -> { .map(response -> !response.hasError() && response.getData() != null);
if (response.hasError()) {
return false;
}
var data = response.getData();
return data != null && !data.isNull("eateryById");
});
}) })
.map((Boolean isValid) -> { .chain(isValid -> {
if (isValid) { if (Boolean.TRUE.equals(isValid)) {
String cartId = UUID.randomUUID().toString(); String cartId = UUID.randomUUID().toString();
valueCommands return valueCommands
.setex("cart:" + cartId, 86400, eateryId.toString()) .setex("cart:" + cartId, 86400, eateryId.toString())
.subscribe() .replaceWith(Response.ok(cartId).build());
.with(item -> {});
return Response.ok(cartId).build();
} else {
return Response.status(Response.Status.NOT_FOUND)
.entity("EateryNotFound")
.build();
} }
return Uni.createFrom().item(
Response.status(Response.Status.NOT_FOUND)
.entity("InvalidEateryId")
.build()
);
}); });
} }
@@ -121,25 +116,27 @@ public class CartController {
); );
} }
UUID eateryId = UUID.fromString(cart);
return valueCommands return valueCommands
.get(menuKey) .get(menuKey)
.chain(menuData -> { .chain(menuData ->
return hashCommands hashCommands
.hincrby( .hincrby(
cartItemsKey, cartItemsKey,
request.menuItemId.toString(), request.menuItemId.toString(),
request.quantity request.quantity
) )
.call(_ -> keyCommands.expire(cartItemsKey, 86400)) .call(_ -> keyCommands.expire(cartItemsKey, 86400L))
.map(b -> menuData); .replaceWith(menuData)
}) )
.map(menuData -> { .map(menuData -> {
if (menuData != null) { if (menuData != null) {
return Response.ok("ItemAdded").build(); return Response.ok("ItemAdded").build();
} }
validationEmitter.send( validationEmitter.send(
new MenuItemValidationEvent(request.menuItemId, cartId) new MenuItemValidation(request.menuItemId, eateryId)
); );
return Response.status(Response.Status.ACCEPTED) return Response.status(Response.Status.ACCEPTED)
@@ -148,4 +145,22 @@ public class CartController {
}); });
}); });
} }
@Incoming("menu-validation-results") // Tên channel trong application.properties
public Uni<Void> processValidationResult(MenuItemStatusEvent event) {
// Giả sử event trả về có: menuItemId, eateryId, exists (boolean)
if (!event.exists) {
// Nếu món ăn không tồn tại, ta xóa nó khỏi Redis
// Lưu ý: Vì ta không biết món này nằm ở cartId nào (do bạn yêu cầu bỏ cartId)
// Bạn sẽ cần một chiến lược tìm kiếm hoặc quản lý key hiệu quả.
// Cách 1: Nếu bạn có danh sách Cart của Eatery đó, duyệt qua và xóa:
// String cartItemsKey = "cart:" + event.cartId + ":items";
// return hashCommands.hdel(cartItemsKey, event.menuItemId.toString()).replaceWithVoid();
// Cách 2: Nếu xóa cache thông tin món ăn để các request sau cũng fail:
// return keyCommands.del("menu:item:" + event.menuItemId).replaceWithVoid();
}
return Uni.createFrom().voidItem();
}
} }
+1
View File
@@ -9,4 +9,5 @@ public class Url {
public static final String SmsOtp = "/sms_otp"; public static final String SmsOtp = "/sms_otp";
public static final String Me = "/me"; public static final String Me = "/me";
public static final String Logout = "/logout"; public static final String Logout = "/logout";
public static final String Cart = "/cart";
} }
@@ -0,0 +1,9 @@
package com.drinkool.dtos;
import java.util.UUID;
public class CartItemRequest {
public UUID menuItemId;
public int quantity;
}
@@ -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 MenuItemValidation {
public UUID menuItemId;
public UUID eateryId;
}