[nuxt.js その８] firestoreの利用

# データベース設計
firestoreのデータ構成は以下

```
　/
　└ コレクション/
　　　└ ドキュメント/
　　　　　　└ フィールド
```

今回はユーザごとにユーザ名を保持したいので以下のようにします。

```
　/
　└ users /
　　　└ USERID /
　　　　　　└ name: "あいうえお"
```
また、データにアクセスできるユーザのルールについても設定しておきます。
`match /databases/{database}/documents`の記述がありますが、これは`/`を指します。

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
　　// ここにルールを書く
  }
}
```

今回はドキュメント名が自分のユーザーIDと一致するユーザーしかアクセスできないようにします。
（createについては別）

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}
```


# ユーザページの作成
上記で用意したfirestoreにユーザ名を保存します。
https://firebase.google.com/docs/reference/js/firebase.firestore.Firestore?hl=ja

```vuejs:~/pages/index.vue
<template>
<v-app>
  <v-btn @click="logout">ログアウト</v-btn>
  <v-btn @click="getStatus">ユーザ情報の表示</v-btn>
  <div v-if="isVisible">
    <v-card-text>
      <v-subheader class="pa-0">ユーザー名</v-subheader>
      <v-text-field
        v-model="update.name"
        :label="user_infos.name"
      ></v-text-field>
    </v-card-text>
    <v-btn @click="updateStatus">ユーザ情報を更新する</v-btn>
  </div>
</v-app>
</template>

<script>
import firebase from '~/plugins/firebase.js'
export default {
  middleware: 'must-be-authenticated',
  data () {
    return {
      user_infos: '',
      isVisible: false,
      isfirst: 'true',
      uid: '',
      update: {
        name: ''
      }
    }
  },
  methods: {
    logout () {
      firebase.auth().signOut()
        .then(data => {
          this.$store.dispatch('auth/setLogOut')
          this.$store.dispatch('auth/setEmail', '')
          this.$store.dispatch('auth/setFireID', '')
          this.$store.dispatch('snackbar/setMessage', 'ログアウトしました')
          this.$store.dispatch('snackbar/snackOn')
          this.$router.push({path: '/'})
        })
    },
    getStatus () {
      if (this.isfirst) {
        firebase.firestore().collection('users').doc(this.$store.state.auth.fireid)
          .get()
          .then(doc => {
            if (doc.exists) {
                this.user_infos = doc.data()
                this.isVisible = !this.isVisible
                this.isfirst = false
            } else {
                // doc.data() will be undefined in this case
                this.$store.dispatch('snackbar/setMessage', 'エラーが発生しました')
                this.$store.dispatch('snackbar/snackOn')
            }
        })
      } else {
        this.isVisible = !this.isVisible
      }
    },
    updateStatus () {
      if (this.user_infos.name === this.update.name || this.update.name === null) {
        return
      }
      firebase.firestore().collection('users').doc(this.$store.state.auth.fireid)
        .update({
          name: this.update.name 
        })
    }
  }
}
</script>

```

以上！