ssr-api.js 2.1 KB
const serviceApi = global.yoho.ServiceAPI;
const ufoAPI = global.yoho.UfoAPI;
const checkParams = require('../../utils/check-params');
const handleResult = require('../../utils/handle-result');
const apiMaps = require('../../config/api-map');
const errorHandler = require('./error-handler');

module.exports = async(req, res, next) => {
  res.set({
    'Cache-Control': 'no-cache',
    Pragma: 'no-cache',
    Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
  });
  const apiInfo = apiMaps[req.path];

  if (!apiInfo) {
    return next();
  }
  const baseParams = {};
  
  req.route = {
    path: req.path
  };

  if (!apiInfo.service) {
    baseParams.method = apiInfo.api;
  }
  if (apiInfo.auth) {
    if (req.user && req.user.uid) {
      baseParams.uid = {
        toString: () => {
          return req.user.uid;
        },
        sessionKey: req.user.sessionKey,
        appSessionType: req.user.appSessionType
      };
    }
  }

  try {
    const reqParams = Object.assign({}, req.query, req.body, baseParams);
    const params = checkParams.getParams(reqParams, apiInfo, req);
    const cache = (req.method.toLowerCase() !== 'get' || apiInfo.auth) ? false : apiInfo.cache;

    let method = req.method.toLowerCase() === 'post' ? 'post' : 'get';

    let result;

    let apiCtx = req.ctx(global.yoho.BaseModel);

    if (apiInfo.service) {
      result = await apiCtx.get({
        api: serviceApi,
        url: `${apiInfo.api || ''}${apiInfo.path || ''}`,
        data: params,
        param: {
          cache: cache,
        }
      });
    } else if (apiInfo.ufo) {
      result = await apiCtx[method]({
        api: ufoAPI,
        url: apiInfo.path || '',
        data: params,
        param: {
          cache: cache
        }
      });
    } else {
      result = await apiCtx[method]({
        data: params,
        url: apiInfo.path || '',
        param: {
          cache: cache
        }
      });
    }
    if (result) {
      return res.json(handleResult(result, apiInfo));
    }
    return res.json({
      code: 400
    });
  } catch (error) {
    return errorHandler.serverError(error, req, res, next);
  }
};