Loading...

MBC CQRS サーバーレス フレームワーク TO-DO システム作成 3 – RDSヘデータを反映

MBC CQRS サーバーレス フレームワークで書き込み用コマンドをDynamoDBに登録して、StepFunctionを使用して読み込み用DB(DynamoDB)にデータを反映するところまで出来ましたので今回はRDSへデータを反映するところを作成します。

RDS用ハンドラーの追加

src/todo/handler/todo-rds.handler.ts を追加し、以下のように記載します。

import {
  CommandModel,
  IDataSyncHandler,
  removeSortKeyVersion,
} from '@mbc-cqrs-serverless/core'
import { Injectable, Logger } from '@nestjs/common'
import { PrismaService } from 'src/prisma'

import { TodoAttributes } from '../dto/todo-attributes.dto'

@Injectable()
export class TodoDataSyncRdsHandler implements IDataSyncHandler {
  private readonly logger = new Logger(TodoDataSyncRdsHandler.name)

  constructor(private readonly prismaService: PrismaService) {}

  async up(cmd: CommandModel): Promise<any> {
    this.logger.debug(cmd)
    const sk = removeSortKeyVersion(cmd.sk)
    const attrs = cmd.attributes as TodoAttributes
    await this.prismaService.todo.upsert({
      where: {
        id: cmd.id,
      },
      update: {
        csk: cmd.sk,
        name: cmd.name,
        version: cmd.version,
        seq: cmd.seq,
        isDeleted: cmd.isDeleted || false,
        updatedAt: cmd.updatedAt,
        updatedBy: cmd.updatedBy,
        updatedIp: cmd.updatedIp,
        description: attrs?.description,
        status: attrs?.status,
        dueDate: attrs?.dueDate,
      },
      create: {
        id: cmd.id,
        cpk: cmd.pk,
        csk: cmd.sk,
        pk: cmd.pk,
        sk,
        code: sk,
        name: cmd.name,
        version: cmd.version,
        tenantCode: cmd.tenantCode,
        seq: cmd.seq,
        createdAt: cmd.createdAt,
        createdBy: cmd.createdBy,
        createdIp: cmd.createdIp,
        updatedAt: cmd.updatedAt,
        updatedBy: cmd.updatedBy,
        updatedIp: cmd.updatedIp,
        description: attrs?.description,
        status: attrs?.status,
        dueDate: attrs?.dueDate,
      },
    })
  }
  async down(cmd: CommandModel): Promise<any> {
    this.logger.debug(cmd)
  }
}

RDSハンドラーをモジュールに追加

src/todo/todo.module.ts の `CommandModule の dataSyncHandlers に今回追加したハンドラーを追加します。追加後の src/todo/todo.module.ts の内容は以下の通りです。

import { CommandModule } from '@mbc-cqrs-serverless/core'
import { Module } from '@nestjs/common'

import { TodoDataSyncRdsHandler } from './handler/todo-rds.handler'
import { TodoController } from './todo.controller'
import { TodoService } from './todo.service'

@Module({
  imports: [
    CommandModule.register({
      tableName: 'todo',
      dataSyncHandlers: [TodoDataSyncRdsHandler],
    }),
  ],
  controllers: [TodoController],
  providers: [TodoService],
  exports: [TodoService],
})
export class TodoModule {}

データの追加テスト

前回 使用したテストを再度実行します。
そうすると以下のようにコマンドテーブル、データテーブルにデータが反映されていることを確認出来ます。

さらにMySQLのテーブルを参照するとデータが1件追加されていることが確認出来ます。

いかがでしょう?RDBにデータを反映するのは非常に簡単にできることが確認出来ると思います。

Top