InstitutionsAPI.coffee 3.1 KB

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