1.0.0 • Published 4 years ago

model-store-service v1.0.0

Weekly downloads
-
License
TBD
Repository
github
Last release
4 years ago

@track-advance/model-store-service

Installation

npm install @track-advance/model-store-service

Responsabilities

Provide a service to create Vuex module store for api models. Modules can be extended during creation to add specific actions and mutations id needed.

How to use model-store-service

First, Create new instance of modelStoreService.

const modelStoreService = new ModelStoreService();

Then, create a store for a specified API models,

const ItemsStore = modelStoreService.create<Items>('items', Items);

Full Example

This is a full example of how to use ModelStoreService.

import {Payload} from 'vuex';
import {apply, parallel} from 'async';
import {ModelStoreService} from '@track-advance/model-store-service';
import {Items} from '@track-advance/api-clients';

// Define generic error management for all store models
const onError(error: Error, payload: Payload){
    console.error(`${payload.type} error: ${error.message}`);
};

// onError is not required
const modelStoreService = new ModelStoreService(onError);

// Create an object to extends default store if needed
const store = {
    actions: {
        async deleteAll({dispatch, getters}): Promise<void> {
            const ItemIds = getters.collection.map(i => i.id);
            const ItemDeletePromises = ItemIds.map(
                (i) => apply(dispatch, 'delete', {id})
            );
            await parallel(ItemPromises);
        },
    },
}

// Create Hooks for extend default store action and mutations if needed
const hooks: {
    actions: {
        save: {
            async after({dispatch}, {model}){
                await dispatch('alert', {
                    type: 'success',
                    message: `${model.name} successfully saved`,
                },
                { root: true });
            }
        },
    }
}

// Define specific error management for Item models
const onErr(error: Error, context:payload: Payload){
    console.error(`Item ${payload.type} error: ${error.message}`);
};

// Create a module for Items module
const ItemsStore = modelStoreService.create<Items>('items',
                   Items, store, hooks, onErr);

The Result will be an Store module object that contains:

console.log(ItemsStore);
/*{
    items: {
        namespaced: true,
        state: {
            collection: Collection<Items> | Array<T>
        },
        getters: {
            collection: Collection<Items> | Array<T>
        },
        actions: {
            async fetch(context, payload?):
                  Promise<Collection<Items> | Array<T>>
            async fetchOne(context, payload?): Promise<T>,
            async save(context, payload?): Promise<T>,
            async delete(context, payload?): Promise<void>,
            async deleteAll(context, payload?): Promise<void>,
        },
        mutations: {
            addAll(state, payload): void,
            create(state, payload): void,
            update(state, payload): void,
            delete(state, payload): void,
        }
    }
}*/
1.0.0

4 years ago