#73 TaskEitherに修正、ワークフロー関数実装 ─ 個人開発者向けのサービスの開発記録

tyshgc
·

本日の作業

  • ✅ 日報・分報のcommand/event/policyのまとめ書く

    • ✅ Either型をTaskEitherにする

    • ✅ ワークフロー関数の実装

  • 🚴 日報プレゼンテーション層(Remix loader/action)との結合

  • 日報画面実装

  • サインインの実装

    • 認証画面実装

    • 認証ロジック実装(主にClient側)

    • Server側の認証チェック実装

    • Client側の認証チェック実装

  • 🛑 🚴 イベントストーミングとサービスブループリンの融合についてzennにまとめる

  • 🛑 🚴 Feature-Sliced Designについてzennにまとめる

TaskEitherに修正

非同期処理でEither型を使う場合はTaskEitherにする必要があるのでその部分の書き換え。

  • Either型でPromiseを返すのではなくTaskEither型を返すように変更

  • left, right関数はfp-ts/TaskEitherからimportする様に変更

  • asyncで処理ではなくfp-ts/TaskEitherのtryCatch関数を使う

こんな感じにするとTaskEither型を返せる様になりかつ非同期処理を扱える。

ドメインイベントの実装

「日報を作成した」というドメインイベントはコマンドによって処理された集約とイベントタイプのオブジェクトを成功時に返すのみの役割です。chain関数でラップしているのでそもそも失敗した場合は処理されません。つまりこれが処理された=ドメインイベントが成立したといった役割のためにあります。正直コマンド関数で成立しているので要るのか?と思いましたが一応実装しています。

また、「日報をSlackへの通知をした」というドメインイベントも必要だったのでそちらも粗実装しました。

まずはコマンド関数。日報の作成ドメインイベントを受け付けるためバリデーションは必要ないですが、gatewayにSlackへのポストをする関数を型定義しています。メッセージの部分は一旦適当に作ってます

そしてドメインイベント。

関数合成 pipe, chain, fold関数

ワークフロー関数はこれまでの「入力→バリデーション→コマンド(ビジネスロジック・永続層とのやり取り)→ドメインイベント」という流れをpipe関数で流れの通り並べています。さらにドメインイベント後にポリシー(別のドメインイベントへ繋ぐためのロジック)が存在する場合はそれらの入力・コマンド・ドメインイベントなども

chain関数はEither(TaskEither)の失敗(エラー)があると以降の関数の実行を中断するためのユーティリティ関数です。例えば失敗を明示的に処理したい場合はfold関数を使うとのことです。

ワークフローの実装

というわけで、入力からドメインイベント、ポリシーなどの流れをpipe, chain関数で実装しました。

あとはこのワークフロー関数をRemixのActionで呼び出す様にすれば一通り実装できるはず(まだそこまでやってないので不明)。

その他、メモ

DMMFのファイル構成を見直したい

現在、DMMFのファイルは次の様に各責務ごとにまとめていますが、多分この先この分け方だとあちこち見に行かないといけなくなりそうなので見直しを検討中。とりあえず2、3個ワークフローやドメインイベントを実装してみて検討します。

分けるとしたら createdDaily というドメインイベント単位またはワークフロー単位でディレクトリをまとめる感じがいいかなと思いつつ決めかねています。

← #72 #74 →

@tyshgc
デザインファーム及びスタートアップ(上場)などを経てフリーランスとして、様々なスタートアップや大手企業の新規事業の立ち上げ期における事業設計・アプリケーションの設計・開発、サービスのUX分析とデザインとエンジニアリングの両軸でお手伝いさせていただいています。 現在、個人開発者向けの支援サービスを個人開発中。 X Account: @tyshgc