user.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. const graphHelper = require('../../helpers/graph')
  2. const _ = require('lodash')
  3. /* global WIKI */
  4. module.exports = {
  5. Query: {
  6. async users() { return {} }
  7. },
  8. Mutation: {
  9. async users() { return {} }
  10. },
  11. UserQuery: {
  12. async list(obj, args, context, info) {
  13. return WIKI.models.users.query()
  14. .select('id', 'email', 'name', 'providerKey', 'isSystem', 'createdAt')
  15. },
  16. async search(obj, args, context, info) {
  17. return WIKI.models.users.query()
  18. .where('email', 'like', `%${args.query}%`)
  19. .orWhere('name', 'like', `%${args.query}%`)
  20. .limit(10)
  21. .select('id', 'email', 'name', 'providerKey', 'createdAt')
  22. },
  23. async single(obj, args, context, info) {
  24. let usr = await WIKI.models.users.query().findById(args.id)
  25. usr.password = ''
  26. usr.tfaSecret = ''
  27. return usr
  28. },
  29. async profile (obj, args, context, info) {
  30. if (!context.req.user || context.req.user.id < 1 || context.req.user.id === 2) {
  31. throw new WIKI.Error.AuthRequired()
  32. }
  33. const usr = await WIKI.models.users.query().findById(context.req.user.id)
  34. if (!usr.isActive) {
  35. throw new WIKI.Error.AuthAccountBanned()
  36. }
  37. const providerInfo = _.find(WIKI.data.authentication, ['key', usr.providerKey])
  38. usr.providerName = _.get(providerInfo, 'title', 'Unknown')
  39. usr.lastLoginAt = usr.lastLoginAt || usr.updatedAt
  40. usr.password = ''
  41. usr.providerId = ''
  42. usr.tfaSecret = ''
  43. return usr
  44. }
  45. },
  46. UserMutation: {
  47. async create (obj, args) {
  48. try {
  49. await WIKI.models.users.createNewUser(args)
  50. return {
  51. responseResult: graphHelper.generateSuccess('User created successfully')
  52. }
  53. } catch (err) {
  54. return graphHelper.generateError(err)
  55. }
  56. },
  57. async delete (obj, args) {
  58. try {
  59. if (args.id <= 2) {
  60. throw new WIKI.Error.UserDeleteProtected()
  61. }
  62. await WIKI.models.users.deleteUser(args.id)
  63. return {
  64. responseResult: graphHelper.generateSuccess('User deleted successfully')
  65. }
  66. } catch (err) {
  67. if (err.message.indexOf('foreign') >= 0) {
  68. return graphHelper.generateError(new WIKI.Error.UserDeleteForeignConstraint())
  69. } else {
  70. return graphHelper.generateError(err)
  71. }
  72. }
  73. },
  74. async update (obj, args) {
  75. try {
  76. await WIKI.models.users.updateUser(args)
  77. return {
  78. responseResult: graphHelper.generateSuccess('User created successfully')
  79. }
  80. } catch (err) {
  81. return graphHelper.generateError(err)
  82. }
  83. },
  84. async verify (obj, args) {
  85. try {
  86. await WIKI.models.users.query().patch({ isVerified: true }).findById(args.id)
  87. return {
  88. responseResult: graphHelper.generateSuccess('User verified successfully')
  89. }
  90. } catch (err) {
  91. return graphHelper.generateError(err)
  92. }
  93. },
  94. async activate (obj, args) {
  95. try {
  96. await WIKI.models.users.query().patch({ isActive: true }).findById(args.id)
  97. return {
  98. responseResult: graphHelper.generateSuccess('User activated successfully')
  99. }
  100. } catch (err) {
  101. return graphHelper.generateError(err)
  102. }
  103. },
  104. async deactivate (obj, args) {
  105. try {
  106. if (args.id <= 2) {
  107. throw new Error('Cannot deactivate system accounts.')
  108. }
  109. await WIKI.models.users.query().patch({ isActive: false }).findById(args.id)
  110. return {
  111. responseResult: graphHelper.generateSuccess('User deactivated successfully')
  112. }
  113. } catch (err) {
  114. return graphHelper.generateError(err)
  115. }
  116. },
  117. resetPassword (obj, args) {
  118. return false
  119. },
  120. async updateProfile (obj, args, context) {
  121. try {
  122. if (!context.req.user || context.req.user.id < 1 || context.req.user.id === 2) {
  123. throw new WIKI.Error.AuthRequired()
  124. }
  125. const usr = await WIKI.models.users.query().findById(context.req.user.id)
  126. if (!usr.isActive) {
  127. throw new WIKI.Error.AuthAccountBanned()
  128. }
  129. if (!usr.isVerified) {
  130. throw new WIKI.Error.AuthAccountNotVerified()
  131. }
  132. await WIKI.models.users.updateUser({
  133. id: usr.id,
  134. name: _.trim(args.name),
  135. jobTitle: _.trim(args.jobTitle),
  136. location: _.trim(args.location),
  137. timezone: args.timezone
  138. })
  139. const newToken = await WIKI.models.users.refreshToken(usr.id)
  140. return {
  141. responseResult: graphHelper.generateSuccess('User profile updated successfully'),
  142. jwt: newToken.token
  143. }
  144. } catch (err) {
  145. return graphHelper.generateError(err)
  146. }
  147. },
  148. async changePassword (obj, args, context) {
  149. try {
  150. if (!context.req.user || context.req.user.id < 1 || context.req.user.id === 2) {
  151. throw new WIKI.Error.AuthRequired()
  152. }
  153. const usr = await WIKI.models.users.query().findById(context.req.user.id)
  154. if (!usr.isActive) {
  155. throw new WIKI.Error.AuthAccountBanned()
  156. }
  157. if (!usr.isVerified) {
  158. throw new WIKI.Error.AuthAccountNotVerified()
  159. }
  160. if (usr.providerKey !== 'local') {
  161. throw new WIKI.Error.AuthProviderInvalid()
  162. }
  163. try {
  164. await usr.verifyPassword(args.current)
  165. } catch (err) {
  166. throw new WIKI.Error.AuthPasswordInvalid()
  167. }
  168. await WIKI.models.users.updateUser({
  169. id: usr.id,
  170. newPassword: args.new
  171. })
  172. const newToken = await WIKI.models.users.refreshToken(usr)
  173. return {
  174. responseResult: graphHelper.generateSuccess('Password changed successfully'),
  175. jwt: newToken.token
  176. }
  177. } catch (err) {
  178. return graphHelper.generateError(err)
  179. }
  180. }
  181. },
  182. User: {
  183. groups (usr) {
  184. return usr.$relatedQuery('groups')
  185. }
  186. },
  187. UserProfile: {
  188. async groups (usr) {
  189. const usrGroups = await usr.$relatedQuery('groups')
  190. return usrGroups.map(g => g.name)
  191. },
  192. async pagesTotal (usr) {
  193. const result = await WIKI.models.pages.query().count('* as total').where('creatorId', usr.id).first()
  194. return _.toSafeInteger(result.total)
  195. }
  196. }
  197. }