Как читать и фильтровать сущности-агрегаты по условию в Axon и после этого изменять их - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в Axon, и, возможно, я что-то пропустил, но мне нужна помощь, чтобы понять.

У меня есть простой агрегат тележки с едой.

Вот пример:

@Aggregate
class FoodCard {

    @AggregateIdentifier
    private lateinit var foodCardId: UUID
    private lateinit var selectedProduct: MutableMap<UUID, Int>

    constructor()

    @CommandHandler
    constructor(command: CreateFoodCartCommand) {
        AggregateLifecycle.apply(FoodCartCreateEvent(
            UUID.randomUUID()
        ))
    }

    @CommandHandler
    fun handle(command: SelectProductCommand) {
        AggregateLifecycle
            .apply(ProductSelectedEvent(foodCardId, command.productId, command.quantity))
    }

    @CommandHandler
    fun handle(command: DeleteFoodCartCommand) {
        AggregateLifecycle
            .apply(FoodCartDeleteEvent(foodCardId))
    }

    @CommandHandler
    fun handle(command: DeselectProductCommand) {

        val productId = command.productId
        if (!selectedProduct.containsKey(productId)) {
            throw ProductDeselectionException("ProductDeselectionException")
        }
        AggregateLifecycle
            .apply(ProductDeselectEvent(foodCardId, productId, command.quantity))
    }

    @EventSourcingHandler
    fun on(event: FoodCartCreateEvent) {
        foodCardId = event.foodCardId
        selectedProduct = mutableMapOf()
    }

    @EventSourcingHandler
    fun on(event: ProductSelectedEvent) {
        selectedProduct.merge(
                event.productId,
                event.quantity
        ) {a, b -> a + b}
    }
}

В качестве ES я использую Axon Server. Для проектора FoodCard я использую репозиторий JPA, который подключается к DB.

Я хочу получить все карты foodcards, которые содержат специальный продукт (конкретный UUID), и изменить количество на -1 для всех из них.

Я так понял есть два типа действий -> чтение и запись

Так вот вопрос, как правильно реализовать этот поток с Axon?

Спасибо

1 Ответ

2 голосов
/ 04 августа 2020

из вашего объяснения и кода Я считаю, что вам, вероятно, потребуется завершить реализацию DeselectProductCommand, введя EventSourcingHandler для ProductDeselectEvent. Если я правильно понял, ваша «количественная» информация сохраняется на карте selectProduct . В этом случае, основываясь на вашем коде, я вижу, что информация о количестве, которое должно быть вычтено из вашего продукта, находится в команде.

Вам также понадобится запрос, например FindAllFoodCardByProductId, который будет получить совокупный идентификатор foodCardId , содержащий определенный productId : эта операция будет выполнена в вашей проекции через репозиторий jpa. В качестве справки вы можете посмотреть справочное руководство здесь https://docs.axoniq.io/reference-guide/implementing-domain-logic/query-handling о том, как использовать QueryGateway в вашем контроллере и реализовать QueryHandler в вашей проекции. Коррадо.

...