update-user-info.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. const url = require('url')
  2. const { userCollection, EXTERNAL_DIRECT_CONNECT_PROVIDER } = require('../../common/constants')
  3. const { ERROR } = require('../../common/error')
  4. const { findUser } = require('../../lib/utils/account')
  5. const PasswordUtils = require('../../lib/utils/password')
  6. /**
  7. * 使用 uid 或 externalUid 获取用户信息
  8. * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#external-update-userinfo
  9. * @param {object} params
  10. * @param {string} params.uid uni-id体系的用户id
  11. * @param {string} params.externalUid 业务系统的用户id
  12. * @param {string} params.nickname 昵称
  13. * @param {string} params.gender 性别
  14. * @param {string} params.avatar 头像
  15. * @returns {object}
  16. */
  17. module.exports = async function (params = {}) {
  18. const schema = {
  19. uid: {
  20. required: false,
  21. type: 'string'
  22. },
  23. externalUid: {
  24. required: false,
  25. type: 'string'
  26. },
  27. username: {
  28. required: false,
  29. type: 'string'
  30. },
  31. password: {
  32. required: false,
  33. type: 'password'
  34. },
  35. authorizedApp: {
  36. required: false,
  37. type: 'array<string>'
  38. }, // 指定允许登录的app,传空数组或不传时表示可以不可以在任何端登录
  39. nickname: {
  40. required: false,
  41. type: 'nickname'
  42. },
  43. role: {
  44. require: false,
  45. type: 'array<string>'
  46. },
  47. mobile: {
  48. required: false,
  49. type: 'mobile'
  50. },
  51. email: {
  52. required: false,
  53. type: 'email'
  54. },
  55. tags: {
  56. required: false,
  57. type: 'array<string>'
  58. },
  59. status: {
  60. required: false,
  61. type: 'number'
  62. },
  63. gender: {
  64. required: false,
  65. type: 'number'
  66. },
  67. avatar: {
  68. required: false,
  69. type: 'string'
  70. }
  71. }
  72. this.middleware.validate(params, schema)
  73. const {
  74. uid,
  75. externalUid,
  76. username,
  77. password,
  78. authorizedApp,
  79. nickname,
  80. role,
  81. mobile,
  82. email,
  83. tags,
  84. status,
  85. avatar,
  86. gender
  87. } = params
  88. if (!uid && !externalUid) {
  89. throw {
  90. errCode: ERROR.PARAM_REQUIRED,
  91. errMsgValue: {
  92. param: 'uid or externalUid'
  93. }
  94. }
  95. }
  96. let query
  97. if (uid) {
  98. query = {
  99. _id: uid
  100. }
  101. } else {
  102. query = {
  103. identities: {
  104. provider: EXTERNAL_DIRECT_CONNECT_PROVIDER,
  105. uid: externalUid
  106. }
  107. }
  108. }
  109. const users = await userCollection.where(query).get()
  110. const user = users.data && users.data[0]
  111. if (!user) {
  112. throw {
  113. errCode: ERROR.ACCOUNT_NOT_EXISTS
  114. }
  115. }
  116. // 更新的用户数据字段
  117. const data = {
  118. username,
  119. dcloud_appid: authorizedApp,
  120. nickname,
  121. role,
  122. mobile,
  123. email,
  124. tags,
  125. status,
  126. avatar,
  127. gender
  128. }
  129. const realData = Object.keys(data).reduce((res, key) => {
  130. const item = data[key]
  131. if (item !== undefined) {
  132. res[key] = item
  133. }
  134. return res
  135. }, {})
  136. // 更新用户名时验证用户名是否重新
  137. if (username) {
  138. const {
  139. userMatched
  140. } = await findUser({
  141. userQuery: {
  142. username
  143. },
  144. authorizedApp
  145. })
  146. if (userMatched.filter(user => user._id !== uid).length) {
  147. throw {
  148. errCode: ERROR.ACCOUNT_EXISTS
  149. }
  150. }
  151. }
  152. if (password) {
  153. const passwordUtils = new PasswordUtils({
  154. clientInfo: this.getUniversalClientInfo(),
  155. passwordSecret: this.config.passwordSecret
  156. })
  157. const {
  158. passwordHash,
  159. version
  160. } = passwordUtils.generatePasswordHash({
  161. password
  162. })
  163. realData.password = passwordHash
  164. realData.password_secret_version = version
  165. }
  166. if (avatar) {
  167. // eslint-disable-next-line n/no-deprecated-api
  168. const avatarPath = url.parse(avatar).pathname
  169. const extName = avatarPath.indexOf('.') > -1 ? avatarPath.split('.').pop() : ''
  170. realData.avatar_file = {
  171. name: avatarPath,
  172. extname: extName,
  173. url: avatar
  174. }
  175. }
  176. if (user.identities.length) {
  177. const identity = user.identities.find(item => item.provider === EXTERNAL_DIRECT_CONNECT_PROVIDER)
  178. if (identity) {
  179. identity.userInfo = {
  180. avatar,
  181. gender,
  182. nickname
  183. }
  184. }
  185. realData.identities = user.identities
  186. }
  187. await userCollection.where(query).update(realData)
  188. return {
  189. errCode: 0
  190. }
  191. }