【Go】GraphQL Mutation(削除)

GraphQL で削除処理。

開発環境

  • go1.18 linux/amd64
  • github.com/99designs/gqlgen v0.17.2

本文

GraphQL で削除処理を実装した。

https://gitlab.com/k1350/daybreak_sample/-/commit/e7083eec1427e610da4866ebfc4daa2fb22d037a

まず物理削除するか論理削除するかについて、当初は物理削除の予定だったが論理削除に変更した。

Web サービスにおいて削除した後二度と復旧できない仕様はあまり好まれない気がしている。

でも個人情報等を含む場合はデータを保持し続けるのもよろしくないように思うし、論理削除のデメリットとしてゴミデータが残るという点があげられることもあるので、一度論理削除で消した後、一定期間経過後にバッチ処理等で物理削除する方式がいいかもしれない。

よって DB に削除日時を追加した。
仮に今「後でバッチ処理で物理削除する」という仕様が無いとしても、「削除したかどうか」というフラグ値よりも削除した日時を保持しておくほうが後々役に立つ。

削除処理は削除対象のオーナーのみ削除できるようにしておかないといけないが、今回作っている物(ブログサービスを想定)は

  • blog(ブログ本体)
  • blog_link(著者のウェブサイト等をブログの説明欄に載せる用)
  • article(記事)

の3つのテーブルの内、blog にしかユーザーIDを持っていない。

よって blog_link, article は削除前に本体である blog のオーナーであるかどうかを確認してから削除する必要がある。

若干気がかりなのはブログ本体を削除したとき、そのブログと紐づく article も全部 deleted_at を更新している点。
大量に記事があった場合は遅いのではないかという気がしている。
delete よりは遥かにマシだと思うが……。
作りとしては blog の deleted_at さえ値が入っていれば blog_link, article は取得されないため、実運用上は blog だけ削除し、後からバッチで blog_link, article を削除したほうがいいかもしれない。

あとユーザーの退会時はどうするのがいいのだろう?
今回作っているものにはブログの公開オプションとして「非公開」が存在するため、退会したユーザーのブログを削除することもできるし、非公開にすることもできる。 流石にユーザーの退会と同時に全記事を削除していくのはあまりに時間がかかりすぎると思うので、「非公開」にするほうがいいかもしれない。

終わり