本日の作業
✅ 日報・分報の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 というドメインイベント単位またはワークフロー単位でディレクトリをまとめる感じがいいかなと思いつつ決めかねています。