MBC CQRS サーバーレス フレームワーク TO-DO システム作成 7 – シーケンス(採番)の実装
Technology
Oct 30, 2024
MBC CQRS サーバーレス フレームワークで番号を採番する方法を学びます。
MBC CQRS サーバーレスフレームワークには mbc-cqrs-serverless/sequence (シーケンス) パッケージが準備されておりますので今回はTO-DOシステムにこちらのパッケージを追加します。
シーケンスパッケージのインストール
次のコマンドを実行しシーケンスパッケージをインストールします。
npm i @mbc-cqrs-serverless/sequence
シーケンスモジュールの注入
src/todo/todo.module.ts
に SequenceModule
をインポートします。
@Module({
imports: [
CommandModule.register({
tableName: 'todo',
dataSyncHandlers: [TodoDataSyncRdsHandler],
}),
SequencesModule,
],
controllers: [TodoController],
providers: [TodoService],
exports: [TodoService],
})
シーケンスサービスを実装
src/todo/todo.service.ts
のコンストラクターに シーケンスサービスを追加します。
constructor(
private readonly commandService: CommandService,
private readonly dataService: DataService,
private readonly prismaService: PrismaService,
private readonly seqService: SequencesService,
) {}
次のように入力し、シーケンスサービスを使用して番号を採番します。
const seq = await this.seqService.generateSequenceItem(
{
tenantCode: tenantCode,
typeCode: 'todo',
},
opts,
)
sk
をユニークなIDではなく、採番した番号をセットするように sk
の初期化コードを次のように入力します。
const sk = `${seq.formattedNo}`
採番のテスト
以前作成したタスクデータの生成処理を実行してみると次のような結果を得ることが出来ます。
{
"pk": "TODO#MBC",
"sk": "1@1",
"id": "TODO#MBC#1",
"tenantCode": "MBC",
"code": "1",
"type": "TODO",
"version": 1,
"name": "Test Task 1",
"attributes": {
"description": "desc",
"status": "PENDING"
},
"requestId": "a00541dd-8b63-4c15-9261-db1fea6a6b05",
"createdAt": "2024-10-30T07:10:25.358Z",
"updatedAt": "2024-10-30T07:10:25.358Z",
"createdBy": "92ca4f68-9ac6-4080-9ae2-2f02a86206a4",
"updatedBy": "92ca4f68-9ac6-4080-9ae2-2f02a86206a4",
"createdIp": "127.0.0.1",
"updatedIp": "127.0.0.1"
}
sk
とcode
に採番した番号がセットされます。
ローカルDynamoDBのシーケンステーブルを参照すると次のようなデータがセットされています。
このようにMBC CQRS サーバーレス フレームワークでは簡単に番号を採番することが可能です。
シーケンスのパラメータ
シーケンスでは次のパラメータを使用出来ます。
- tenantCode (必須: テナントコード): マルチテナントで使用する事を想定しているため テナントコードをセットする必要があります。
- typeCode (必須: シーケンス種別コード): 採番したい種別コードをしていします。例えばTO-DOであれば
todo
や顧客コードであればcustomer
のように任意の文字列を指定することが出来ます。 - rateteBy (ローテーションルール): 番号をリセットするルールを
RateteByEnum
の値で指定します。- FISCAL_YEARLY: 年度毎にローテーションします。
- YEARLY: 西暦の年が変わったらローテーションします。
- MONTHLY: 次が変わったらローテーションします。
- DAILY: 日にちが変わったらローテーションします。
- NONE: ローテーションしません。
- date (ローテーション基準日): ローテーションを判定するための日付を任意で指定したい場合に使用します。例えば5月に4月の見積もり番号を採番したいといった要望がある時を想定します。