👋
退会機能の実装をするために行ったこと
はじめに
退会機能を実装したいなーと思い実際に実装してみたのでその時の記録です。
Cloud Functionsを使って実装しました。
実装したいこと
-
➀退会コレクションの作成
- createdAt,uid,userNameを保存
-
➁Cloud Functions着火
- ユーザコレクションの削除
- ユーザ情報の削除
こちらの記事を参考にしました!
ソース
初めに、➀を作成しました。
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