firestoreとcloudstorageのデータを一緒に削除したい + 保存時のファイル名が被らないようにしたい

#課題
storageを使って画像等を保存した際に、storeの方にURLなどのデータを保存したりしてる場合に
firestoreのデータを消した時、一緒にstorageの関連するデータを消したい。

#storeデータの削除~取得から削除

```javascript
import firebase from "../plugins/firebase";

export default class Images extends Vue {
  db = firebase.firestore();

//ここでstoreから取得
downLoad() {
    const imageList: any = [];
    this.db
      .collection("images")
      .orderBy("timeStamp", "desc")
      .limit(5)
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          imageList.push({ id: doc.id, data: doc.data() });//doc.idも保持しとく
        });
        this.images = imageList;//v-forを使って画面に表示するため
      });
  }

//storeからの削除
deleteStore(docId: string) {
    this.db
      .collection("images")
      .doc(docId)
      .delete()
      .then(() => {
        console.log("store削除完了");
        this.downLoad();
      });
}
```
これでstoreのデータは削除できるけど
これだとstorageのデータはそのままになる。

#Storageからのデータ削除

```javascript

//storageからの削除
  storage = firebase.storage();

  deleteStorage(fileName: string) {
    this.storage
      .ref()
      .child(`images/${fileName}`)
      .delete()
      .then(() => {
        console.log("storage削除完了");
      });
  }

```
これでstorageのデータの削除

#storeとstorageから削除
上のメソッド二つを呼ぶだけ

```javascript
deleteButton(docId: string, fileName: string) {
    this.deleteStore(docId);
    this.deleteStorage(fileName);
  }
```

これで無事に同時に削除されるようになりました。
でも問題が、、、ファイル名が同じやつは上書きされるんですね
アップロード時のファイル名をちょっといじる

#修正

```javascript
//時間を返すメソッドを作って
  getDate(): string {
    const time = new Date().getTime();
    return String(time);
  }

upLoad() {
    const time = this.getDate();//時間を文字列として取得
    const fileName = time + this.imageFile.name;//ファイル名と時間を繋げる
    const storageRef = this.storage.ref().child(`images/${fileName}`);//それをファイル名にする
    storageRef//storageへのアップロード処理
      .put(this.imageFile)
      .then(() => {
        storageRef.getDownloadURL().then((url) => {
          this.storeSave(url, fileName);//画像のURLとファイル名をストアに保存するメソッド呼び出し
        });
        this.imageFile = "";
        console.log("完了");
      })
      .catch(() => {
        alert("失敗しました");
      });
  }

 storeSave(imageUrl: string, fileName: string) {
    console.log(fileName);
    const user = this.auth.currentUser;//ユーザー情報の取得
    if (user === null) {
      return;
    }
    this.db
      .collection("images")
      .add({
        uid: user.uid,
        displayName: user.displayName,
        comment: this.comment,
        imageUrl: imageUrl,
        fileName: fileName,
        timeStamp: firebase.firestore.FieldValue.serverTimestamp(),
      })
      .then(() => {
        console.log("db完了");
        this.comment = "";
      });
  }
```
ファイル名＋時間にすることでよっぽどアクセスが集中しない限りは
まず被ることはなくなったとおもいます。

#最終的に
アップロードから削除までをまとめると

```javascript

interface ImageList {
  id: string;
  data: {
    displayName: string;
    comment?: string;
    imageUrl?: string;
    fileName?: string;
    uid: string;
    timeStamp: {
      nanoseconds: number;
      seconds: number;
    };
  };
}
export default class Images extends Vue {
  storage = firebase.storage();
  db = firebase.firestore();
  auth = firebase.auth();
  images: ImageList[] = [];
  imageFile: any = "";
  comment: string | null = "";

//storageに保存
  saveStorage() {
    const time = this.getDate();
    const fileName = time + this.imageFile.name;
    const storageRef = this.storage.ref().child(`images/${fileName}`);
    storageRef
      .put(this.imageFile)
      .then(() => {
        storageRef.getDownloadURL().then((url) => {
          this.saveStore(url, fileName);//saveStoreへ
        });
        this.imageFile = "";
        console.log("stotage完了");
      })
      .catch(() => {
        alert("失敗しました");
      });
  }

//storeに保存
  saveStore(imageUrl: string, fileName: string) {
    const user = this.auth.currentUser;
    if (user === null) {
      return;
    }
    this.db
      .collection("images")
      .add({
        uid: user.uid,
        displayName: user.displayName,
        comment: this.comment,
        imageUrl: imageUrl,
        fileName: fileName,
        timeStamp: firebase.firestore.FieldValue.serverTimestamp(),
      })
      .then(() => {
        console.log("store完了");
        this.comment = "";
      })
      .catch(() => {
        alert("失敗しました");
      });
  }

//storeから取得
  downLoad() {
    const imageList: any = [];
    this.db
      .collection("images")
      .orderBy("timeStamp", "desc")
      .limit(5)
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          imageList.push({ id: doc.id, data: doc.data() });
        });
        this.images = imageList;
      });
  }

//削除
 deleteButton(docId: string, fileName: string) {
    this.deleteStore(docId);
    this.deleteStorage(fileName);
  }

//storeから削除
  deleteStore(docId: string) {
    this.db
      .collection("images")
      .doc(docId)
      .delete()
      .then(() => {
        console.log("store削除完了");
        this.downLoad();
      });
  }

//storageから削除
  deleteStorage(fileName: string) {
    this.storage
      .ref()
      .child(`images/${fileName}`)
      .delete()
      .then(() => {
        console.log("storage削除完了");
      });
  }
}

```

これでやりたかった事はひとまずできました。

間違いがあったらご指摘いただけるとうれしいです。

以上！