Как убедиться, что агрегат существует до публикации события? - PullRequest
0 голосов
/ 08 июня 2018

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

Из того, что я могу сказать, клиентский 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 проверку?

1 Ответ

0 голосов
/ 08 июня 2018

Ответ 2018-06-08 @ 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.

...