UserAffiliationsManager.coffee 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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, affiliationOptions, callback) ->
  13. unless callback? # affiliationOptions is optional
  14. callback = affiliationOptions
  15. affiliationOptions = {}
  16. { university, department, role } = affiliationOptions
  17. makeAffiliationRequest {
  18. method: 'POST'
  19. path: "/api/v2/users/#{userId.toString()}/affiliations"
  20. body: { email, university, department, role }
  21. defaultErrorMessage: "Couldn't create affiliation"
  22. }, callback
  23. removeAffiliation: (userId, email, callback = (error) ->) ->
  24. makeAffiliationRequest {
  25. method: 'POST'
  26. path: "/api/v2/users/#{userId.toString()}/affiliations/remove"
  27. body: { email }
  28. extraSuccessStatusCodes: [404] # `Not Found` responses are considered successful
  29. defaultErrorMessage: "Couldn't remove affiliation"
  30. }, callback
  31. endorseAffiliation: (userId, email, role, department, callback = (error) ->) ->
  32. makeAffiliationRequest {
  33. method: 'POST'
  34. path: "/api/v2/users/#{userId.toString()}/affiliations/endorse"
  35. body: { email, role, department }
  36. defaultErrorMessage: "Couldn't endorse affiliation"
  37. }, callback
  38. deleteAffiliations: (userId, callback = (error) ->) ->
  39. makeAffiliationRequest {
  40. method: 'DELETE'
  41. path: "/api/v2/users/#{userId.toString()}/affiliations"
  42. defaultErrorMessage: "Couldn't delete affiliations"
  43. }, callback
  44. makeAffiliationRequest = (requestOptions, callback = (error) ->) ->
  45. return callback(null) unless settings?.apis?.v1?.url # service is not configured
  46. requestOptions.extraSuccessStatusCodes ||= []
  47. request {
  48. method: requestOptions.method
  49. url: "#{settings.apis.v1.url}#{requestOptions.path}"
  50. body: requestOptions.body
  51. auth: { user: settings.apis.v1.user, pass: settings.apis.v1.pass }
  52. json: true,
  53. timeout: 20 * 1000
  54. }, (error, response, body) ->
  55. return callback(error) if error?
  56. isSuccess = 200 <= response.statusCode < 300
  57. isSuccess ||= response.statusCode in requestOptions.extraSuccessStatusCodes
  58. unless isSuccess
  59. if body?.errors
  60. errorMessage = "#{response.statusCode}: #{body.errors}"
  61. else
  62. errorMessage = "#{requestOptions.defaultErrorMessage}: #{response.statusCode}"
  63. return callback(new Error(errorMessage))
  64. callback(null, body)
  65. [
  66. 'getAffiliations',
  67. 'addAffiliation',
  68. 'removeAffiliation',
  69. ].map (method) ->
  70. metrics.timeAsyncMethod(
  71. UserAffiliationsManager, method, 'mongo.UserAffiliationsManager', logger
  72. )