Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: DELETE /user/{userID}の実装追加 #75

Open
wants to merge 28 commits into
base: main
Choose a base branch
from
Open

Conversation

task4233
Copy link
Collaborator

@task4233 task4233 commented Mar 26, 2021

このPRの概要

DELETE /user/{userID}の実装追加

なぜこのPRが必要なのか

まだ実装されていなかったため

ref: #34

@task4233 task4233 requested a review from hiroyaonoe March 26, 2021 15:23
@task4233 task4233 added the feat 新規機能を開発したり、新しいツールを導入したりするとき label Mar 26, 2021
controller/user.go Outdated Show resolved Hide resolved
infra/user.go Show resolved Hide resolved
infra/user.go Outdated Show resolved Hide resolved
controller/user.go Outdated Show resolved Hide resolved
infra/user.go Outdated Show resolved Hide resolved
infra/user_test.go Show resolved Hide resolved
@task4233 task4233 requested a review from hiroyaonoe March 26, 2021 16:30
@hiroyaonoe
Copy link
Collaborator

今気づいたんですが,ユーザーを削除する際にfirebaseからも削除する必要があると思います.

@task4233
Copy link
Collaborator Author

そうだったのですが、面倒そうだったので目を背けていました。
仮にfirebaseからも削除する場合、firebaseとDBの両方から完全に消す必要があり、

  1. firebase->DBの順で削除
  2. DB->firebaseの順で削除
    という2つの戦略が取れると思います。

この2つの中では、後者の方が良いと思っています。

前者は、DBの削除に失敗した場合やコネクションが失敗した場合にfirebaseから削除したデータを再登録する必要があります。それに対し、後者はfirebaseの処理に失敗したときにDBに張っておいたトランザクションをロールバックすれば良いので実装上もよさそうです。

どうでしょうか?

@hiroyaonoe
Copy link
Collaborator

後者がよいと思います.
指摘されている通りこっちのDBでのロールバックは簡単ですが,firebaseで再登録するのは不可能な気がするので.
またユーザーがfirebaseに存在してDBに存在しない状態は想定されています(firebaseで認証した直後)が,逆は想定していないので失敗したときの動作が読めないというのもあります.

@task4233
Copy link
Collaborator Author

その方向で修正します。

@task4233
Copy link
Collaborator Author

infra層でfirebaseとuserの2つに跨っているため、contextにトランザクションを持たせることとします。
ひとまず発表が始まったので、実装はあとでやります。

@task4233 task4233 changed the title feat: DELETE /user/{userID}の実装追加 [WIP] feat: DELETE /user/{userID}の実装追加 Mar 29, 2021
@task4233 task4233 changed the title [WIP] feat: DELETE /user/{userID}の実装追加 feat: DELETE /user/{userID}の実装追加 Mar 29, 2021
@task4233
Copy link
Collaborator Author

task4233 commented Mar 29, 2021

userRepoとauthRepoのDeleteをmockを用いてControllerでテストする場合、DoInTx()の内部で別のモックを呼ぶ必要がありテストが出来ていません。
ひとまずテストは消したのですが、イマイチ納得いっていないのでテストの仕方についてアイデアがあればコメントしてほしいです。

@hiroyaonoe
Copy link
Collaborator

transactionの設計自体は特に問題は無いと思いました!
DoInTxのモックは

mock.EXPECT().DoInTx(gomock.Any(), gomock.Any()).DoAndReturn(
    func(ctx context.Context, f func(ctx context.Context) error) error {
        return f(ctx)
    })

とかでいけませんか?(今手元にPCないので変なコード書いてるかもしれませんが、要はgomockのDoAndReturnを使えないかということです。)

ControllerのテストではDoInTxは引数の関数をそのまま実行するモックにしたら良いのではないでしょうか!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat 新規機能を開発したり、新しいツールを導入したりするとき
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants