[Firebase Extensions]Delete User Data

# この記事について

FirebaseSummit2019で発表された9つの拡張機能について試してみたという記事になります。
今回は[Delete User Data](https://firebase.google.com/products/extensions/delete-user-data/)についてになります。

# Delete User Dataとは？

Firebase/AuthenticationのUserDataが削除されたことをトリガーに
Firestore, Realtime Database, Cloud Storageのデータを削除する機能になります。

削除を行う際ポイントとなるのがAuthenticationのUUIDになります。
Firestoreを例にあげるとDocumentPathにUUIDがあることが前提となっており
以下のようなDocumentPathである必要があります。
`users/{UUID}`

ここで一度FirestoreのDocumentをどのように削除しているのかをコードでみてみます。

`extractUserPaths `
この中身を見るとfirestoreで削除したいDocumentは複数CollectionのDocumentを指定できるように思えます。
`users/{UUID}`,`secureusers/{UUID}`のように
[Cloud Firestoreを実践投入するにあたって考えたこと](https://qiita.com/1amageek/items/d606dcee9fbcf21eeec6#-same-id)で記載されているSameIDを使っている場合漏れなくAuthenticationのUUIDと同様のDocumentを削除することができそうです。


```typescript:index.ts
const clearFirestoreData = async (firestorePaths: string, uid: string) => {
  logs.firestoreDeleting();

  const paths = extractUserPaths(firestorePaths, uid);
  const promises = paths.map(async (path) => {
    try {
      logs.firestorePathDeleting(path);
      await admin
        .firestore()
        .doc(path)
        .delete();
      logs.firestorePathDeleted(path);
    } catch (err) {
      logs.firestorePathError(path, err);
    }
  });

  await Promise.all(promises);

  logs.firestoreDeleted();
};

const extractUserPaths = (paths: string, uid: string) => {
  return paths.split(",").map((path) => replaceUID(path, uid));
};

const replaceUID = (path: string, uid: string) => {
  return path.replace(/{UID}/g, uid);
};
```

# Delete User Dataを試してみる

## Firestoreの中身
今回はuser, secureusersにUUIDを用いてDocumentを作った上でDelete User Dataを使用してみます。
Pathは以下のようになっております。
`/version/1/users/{UUID}`
`/version/1/secureusers/{UUID}`

authenticationで登録されているUserを削除すると削除したUserのUUIDで登録されている
users, secureusersのDocumentが削除されるはずです。

## Delete User Dataの設定
今回はFirestoreで検証してみるので
RealtimeDatabaseとCloud StorageのPath設定は無しで行いました。
<img width="635" alt="スクリーンショット 2019-09-28 1.08.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/c8e01819-819f-72fc-aa46-db9395371078.png">

## Delete前の状態確認

**Authentication**
<img width="1170" alt="スクリーンショット 2019-09-28 0.34.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/65f5db7a-4d3e-e00b-9f88-ec816080d512.png">

**Firestore/users**
<img width="827" alt="スクリーンショット 2019-09-28 0.36.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/90db04e5-6fa7-4b3c-29ed-9d8a2784a179.png">

**Firestore/secureusers**
<img width="836" alt="スクリーンショット 2019-09-28 1.01.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/ab439935-a89f-4977-210d-dc6d104006e6.png">

## AuthenticationのUserDataを消してみた
見事users, secureusersのUUIDで紐づいているDocumentが削除されてました！

Cloud Functionsのログ
<img width="1001" alt="スクリーンショット 2019-09-28 1.16.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/12aec347-4720-9f9f-b44a-afb09cc823cc.png">


# さいごに
AuthenticationのUUIDがDocumentPathに含まれている場合、退会処理時に退会したUserのデータを削除することを約束してたりする場合Delete User Dataの設定に正しいPathを指定いれば削除し損なうことはないでしょうし入れておくと便利な機能だなと思いました。

また、デバッグ時に何度か新規にUserDataを作り直したい時があったりするのでそんな時にも使える機能かなと思います。