👋

退会機能の実装をするために行ったこと

2024/05/23に公開

はじめに

退会機能を実装したいなーと思い実際に実装してみたのでその時の記録です。
Cloud Functionsを使って実装しました。

実装したいこと

  • ➀退会コレクションの作成
    • createdAt,uid,userNameを保存
  • ➁Cloud Functions着火
    • ユーザコレクションの削除
    • ユーザ情報の削除

こちらの記事を参考にしました!
https://zenn.dev/joo_hashi/articles/4c601640c64c4c

ソース

初めに、➀を作成しました。

Future<void> deleteAccount(BuildContext context) async {
    final currentUser = FirebaseAuth.instance.currentUser;
    if (currentUser == null) {
      return;
    }
    final String uid = currentUser.uid;
    final DocumentSnapshot<Map<String, dynamic>> userDoc =
        await FirebaseFirestore.instance.collection('users').doc(uid).get();
    final String displayName = userDoc.data()?['userName'] as String;
    try {
      final data = {
        'uid': uid,
        'userName': displayName,
        'createdAt': Timestamp.now(),
      };
      //退会コレクションの追加
      await FirebaseFirestore.instance.collection('sample_delete').add(data);
      await FirebaseAuth.instance.signOut();
      if (!context.mounted) {
        return;
      }
      await Navigator.pushReplacement(
        context,
        MaterialPageRoute<WelcomePage>(
          builder: (context) => const WelcomePage(),
        ),
      );
      debugPrint('削除成功');
    } on FirebaseAuthException catch (e) {
      debugPrint('$e');
    }
  }

次に➁を作成しました。
作成後に
コマンド:firebase deploy
でDeploy complete!となればOKです。

exports.onDeleteUserAllCollection = functions
    .region("asia-northeast1")
    .firestore.document('sample_delete/{docId}')
    .onCreate(async (snap,_) => {
        const uid = snap.data().uid;
        const db = admin.firestore();
        const userDocRef = db.collection('users').doc(uid);
        const eventsBatch = db.batch();
        const events = await userDocRef.collection('events').get();
        events.docs.forEach(doc => {
        eventsBatch.delete(doc.ref);
        });
        await eventsBatch.commit();

        //ユーザーのドキュメントを削除
        await userDocRef.delete();

        //ユーザーを削除
        await admin.auth().deleteUser(uid);

        console.log(`Deleted user document for ${uid}`);
});

Discussion