UserAffiliationsManager.coffee 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. logger = require("logger-sharelatex")
  2. metrics = require("metrics-sharelatex")
  3. settings = require "settings-sharelatex"
  4. request = require "request"
  5. module.exports = UserAffiliationsManager =
  6. getAffiliations: (userId, callback = (error, body) ->) ->
  7. makeAffiliationRequest {
  8. method: 'GET'
  9. path: "/api/v2/users/#{userId.toString()}/affiliations"
  10. defaultErrorMessage: "Couldn't get affiliations"
  11. }, callback
  12. addAffiliation: (userId, email, { university, department, role }, callback = (error) ->) ->
  13. makeAffiliationRequest {
  14. method: 'POST'
  15. path: "/api/v2/users/#{userId.toString()}/affiliations"
  16. body: { email, university, department, role }
  17. defaultErrorMessage: "Couldn't create affiliation"
  18. }, callback
  19. removeAffiliation: (userId, email, callback = (error) ->) ->
  20. makeAffiliationRequest {
  21. method: 'POST'
  22. path: "/api/v2/users/#{userId.toString()}/affiliations/remove"
  23. body: { email }
  24. extraSuccessStatusCodes: [404] # `Not Found` responses are considered successful
  25. defaultErrorMessage: "Couldn't remove affiliation"
  26. }, callback
  27. deleteAffiliations: (userId, callback = (error) ->) ->
  28. makeAffiliationRequest {
  29. method: 'DELETE'
  30. path: "/api/v2/users/#{userId.toString()}/affiliations"
  31. defaultErrorMessage: "Couldn't delete affiliations"
  32. }, callback
  33. makeAffiliationRequest = (requestOptions, callback = (error) ->) ->
  34. return callback(null) unless settings?.apis?.v1?.url # service is not configured
  35. requestOptions.extraSuccessStatusCodes ||= []
  36. request {
  37. method: requestOptions.method
  38. url: "#{settings.apis.v1.url}#{requestOptions.path}"
  39. body: requestOptions.body
  40. auth: { user: settings.apis.v1.user, pass: settings.apis.v1.pass }
  41. json: true,
  42. timeout: 20 * 1000
  43. }, (error, response, body) ->
  44. return callback(error) if error?
  45. isSuccess = 200 <= response.statusCode < 300
  46. isSuccess ||= response.statusCode in requestOptions.extraSuccessStatusCodes
  47. unless isSuccess
  48. if body?.errors
  49. errorMessage = "#{response.statusCode}: #{body.errors}"
  50. else
  51. errorMessage = "#{requestOptions.defaultErrorMessage}: #{response.statusCode}"
  52. return callback(new Error(errorMessage))
  53. callback(null, body)
  54. [
  55. 'getAffiliations',
  56. 'addAffiliation',
  57. 'removeAffiliation',
  58. ].map (method) ->
  59. metrics.timeAsyncMethod(
  60. UserAffiliationsManager, method, 'mongo.UserAffiliationsManager', logger
  61. )