import {Collection, Item, Model, Repository as VuexRepository} from "@vuex-orm/core"; import {$objectProperties} from "~/services/utils/objectProperties"; import {AnyJson} from "~/types/interfaces"; import {Store} from "vuex"; import * as _ from "lodash"; /** * @category Services/store * @class Repository * Classe Wrapper pour assurer les opérations les plus communes des Repository de VuexORM */ class Repository{ private store !: Store /** * Set le store * @param {Store} store */ public setStore(store: Store){ this.store = store } /** * Récupération du repository du Model * @param {Model} model * @return {VuexRepository} le repository */ public getRepository(model: typeof Model): VuexRepository{ return this.store.$repo(model) } /** * Récupération du nom de l'entité du model * @param {Model} model * @return {string} l'entité */ public getEntity(model: typeof Model): string{ return this.getRepository(model).getModel().$entity() } /** * Persist l'entry dans le repository * @param {VuexRepository} repository * @param {AnyJson} entry */ public persist(repository: VuexRepository, entry:AnyJson): void{ if(_.isEmpty(entry)) throw new Error('entry is empty') repository.save(entry) } /** * Effectue une mise à jour du store après la modification d'un champ de l'entry * @param {VuexRepository} repository * @param {AnyJson} entry * @param {any} value * @param {string} field */ public updateStoreFromField(repository: VuexRepository, entry:AnyJson, value:any, field:string): void{ if(!_.has(entry, field)) throw new Error('field not found') entry[field] = value this.persist(repository, $objectProperties.cloneAndNest(entry)) } /** * Récupération de l'Item du Model souhaité * @param {Model} model * @param {number} id * @return {Item} l'Item */ public findItemFromModel(model: typeof Model, id:number): Item{ const repository = this.getRepository(model) const item = repository.find(id) if(!item || typeof item === "undefined") throw new Error('Item not found') return item } /** * Récupération de la Collection du Model souhaité * @param {Model} model * @return {Collection} la collection */ public findCollectionFromModel(model: typeof Model): Collection{ const repository = this.getRepository(model) return repository.all() } /** * Supprime l'Item du repository * @param {Model} model * @param {number} id */ public deleteItem(model: typeof Model, id: number){ const repository = this.getRepository(model) repository.destroy(id) } /** * Supprime tous les Items du repository * @param {VuexRepository} repository */ public cleanRepository(repository: VuexRepository){ repository.flush() } } export const repositoryHelper = new Repository()