Show:
/* eslint-disable ember/no-jquery */
/**
 store servie mange all model
 @module services
 @submodule store
 */
import Service from '@ember/service';
import EmberObject from '@ember/object';
import { getOwner } from '@ember/application';
import { keys } from '@ember/polyfills';
import $ from 'jquery';
import { isEmpty } from '@ember/utils';
// eslint-disable-next-line ember/no-mixins
import ajax from '../mixins/ajax';

/**
 store
 @public
 @class store
 **/
export default class Store extends Service.extend(ajax) {
  modelFor(type) {
    var kclass;
    if (getOwner) {
      kclass = getOwner(this).lookup('model:' + type, {
        singleton: false,
      });
      if (!kclass) {
        console.log('model:' + type + ' is not found');
        return EmberObject.create();
      }
      return kclass;
    }

    kclass = this.container.lookupFactory('model:' + type);
    console.log(kclass);
    if (!kclass) {
      console.log('model:' + type + ' is not found');
      return EmberObject.create();
    }

    return kclass.create();
  }

  /**
     find the record according to modelName
     @method find
     @param type modelName
     @param params query params
     @return  {Promise}
     */
  find(type, params) {
    return this.modelFor(type).find(params);
  }

  /**
     findOne the record according to modelName
     @method findOne
     @param type modelName
     @param _id primaryKey
     @param data query params
     @return  {Promise}
     */
  findOne(type, _id, data) {
    return this.modelFor(type).findOne(_id, data);
  }

  /**
     create the record according to modelName
     @method createRecord
     @param {String} type modelName
     @param {Object} init init data
     @return  {Promise}
     */
  createRecord(type, init) {
    return this.modelFor(type).createRecord(init);
  }

  /**
     delete the record according to modelName
     @method deleteRecord
     @param {String} type modelName
     @param {Object} model
     @param {Object} data query params
     @return  {Promise}
     */
  deleteRecord(type, model, data) {
    return this.modelFor(type).deleteRecord(model, data);
  }

  /**
     save the record according to modelName
     @method save
     @param type modelName
     @param model model
     @return  {Promise}
     */
  save(type, model) {
    return this.modelFor(type).save(model);
  }

  /**
     filter model empty attrs
     @method emptyAttrs
     @param type modelName
     @param model object need to be filterd
     @param filterKeys default is model keys
     @param unfilterKeys not need to be filterd
     @return {Array} all keys attribute value is empty
     */
  emptyAttrs(type, model, filterKeys, unfilterKeys) {
    var emptyKeys = [];
    var filtered = filterKeys || keys(this.modelFor(type).model);
    var unfiltered = unfilterKeys || [];

    var finallyfiltered = filtered.filter(function (item) {
      return unfiltered.indexOf(item) === -1;
    });

    $.each(finallyfiltered, function (index, key) {
      if (typeof key === 'string') {
        if (isEmpty(model.get(key))) {
          emptyKeys.push(key);
        }
      }
    });
    return emptyKeys;
  }
}