create-api-server.js 3.12 KB
/* eslint-disable indent */
/* eslint-disable operator-linebreak */

import checkParams from '../../utils/check-params';
import apiMaps from '../../config/api-map';
import createReport from 'report-error';

const yohoApi = global.yoho.API;
const ufoAPI = global.yoho.UfoAPI;
const serviceApi = global.yoho.ServiceAPI;
const checkApiMap = url => {
  return apiMaps[url] ? apiMaps[url] : void 0;
};
// eslint-disable-next-line space-before-function-paren
const request = async ({ url, method, reqParams = {}, context }) => {
  const apiInfo = checkApiMap(url);
  const { env, user = {} } = context;

  if (!apiInfo) {
    return Promise.reject(new Error(`未找到对应的接口:${url}`));
  }

  // 登陆:取session中用户信息
  // 非登录: 可以传参
  if (!apiInfo.service) {
    const { uid, sessionKey, appSessionType } = user;

    Object.assign(reqParams, { method: apiInfo.api });
    if (uid) {
      Object.assign(reqParams, {
        uid: {
          toString: () => {
            return user.uid;
          },
          sessionKey,
          appSessionType,
        },
      });
    }
  }

  // 开发环境接口调用非延签参数
  if (context.env.unProd) {
    Object.assign(reqParams, { debug: 'XYZ' });
  }
  const params = checkParams.getParams(reqParams, apiInfo);
  const cache = method.toLowerCase() !== 'get' ? false : apiInfo.cache;
  const headers = {
    'X-YOHO-IP': env.clientIp,
    'X-Forwarded-For': env.clientIp,
    'User-Agent': 'yoho/nodejs',
  };

  try {
    if (apiInfo.service) {
      return await serviceApi.get(`${apiInfo.api}${apiInfo.path}`, params, {
        cache: cache,
        headers,
      });
    } else if (apiInfo.ufo) {
      return await ufoAPI[method](`${apiInfo.path || ''}`, params, {
        cache: cache,
        headers,
      });
    } else {
      return await yohoApi[method](`${apiInfo.path || ''}`, params, {
        cache: cache,
        headers,
      });
    }
  } catch (error) {
    return Promise.reject({
      code: error.code || 500,
      message: error.message || '服务器错误',
    });
  }
};

const resolve = ({ context, store, reqParams }) => {
  return res => {
    if (res) {
      const { code } = res;

      if (code === 500) {
        createReport(context, 'api')(
          Object.assign(
            {
              api: reqParams.method,
            },
            res,
          ),
        );
      } else if (code === 401) {
        store.commit('SET_NEED_LOGIN', { needLogin: true });
      }
    }
    return res;
  };
};

export const createApi = (context, store) => {
  return {
    get(url, reqParams = {}) {
      return request({
        url,
        method: 'get',
        reqParams,
        context,
      })
        .then(resolve({ context, store, reqParams }))
        .catch(err => {
          console.log('----create----api--server--get---', err);
        });
    },
    post(url, reqParams = {}) {
      return request({
        url,
        method: 'post',
        reqParams,
        context,
      })
        .then(resolve({ context, store, reqParams }))
        .catch(err => {
          console.log('----create----api--server--post---', err);
        });
    },
  };
};