Home Reference Source

core/datastore/processors/data-processor.js

import { Promise } from 'es6-promise';

import { KinveyError } from '../../errors';

import { OperationType } from '../operations';
import { ensureArray } from '../../utils';

// imported for type definition
// import { Repository } from '../repositories';
// import { NetworkRepository } from '../repositories';

/**
 * @private
 */
export class DataProcessor {
  _repoPromise; // protected

  _getRepository() {
    throw new Error('_getRepository not implemented');
  }

  process(operation, options) {
    const { collection, data, query, entityId } = operation;

    switch (operation.type) {
      case OperationType.Create:
        return this._processCreate(collection, data, options);
      case OperationType.Read:
        return this._processRead(collection, query, options);
      case OperationType.ReadById:
        return this._processReadById(collection, entityId, options);
      case OperationType.Update:
        return this._processUpdate(collection, data, options);
      case OperationType.Delete:
        return this._processDelete(collection, query, options);
      case OperationType.DeleteById:
        return this._processDeleteById(collection, entityId, options);
      case OperationType.Count:
        return this._processCount(collection, query, options);
      case OperationType.Group:
        return this._processGroup(collection, query, options);
      default: {
        const err = new KinveyError(`Unexpected operation type: ${operation.type}`);
        return Promise.reject(err);
      }
    }
  }

  _processCreate(collection, data, options) {
    return this._getRepository()
      .then(repo => repo.create(collection, data, options));
  }

  _processRead(collection, query, options) {
    return this._getRepository()
      .then(repo => repo.read(collection, query, options));
  }

  _processReadById(collection, entityId, options) {
    return this._getRepository()
      .then(repo => repo.readById(collection, entityId, options));
  }

  _processUpdate(collection, data, options) {
    return this._getRepository()
      .then(repo => repo.update(collection, data, options));
  }

  _processDelete(collection, query, options) {
    return this._getRepository()
      .then(repo => repo.delete(collection, query, options));
  }

  _processDeleteById(collection, entityId, options) {
    return this._getRepository()
      .then(repo => repo.deleteById(collection, entityId, options));
  }

  _processCount(collection, query, options) {
    return this._getRepository()
      .then(repo => repo.count(collection, query, options));
  }

  _processGroup(collection, aggregationQuery, options) {
    return this._getRepository()
      .then(repo => repo.group(collection, aggregationQuery, options));
  }
}