sadnessOjisan/discohouse

1人のユーザが複数のinvitationを持ててしまう(など)

Opened this issue · 3 comments

現状の実装では1人のユーザに対してinvitationドキュメントが無限に作成可能なので、予期せぬ不具合を起こす可能性があります。
userとinvitationが1:1の関係になることを保証するために、以下のような実装をするとよいのではないかと思います。
・userのupdate(invitationのdecrement)とinvitationのcreateを同一の書き込みバッチ内で行う
・invitationのドキュメントIDにuser IDを利用する

また、Firestoreのドキュメントのフィールドに他のドキュメントのIDを文字列で保持するのは一般に下策です。
ユースケースを見てもDocumentReference型で保持するのが良いのではないかと思います。

userのupdate(invitationのdecrement)とinvitationのcreateを同一の書き込みバッチ内で行う

サボりました・・・

userとinvitationが1:1の関係になることを保証するために

これは意図的に1:nにしています。名前をサボっていたので申し訳ないのですが、こいつの正体は invitationHistoryです。

ユースケースを見てもDocumentReference型で保持するのが良いのではないかと思います。

サボりました・・・

これは意図的に1:nにしています。名前をサボっていたので申し訳ないのですが、こいつの正体は invitationHistoryです。

ここは僕の説明不足でした。1:nになるのはいいのですが、「1人のユーザが複数のユーザによって招待された、という状態ができてしまう」ことが問題です。

たとえば、僕のアカウントはGODによって1回、別のとあるユーザによって2回の合計3回招待されたという状態になっています。
toはコレクション全体を通じてユニークになるべきと思いますが、Firestoreにはunique制約みたいなものはないのでセキュリティルールによってこれを担保するためには(おそらく)invitationsのドキュメントIDを工夫する必要があるのではないかとおもいます。

別のとあるユーザによって2回の合計3回招待されたという状態になっています。

む、これは意図していない挙動ですね。ちょっと調べてみますmm