util.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. const _ = require('lodash');
  3. const moment = require('moment');
  4. const { CrudService } = require('naf-framework-mongoose/lib/service');
  5. const { ObjectId } = require('mongoose').Types;
  6. const { BusinessError, ErrorCode } = require('naf-core').Error;
  7. const fs = require('fs');
  8. class UtilService extends CrudService {
  9. constructor(ctx) {
  10. super(ctx);
  11. this.mq = this.ctx.mq;
  12. this.projectList = this.app.config.project;
  13. }
  14. async utilMethod(query, body) {}
  15. dealQuery(query) {
  16. return this.turnFilter(this.turnDateRangeQuery(query));
  17. }
  18. analyzeUrl() {
  19. const request = this.ctx.request;
  20. let { method, url } = request;
  21. method = _.lowerCase(method);
  22. if (url.includes('/api/m/site')) {
  23. // TODO 通过网站进来的,如果是GET方法=>计数;然后将site去掉
  24. url = url.replace('/site', '');
  25. }
  26. const nUrl = this.dealUrl(url);
  27. const res = { url: nUrl, method };
  28. // 处理body
  29. if (method === 'post' || method === 'delete') {
  30. res.body = this.ctx.request.body;
  31. }
  32. return res;
  33. }
  34. dealUrl(url) {
  35. let arr = url.split('/');
  36. // 前3个属于中间层入口,干掉,直接干掉
  37. arr = _.drop(arr, 3);
  38. // 取出项目
  39. const project = _.head(arr);
  40. const uri = `/${_.drop(arr, 1).join('/')}`;
  41. const prefix = this.projectList[project];
  42. if (!prefix) throw new BusinessError(ErrorCode.SERVICE_FAULT, '未设置该project');
  43. return `${prefix}${uri}`;
  44. }
  45. /**
  46. * 将查询条件中模糊查询的标识转换成对应object
  47. * @param {Object} filter 查询条件
  48. */
  49. turnFilter(filter) {
  50. const str = /^%\S*%$/;
  51. const keys = Object.keys(filter);
  52. for (const key of keys) {
  53. const res = key.match(str);
  54. if (res) {
  55. const newKey = key.slice(1, key.length - 1);
  56. filter[newKey] = new RegExp(filter[key]);
  57. delete filter[key];
  58. }
  59. }
  60. return filter;
  61. }
  62. /**
  63. * 将时间转换成对应查询Object
  64. * @param {Object} filter 查询条件
  65. */
  66. turnDateRangeQuery(filter) {
  67. const keys = Object.keys(filter);
  68. for (const k of keys) {
  69. if (k.includes('@')) {
  70. const karr = k.split('@');
  71. // 因为是针对处理范围日期,所以必须只有,开始时间和结束时间
  72. if (karr.length === 2) {
  73. const type = karr[1];
  74. if (type === 'start') {
  75. filter[karr[0]] = {
  76. ..._.get(filter, karr[0], {}),
  77. $gte: filter[k],
  78. };
  79. } else {
  80. filter[karr[0]] = {
  81. ..._.get(filter, karr[0], {}),
  82. $lte: filter[k],
  83. };
  84. }
  85. delete filter[k];
  86. }
  87. }
  88. }
  89. return filter;
  90. }
  91. }
  92. module.exports = UtilService;