indr/ember-seneca-auth

View on GitHub
addon/services/seneca-auth.js

Summary

Maintainability
A
3 hrs
Test Coverage
import Ember from 'ember';
import Utils from '../utils';

const {
  isEmpty,
  RSVP,
  $
} = Ember;

/**
 * @namespace services
 * @module seneca-auth
 * @extends Ember.Service
 */
export default Ember.Service.extend({
  jQuery: $,

  /**
   * @method login
   * @param {String} identification
   * @param {String} password
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  login(identification, password, data = {}) {
    data = Utils.assign({
      username: identification,
      password: password
    }, data);

    return this._makeRequest('/auth/login', 'POST', null, data);
  },

  /**
   * @method logout
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  logout(data = {}) {
    return this._makeRequest('/auth/logout', 'POST', null, data);
  },

  /**
   * @method user
   * @return {Ember.RSVP.Promise}
   * @public
   */
  user() {
    return this._makeRequest('/auth/user', 'GET');
  },

  /**
   * @method register
   * @param {String} emailAddress
   * @param {String} password
   * @param {String} repeat
   * @param {String} nick
   * @param {String} name
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  register(emailAddress, password, repeat, nick, name, data = {}) {
    data = Utils.assign({
      email: emailAddress,
      password: password,
      repeat: repeat,
      nick: nick,
      name: name
    }, data);

    return this._makeRequest('/auth/register', 'POST', null, data);
  },

  /**
   * @method createReset
   * @param {String} emailAddress
   * @param {String} nick
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  createReset(emailAddress, nick, data = {}) {
    data = Utils.assign({
      email: emailAddress,
      nick: nick
    }, data);

    return this._makeRequest('/auth/create_reset', 'POST', null, data);
  },

  /**
   * @method loadReset
   * @param {String} token
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  loadReset(token, data) {
    data = Utils.assign({
      token: token
    }, data);

    return this._makeRequest('/auth/load_reset', 'POST', null, data);
  },

  /**
   * @method executeReset
   * @param {String} token
   * @param {String} password
   * @param {String} repeat
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  executeReset(token, password, repeat, data) {
    data = Utils.assign({
      token,
      password,
      repeat
    }, data);

    return this._makeRequest('/auth/execute_reset', 'POST', null, data);
  },

  /**
   * @method updateUser
   * @param {String} newNick
   * @param {String} oldNick
   * @param {String} newEmailAddress
   * @param {String} oldEmailAddress
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  updateUser(newNick, oldNick, newEmailAddress, oldEmailAddress, data) {
    data = Utils.assign({
      nick: newNick,
      orig_nick: oldNick,
      email: newEmailAddress,
      orig_email: oldEmailAddress
    }, data);

    return this._makeRequest('/auth/update_user', 'POST', null, data);
  },

  /**
   * @method changePassword
   * @param {String} password
   * @param {String} repeat
   * @param {Object} [data={}] Object that gets assign to the payload
   * @return {Ember.RSVP.Promise}
   * @public
   */
  changePassword(password, repeat, data) {
    data = Utils.assign({
      password,
      repeat
    }, data);

    return this._makeRequest('/auth/change_password', 'POST', null, data);
  },

  /**
   * @method _makeRequest
   * @param {String} url
   * @param {String} [type='GET']
   * @param {Object} [headers={}]
   * @param {Object} [data=null]
   * @return {Ember.RSVP.Promise}
   * @private
   */
  _makeRequest(url, type = 'GET', headers = {}, data = null) {
    const options = {
      url,
      data: data != null ? JSON.stringify(data) : null,
      type: type,
      dataType: 'json',
      contentType: 'application/json',
      headers: headers || {}
    };

    if (isEmpty(Object.keys(options.headers))) {
      delete options.headers;
    }

    return new RSVP.Promise((resolve, reject) => {
      this.jQuery.ajax(options).then(resolve, reject);
    });
  }
});