ssr-api.js 2.39 KB
/* eslint-disable operator-linebreak */
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');

// eslint-disable-next-line space-before-function-paren
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,
      };
    }
  }

  if (process.env.NODE_ENV !== 'production') {
    baseParams.debug = 'XYZ';
  }

  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 ? apiInfo.path : '',
        data: params,
        param: {
          cache: cache,
        },
      });
    } else {
      result = await apiCtx[method]({
        data: params,
        url: apiInfo.path || '',
        param: {
          cache: cache,
        },
      });
    }
    if (result) {
      // console.log(result);
      return res.json(handleResult(result, apiInfo));
    }
    return res.json({
      code: 400,
    });
  } catch (error) {
    console.error('------ssr-api------', error);
    return errorHandler.serverError(error, req, res, next);
  }
};