Как убедиться, что агрегат существует перед публикацией события?

Я просматривал API Wolkenkit ... и не совсем понятно, как узнать, какие команды требуют совокупного идентификатора, а какие нет.

Из того, что я могу сказать, клиентский API предлагает что-то вроде этого

app.accounting.invoice().issue({
  amount: 1000
});

что хорошо для создания нового invoice, но не должно быть возможности запустить следующее, которое намеревается обновить что-то существующее

app.accounting.invoice().update({
  amount: 10
});

Я предполагаю, что эта проверка должна войти в функцию команды, но как мне ее написать?

const commands = {
  update (invoice, command, mark) {
    const canInvoiceBeUpdated = // ...

    if (!canInvoiceBeUpdated) {
      return mark.asRejected('...');
    }

    // ... update invoice

    mark.asDone();
  }
};

Что входит в canInvoiceBeUpdated чек?


person marcusstenbeck    schedule 08.06.2018    source источник


Ответы (1)


Ответ 08 июня 2018 г. от @goloroden в wolkenkit slack

Я попытаюсь объяснить вам: если вам нужен новый агрегат, вы опускаете идентификатор. Итак, например, чтобы придерживаться примера с чатом, когда вы хотите отправить новое сообщение, вы делаете:

app.communication.message().send({ /* ... */ });

Если вместо этого вы хотите отредактировать существующее сообщение, например. чтобы это понравилось, вы должны указать идентификатор сообщения:

const messageId = '...';

app.communication.message(messageId).like({ /* ... */ });

Внутри каждой команды вы, вероятно, захотите проверить, работает ли она только с новым агрегатом (который мы называем командой-конструктором) или только с существующим агрегатом. Самый простой способ проверить это — использовать функцию агрегата exists, которая возвращает true для новых агрегатов и false в противном случае. Итак, внутри команды вы можете сделать что-то вроде этого:

const commands = {
  send (message, command, mark) {
    if (!message.exists()) {
      return mark.asRejected('Aggregate does not exist yet.');
    }

    // ...

    mark.asDone();
  }
};

Если вы не хотите делать это вручную каждый раз, вы также можете использовать для этого промежуточное программное обеспечение, например https://github.com/thenativeweb/wolkenkit-command-tools… тогда предыдущий пример сводится к следующему:

const { only } = require('wolkenkit-command-tools');

// ...

const commands = {
  send: [
    only.ifExists(),
    (message, command, mark) {
      // ...

      mark.asDone();
    }
  ]
};

Обратите внимание, что текущая версия этого промежуточного модуля — 3.0, но пока не будет выпущен wolkenkit 2.0, вам придется использовать версию 2.0 из wolkenkit-command-tools.

person marcusstenbeck    schedule 08.06.2018
comment
PS: функция exists теперь также является частью документация wolkenkit. - person Golo Roden; 09.06.2018