request.js 1.3 KB
Newer Older
1 2 3 4 5 6 7 8
import _ from 'lodash';
import { fetch } from './polyfill';
import { encrypt } from './helper';
import { getToken } from './auth';
import { errors } from './error';
import { checkStatus, normParams, parseObject } from './http-helper';

const defaultOptions = {
吴强's avatar
吴强 committed
9
  timeout: 3 * 1000,
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
  headers: { Accept: 'application/json' },
};

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param auth
 * @param params
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default async function request(url, params = {}, options = {}, auth = true) {
  let token;
  if (auth) {
    token = await getToken();
    if (!token) {
      return Promise.reject(errors.tokenMissing());
    }
    token = encrypt(token);
  }
  let queryParams = token ? [...normParams(params), ['token', token]] : normParams(params);
  queryParams = queryParams.map(([k, v]) => (_.isNil(v) ? k : `${k}=${encodeURIComponent(v)}`));
  queryParams = queryParams.join('&');
  let realUrl = url;
  if (queryParams) {
    realUrl = `${url}?${queryParams}`;
  }
  return fetch(realUrl, _.defaults(options, defaultOptions))
    .then(checkStatus)
    .then(parseObject);
}