Appearance
Firestore
[Required]Firestore固有のSDK、document schema、transaction semanticsはこのreferenceに閉じる。作業対象に該当するarchitecture、application、persistence、runtime規約を併用し、このreferenceではFirestore固有の差分だけを扱う。Firestore taskという理由だけで共通referenceを全件読む必要はない。
Boundary and Mapping
[Required]FirestoreDb、Transaction、DocumentReference、DocumentSnapshot、QuerySnapshotをFeatures側へ漏らさない。[Required][FirestoreData]や[FirestoreProperty]を持つ型はInfrastructureの永続化DTOとして扱い、domain modelと兼用しない。[Required]document path、collection名、field名、snapshot変換はInfrastructureに閉じる。[Required]Value ObjectはFirestoreへ保存する境界でprimitiveへ展開し、既存document schemaを保つ。[Contextual]Firestore実装をarea別に分割する場合はInfrastructure/Persistence/{Area}/に置き、namespaceをdirectoryに合わせる。
Transaction
[Required]Firestore transaction callbackは競合時に再実行される前提にする。[Required]callback内でメール、通知、決済、外部APIなどの外部副作用を実行しない。[Contextual]確実な外部副作用が必要ならtransaction内でOutbox documentを保存し、冪等な別処理で配送する。[Contextual]Outboxのschema、claim / retry、配送保証、idempotency keyは要件または設計資料で決め、callback内ではbusiness dataとOutboxをatomicに保存する。
Date and Time
[Required]Firestoreから読み出した時刻はruntimeのUTC契約に従って扱い、保存前に無条件で.ToUniversalTime()を呼ばない。