User.coffee 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. request = require("./request")
  2. settings = require("settings-sharelatex")
  3. {db, ObjectId} = require("../../../../app/js/infrastructure/mongojs")
  4. count = 0
  5. class User
  6. constructor: (options = {}) ->
  7. @email = "acceptance-test-#{count}@example.com"
  8. @password = "acceptance-test-#{count}-password"
  9. count++
  10. @jar = request.jar()
  11. @request = request.defaults({
  12. jar: @jar
  13. })
  14. login: (callback = (error) ->) ->
  15. @getCsrfToken (error) =>
  16. return callback(error) if error?
  17. @request.post {
  18. url: "/register" # Register will log in, but also ensure user exists
  19. json:
  20. email: @email
  21. password: @password
  22. }, (error, response, body) =>
  23. return callback(error) if error?
  24. db.users.findOne {email: @email}, (error, user) =>
  25. return callback(error) if error?
  26. @id = user?._id?.toString()
  27. @_id = user?._id?.toString()
  28. @first_name = user?.first_name
  29. @referal_id = user?.referal_id
  30. callback()
  31. logout: (callback = (error) ->) ->
  32. @getCsrfToken (error) =>
  33. return callback(error) if error?
  34. @request.get {
  35. url: "/logout"
  36. json:
  37. email: @email
  38. password: @password
  39. }, (error, response, body) =>
  40. return callback(error) if error?
  41. db.users.findOne {email: @email}, (error, user) =>
  42. return callback(error) if error?
  43. @id = user?._id?.toString()
  44. @_id = user?._id?.toString()
  45. callback()
  46. ensure_admin: (callback = (error) ->) ->
  47. db.users.update {_id: ObjectId(@id)}, { $set: { isAdmin: true }}, callback
  48. upgradeFeatures: (callback = (error) -> ) ->
  49. features = {
  50. collaborators: -1 # Infinite
  51. versioning: true
  52. dropbox:true
  53. compileTimeout: 60
  54. compileGroup:"priority"
  55. templates: true
  56. references: true
  57. trackChanges: true
  58. trackChangesVisible: true
  59. }
  60. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  61. downgradeFeatures: (callback = (error) -> ) ->
  62. features = {
  63. collaborators: 1
  64. versioning: false
  65. dropbox:false
  66. compileTimeout: 60
  67. compileGroup:"standard"
  68. templates: false
  69. references: false
  70. trackChanges: false
  71. trackChangesVisible: false
  72. }
  73. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  74. defaultFeatures: (callback = (error) -> ) ->
  75. features = settings.defaultFeatures
  76. db.users.update {_id: ObjectId(@id)}, { $set: { features: features }}, callback
  77. full_delete_user: (email, callback = (error) ->) ->
  78. db.users.findOne {email: email}, (error, user) =>
  79. if !user?
  80. return callback()
  81. user_id = user._id
  82. db.projects.remove owner_ref:ObjectId(user_id), {multi:true}, (err)->
  83. if err?
  84. callback(err)
  85. db.users.remove {_id: ObjectId(user_id)}, callback
  86. getProject: (project_id, callback = (error, project)->) ->
  87. db.projects.findOne {_id: ObjectId(project_id.toString())}, callback
  88. createProject: (name, callback = (error, project_id) ->) ->
  89. @request.post {
  90. url: "/project/new",
  91. json:
  92. projectName: name
  93. }, (error, response, body) ->
  94. return callback(error) if error?
  95. if !body?.project_id?
  96. console.error "SOMETHING WENT WRONG CREATING PROJECT", response.statusCode, response.headers["location"], body
  97. callback(null, body.project_id)
  98. deleteProject: (project_id, callback=(error)) ->
  99. @request.delete {
  100. url: "/project/#{project_id}"
  101. }, (error, response, body) ->
  102. return callback(error) if error?
  103. callback(null)
  104. openProject: (project_id, callback=(error)) ->
  105. @request.get {
  106. url: "/project/#{project_id}"
  107. }, (error, response, body) ->
  108. return callback(error) if error?
  109. if response.statusCode != 200
  110. err = new Error("Non-success response when opening project: #{response.statusCode}")
  111. return callback(err)
  112. callback(null)
  113. addUserToProject: (project_id, user, privileges, callback = (error, user) ->) ->
  114. if privileges == 'readAndWrite'
  115. updateOp = {$addToSet: {collaberator_refs: user._id.toString()}}
  116. else if privileges == 'readOnly'
  117. updateOp = {$addToSet: {readOnly_refs: user._id.toString()}}
  118. db.projects.update {_id: db.ObjectId(project_id)}, updateOp, (err) ->
  119. callback(err)
  120. makePublic: (project_id, level, callback = (error) ->) ->
  121. @request.post {
  122. url: "/project/#{project_id}/settings/admin",
  123. json:
  124. publicAccessLevel: level
  125. }, (error, response, body) ->
  126. return callback(error) if error?
  127. callback(null)
  128. makePrivate: (project_id, callback = (error) ->) ->
  129. @request.post {
  130. url: "/project/#{project_id}/settings/admin",
  131. json:
  132. publicAccessLevel: 'private'
  133. }, (error, response, body) ->
  134. return callback(error) if error?
  135. callback(null)
  136. makeTokenBased: (project_id, callback = (error) ->) ->
  137. @request.post {
  138. url: "/project/#{project_id}/settings/admin",
  139. json:
  140. publicAccessLevel: 'tokenBased'
  141. }, (error, response, body) ->
  142. return callback(error) if error?
  143. callback(null)
  144. getCsrfToken: (callback = (error) ->) ->
  145. @request.get {
  146. url: "/register"
  147. }, (err, response, body) =>
  148. return callback(error) if error?
  149. csrfMatches = body.match("window.csrfToken = \"(.*?)\";")
  150. if !csrfMatches?
  151. return callback(new Error("no csrf token found"))
  152. @csrfToken = csrfMatches[1]
  153. @request = @request.defaults({
  154. headers:
  155. "x-csrf-token": @csrfToken
  156. })
  157. callback()
  158. changePassword: (callback = (error) ->) ->
  159. @getCsrfToken (error) =>
  160. return callback(error) if error?
  161. @request.post {
  162. url: "/user/password/update"
  163. json:
  164. currentPassword: @password
  165. newPassword1: @password
  166. newPassword2: @password
  167. }, (error, response, body) =>
  168. return callback(error) if error?
  169. db.users.findOne {email: @email}, (error, user) =>
  170. return callback(error) if error?
  171. callback()
  172. getUserSettingsPage: (callback = (error, statusCode) ->) ->
  173. @getCsrfToken (error) =>
  174. return callback(error) if error?
  175. @request.get {
  176. url: "/user/settings"
  177. }, (error, response, body) =>
  178. return callback(error) if error?
  179. callback(null, response.statusCode)
  180. getProjectListPage: (callback=(error, statusCode)->) ->
  181. @getCsrfToken (error) =>
  182. return callback(error) if error?
  183. @request.get {
  184. url: "/project"
  185. }, (error, response, body) =>
  186. return callback(error) if error?
  187. callback(null, response.statusCode)
  188. module.exports = User