chore: update
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user