personal.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose/lib/service');
  3. const { BusinessError, ErrorCode } = require('naf-core').Error;
  4. const { ObjectId } = require('mongoose').Types;
  5. const _ = require('lodash');
  6. const jwt = require('jsonwebtoken');
  7. const assert = require('assert');
  8. // 个人用户
  9. class PersonalService extends CrudService {
  10. constructor(ctx) {
  11. super(ctx, 'personal');
  12. this.redis = this.app.redis;
  13. this.model = this.ctx.model.Personal;
  14. }
  15. /**
  16. * 创建用户
  17. * @param {Object} params 用户信息
  18. */
  19. async create({ password, ...data }) {
  20. data.password = { secret: password };
  21. const { phone } = data;
  22. // 检查手机号
  23. const num = await this.model.count({ phone, isdel: '0' });
  24. if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '已有个人用户使用该手机号');
  25. return await this.model.create(data);
  26. }
  27. /**
  28. * 修改密码
  29. * @param {Object} {id,password} 用户id和密码
  30. */
  31. async password({ id, password }) {
  32. const object = await this.model.findById(id);
  33. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
  34. object.password = { secret: password };
  35. await object.save();
  36. }
  37. /**
  38. * 登陆
  39. * @param {Object} params 登陆信息
  40. * @property phone 手机号
  41. * @property password 密码
  42. */
  43. async login({ phone, password }) {
  44. const object = await this.model.findOne({ phone, isdel: '0' }, '+password');
  45. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
  46. const { password: op, status } = object;
  47. const { secret } = op;
  48. if (status !== '1') throw new BusinessError(ErrorCode.ACCESS_DENIED, '拒绝访问!');
  49. if (secret !== password) throw new BusinessError(ErrorCode.BAD_PASSWORD, '密码错误');
  50. const data = _.omit(JSON.parse(JSON.stringify(object)), [ 'meta', 'password', '__v' ]);
  51. const { secret: secrets } = this.config.jwt;
  52. const token = jwt.sign(data, secrets);
  53. // 记录登陆
  54. // let number = await this.redis.get('login_number') || 0;
  55. // number++;
  56. // await this.redis.set('login_number', number);
  57. return token;
  58. }
  59. async delete({ id }) {
  60. const object = await this.model.findById(id);
  61. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
  62. object.isdel = '1';
  63. await object.save();
  64. }
  65. /**
  66. * 个人升变专家
  67. * @param {Object} body 升变数据
  68. * 升级的时候要把所属的信息(产品,需求等)换到升级后的数据上,一种数据迁移
  69. */
  70. async upgrade({ id, ...data }) {
  71. assert(id, '缺少个人用户ID');
  72. const user = await this.model.findOne({ _id: ObjectId(id) }, '+password');
  73. if (!user) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
  74. data = _.omit(data, [ 'meta', '__v' ]);
  75. data.user_id = id;
  76. // 创建专家
  77. const is_expert = await this.ctx.model.Expert.count({ user_id: ObjectId(id) });
  78. if (is_expert > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '已升级为专家,无需再次升级');
  79. await this.ctx.model.Expert.create(data);
  80. user.is_expert = true;
  81. await user.save();
  82. }
  83. }
  84. module.exports = PersonalService;