user.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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', 'isActive', 'createdAt', 'lastLoginAt')
  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. async lastLogins (obj, args, context, info) {
  46. return WIKI.models.users.query()
  47. .select('id', 'name', 'lastLoginAt')
  48. .whereNotNull('lastLoginAt')
  49. .orderBy('lastLoginAt', 'desc')
  50. .limit(10)
  51. }
  52. },
  53. UserMutation: {
  54. async create (obj, args) {
  55. try {
  56. await WIKI.models.users.createNewUser(args)
  57. return {
  58. responseResult: graphHelper.generateSuccess('User created successfully')
  59. }
  60. } catch (err) {
  61. return graphHelper.generateError(err)
  62. }
  63. },
  64. async delete (obj, args) {
  65. try {
  66. if (args.id <= 2) {
  67. throw new WIKI.Error.UserDeleteProtected()
  68. }
  69. await WIKI.models.users.deleteUser(args.id)
  70. return {
  71. responseResult: graphHelper.generateSuccess('User deleted successfully')
  72. }
  73. } catch (err) {
  74. if (err.message.indexOf('foreign') >= 0) {
  75. return graphHelper.generateError(new WIKI.Error.UserDeleteForeignConstraint())
  76. } else {
  77. return graphHelper.generateError(err)
  78. }
  79. }
  80. },
  81. async update (obj, args) {
  82. try {
  83. await WIKI.models.users.updateUser(args)
  84. return {
  85. responseResult: graphHelper.generateSuccess('User created successfully')
  86. }
  87. } catch (err) {
  88. return graphHelper.generateError(err)
  89. }
  90. },
  91. async verify (obj, args) {
  92. try {
  93. await WIKI.models.users.query().patch({ isVerified: true }).findById(args.id)
  94. return {
  95. responseResult: graphHelper.generateSuccess('User verified successfully')
  96. }
  97. } catch (err) {
  98. return graphHelper.generateError(err)
  99. }
  100. },
  101. async activate (obj, args) {
  102. try {
  103. await WIKI.models.users.query().patch({ isActive: true }).findById(args.id)
  104. return {
  105. responseResult: graphHelper.generateSuccess('User activated successfully')
  106. }
  107. } catch (err) {
  108. return graphHelper.generateError(err)
  109. }
  110. },
  111. async deactivate (obj, args) {
  112. try {
  113. if (args.id <= 2) {
  114. throw new Error('Cannot deactivate system accounts.')
  115. }
  116. await WIKI.models.users.query().patch({ isActive: false }).findById(args.id)
  117. return {
  118. responseResult: graphHelper.generateSuccess('User deactivated successfully')
  119. }
  120. } catch (err) {
  121. return graphHelper.generateError(err)
  122. }
  123. },
  124. resetPassword (obj, args) {
  125. return false
  126. },
  127. async updateProfile (obj, args, context) {
  128. try {
  129. if (!context.req.user || context.req.user.id < 1 || context.req.user.id === 2) {
  130. throw new WIKI.Error.AuthRequired()
  131. }
  132. const usr = await WIKI.models.users.query().findById(context.req.user.id)
  133. if (!usr.isActive) {
  134. throw new WIKI.Error.AuthAccountBanned()
  135. }
  136. if (!usr.isVerified) {
  137. throw new WIKI.Error.AuthAccountNotVerified()
  138. }
  139. if (!['', 'DD/MM/YYYY', 'DD.MM.YYYY', 'MM/DD/YYYY', 'YYYY-MM-DD', 'YYYY/MM/DD'].includes(args.dateFormat)) {
  140. throw new WIKI.Error.InputInvalid()
  141. }
  142. if (!['', 'light', 'dark'].includes(args.appearance)) {
  143. throw new WIKI.Error.InputInvalid()
  144. }
  145. await WIKI.models.users.updateUser({
  146. id: usr.id,
  147. name: _.trim(args.name),
  148. jobTitle: _.trim(args.jobTitle),
  149. location: _.trim(args.location),
  150. timezone: args.timezone,
  151. dateFormat: args.dateFormat,
  152. appearance: args.appearance
  153. })
  154. const newToken = await WIKI.models.users.refreshToken(usr.id)
  155. return {
  156. responseResult: graphHelper.generateSuccess('User profile updated successfully'),
  157. jwt: newToken.token
  158. }
  159. } catch (err) {
  160. return graphHelper.generateError(err)
  161. }
  162. },
  163. async changePassword (obj, args, context) {
  164. try {
  165. if (!context.req.user || context.req.user.id < 1 || context.req.user.id === 2) {
  166. throw new WIKI.Error.AuthRequired()
  167. }
  168. const usr = await WIKI.models.users.query().findById(context.req.user.id)
  169. if (!usr.isActive) {
  170. throw new WIKI.Error.AuthAccountBanned()
  171. }
  172. if (!usr.isVerified) {
  173. throw new WIKI.Error.AuthAccountNotVerified()
  174. }
  175. if (usr.providerKey !== 'local') {
  176. throw new WIKI.Error.AuthProviderInvalid()
  177. }
  178. try {
  179. await usr.verifyPassword(args.current)
  180. } catch (err) {
  181. throw new WIKI.Error.AuthPasswordInvalid()
  182. }
  183. await WIKI.models.users.updateUser({
  184. id: usr.id,
  185. newPassword: args.new
  186. })
  187. const newToken = await WIKI.models.users.refreshToken(usr)
  188. return {
  189. responseResult: graphHelper.generateSuccess('Password changed successfully'),
  190. jwt: newToken.token
  191. }
  192. } catch (err) {
  193. return graphHelper.generateError(err)
  194. }
  195. }
  196. },
  197. User: {
  198. groups (usr) {
  199. return usr.$relatedQuery('groups')
  200. }
  201. },
  202. UserProfile: {
  203. async groups (usr) {
  204. const usrGroups = await usr.$relatedQuery('groups')
  205. return usrGroups.map(g => g.name)
  206. },
  207. async pagesTotal (usr) {
  208. const result = await WIKI.models.pages.query().count('* as total').where('creatorId', usr.id).first()
  209. return _.toSafeInteger(result.total)
  210. }
  211. }
  212. }