import { Action, getModule, Module, Mutation, MutationAction, VuexModule } from 'vuex-module-decorators'; import assign from 'lodash.assign'; import keyBy from 'lodash.keyby'; import omit from 'lodash.omit'; import { User, Measure, MeasureConfig } from '@/models'; import api from '@/services/pm-api-client'; @Module({ namespaced: true, name: 'measure' }) export class MeasureStoreModule extends VuexModule { public measures: { [key: string]: Measure } = {}; @MutationAction({ mutate: ['measures'], rawError: true }) public async fetchAllMeasures() { const measures = await api.getAllMeasures(); return { measures: keyBy(measures, 'slug') }; } @Action({ rawError: true }) public async fetchMeasure(slug: string) { const measure = api.getMeasure(slug); this.context.commit('SET_MEASURE', measure); return measure; } @Action({ rawError: true }) public async createMeasure(m: Measure) { const newMeasure = await api.createMeasure(m); this.context.commit('SET_MEASURE', newMeasure); return newMeasure; } @Action({ rawError: true }) public async deleteMeasure(m: Measure) { const delResponse = await api.deleteMeasure(m.slug); this.context.commit('DELETE_MEASURE', m); } @Action({ rawError: true }) public async updateMeasure(m: Measure) { const updatedMeasure = await api.updateMeasure(m); return updatedMeasure; } @Mutation private SET_MEASURE(measure: Measure) { this.measures = assign({}, this.measures, {[measure.slug]: measure}); } @Mutation private DELETE_MEASURE(measure: Measure) { this.measures = assign({}, omit(this.measures, measure.slug)); } }