CRUD Firestore

Veamos como realizar un crud utilizando Quasar y Vuex.

Curso completo de VUE de cero a Experto!

Aprende Vue.js + Firebase + Node.js + MongoDB en un curso completo! Accede aquí

Boot Firebase

import * as firebase from "firebase/app"

import "firebase/firestore"
import "firebase/auth"

// Agregar configuración firebase:
var firebaseConfig = {
  apiKey: "xxx",
  authDomain: "xxx",
  databaseURL: "xxx",
  projectId: "xxx",
  storageBucket: "xxx",
  messagingSenderId: "xxx",
  appId: "xxx"
}

let firebaseApp = firebase.initializeApp(firebaseConfig)
let firebaseAuth = firebaseApp.auth()
let db = firebase.firestore();

export { firebaseAuth, db }

No olividar agregar a quasar.conf.js:



 



boot: [
  'axios',
  'firebase',
  'router-auth'
],

Store Module

Crear module store-crud para utilizar Vuex:

import crud from './store-crud'
Vue.use(Vuex)
export default function (/* { ssrContext } */) {
  const Store = new Vuex.Store({
    modules: {
      auth,crud
    },

GET

import Vue from 'vue'
import { db } from "boot/firebase";

const state = {
  task: {}
}
const mutations = {
  getTask(state, payload){
    // Comprobamos si tiene alguna tarea!
    if(payload){
      state.task = payload
    }else{
      state.task = {}
    }
  },
}
const actions = {
  async getTask({commit, rootState, state}, payload){
    try {
      const query = await db.collection("tasks")
                            .where("uid", "==", rootState.auth.user)
                            .get()
      query.forEach(doc => {
        let payload = {
          id: doc.id,
          taskDB: doc.data()
        }
        commit('addTask', payload);
      });
    } catch (error) {
      console.log(error);
    }
  },
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

ADD

const mutations = {
  addTask(state, payload) {
    Vue.set(state.task, payload.id, payload.taskDB)
  }
}
const actions = {
  async addTask({commit, rootState}, task){
    try {
      
      task.uid = rootState.auth.user
      const docRef = await db.collection('tasks').add(task)
      // console.log(docRef);
      const payload = {
        id: docRef.id,
        taskDB: task
      }
      commit('addTask', payload);
    } catch (error) {
      console.log(error);
    }
  },
}

UPDATE

const mutations = {
  updateTask(state, payload){
    Object.assign(state.task[payload.id], {fecha: payload.fecha, complete: payload.complete})
  },
}
const actions = {
  async editTask({commit, rootState}, task){
    try {
      const docRef = await db.collection('tasks').doc(task.id).update({
        complete: task.complete, fecha: Date.now()
      })
      commit('updateTask', {id: task.id, complete: task.complete, fecha: Date.now()})
    } catch (error) {
      console.log(error);
    }
  },
}

DELETE

const mutations = {
  deleteTask(state, id){
    Vue.delete(state.task, id)
  }
}
const actions = {
  async deleteTask({commit}, id){
    try {
      const docRef = await db.collection('tasks').doc(id).delete();
      commit('deleteTask', id);
    } catch (error) {
      console.log(error);
    }
  }
}

Crear Pages Crud

<template>
  <div>
    <q-btn @click="Agregar">Agregar</q-btn>
    <ul>
      <li v-for="(item, index) in task" :key="index">
        {{index}} - {{item}} 
        <q-btn round color="warning" icon="shopping_cart" @click="editTask({id:index, complete: !item.complete})" />
        <q-btn round color="red" icon="shopping_cart" @click="deleteTask(index)" />
      </li>
    </ul>
  </div>
</template>
import { mapActions, mapState } from "vuex";
import {db} from 'boot/firebase'
export default {
  computed:{
    ...mapState('crud', ['task'])
  },
  created() {
    this.getTask();
  },
  methods:{
    ...mapActions('crud', ['getTask', 'addTask','editTask','deleteTask']),
    async Agregar(){
      let nota = {
        complete: false,
        fecha: Date.now(),
        name: 'Nota Estática'
      }
      this.addTask(nota);
    }
  },
}