Subscription.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. const { db, ObjectId } = require('../../../../app/src/infrastructure/mongodb')
  2. const { expect } = require('chai')
  3. const { promisify } = require('util')
  4. const SubscriptionUpdater = require('../../../../app/src/Features/Subscription/SubscriptionUpdater')
  5. const PermissionsManager = require('../../../../app/src/Features/Authorization/PermissionsManager')
  6. const SSOConfigManager = require('../../../../modules/group-settings/app/src/sso/SSOConfigManager')
  7. const SubscriptionModel =
  8. require('../../../../app/src/models/Subscription').Subscription
  9. const DeletedSubscriptionModel =
  10. require('../../../../app/src/models/DeletedSubscription').DeletedSubscription
  11. const Modules = require('../../../../app/src/infrastructure/Modules')
  12. class Subscription {
  13. constructor(options = {}) {
  14. this.admin_id = options.adminId || new ObjectId()
  15. this.overleaf = options.overleaf || {}
  16. this.groupPlan = options.groupPlan
  17. this.manager_ids = options.managerIds || [this.admin_id]
  18. this.member_ids = options.memberIds || []
  19. this.membersLimit = options.membersLimit || 0
  20. this.invited_emails = options.invitedEmails || []
  21. this.teamName = options.teamName
  22. this.teamInvites = options.teamInvites || []
  23. this.planCode = options.planCode
  24. this.recurlySubscription_id = options.recurlySubscription_id
  25. this.features = options.features
  26. this.ssoConfig = options.ssoConfig
  27. this.groupPolicy = options.groupPolicy
  28. }
  29. ensureExists(callback) {
  30. if (this._id) {
  31. return callback(null)
  32. }
  33. const options = { upsert: true, new: true, setDefaultsOnInsert: true }
  34. SubscriptionModel.findOneAndUpdate(
  35. { admin_id: this.admin_id },
  36. this,
  37. options,
  38. (error, subscription) => {
  39. if (error) {
  40. return callback(error)
  41. }
  42. this._id = subscription._id
  43. callback()
  44. }
  45. )
  46. }
  47. get(callback) {
  48. db.subscriptions.findOne({ _id: new ObjectId(this._id) }, callback)
  49. }
  50. getWithGroupPolicy(callback) {
  51. SubscriptionModel.findById(this._id).populate('groupPolicy').exec(callback)
  52. }
  53. setManagerIds(managerIds, callback) {
  54. return SubscriptionModel.findOneAndUpdate(
  55. { _id: new ObjectId(this._id) },
  56. { manager_ids: managerIds },
  57. callback
  58. )
  59. }
  60. setSSOConfig(ssoConfig, callback) {
  61. this.get((err, subscription) => {
  62. if (err) {
  63. return callback(err)
  64. }
  65. SSOConfigManager.promises
  66. .updateSubscriptionSSOConfig(subscription, ssoConfig)
  67. .then(result => callback(null, result))
  68. .catch(error => callback(error))
  69. })
  70. }
  71. refreshUsersFeatures(callback) {
  72. SubscriptionUpdater.refreshUsersFeatures(this, callback)
  73. }
  74. enableManagedUsers(callback) {
  75. Modules.hooks.fire('enableManagedUsers', this._id, callback)
  76. }
  77. getEnrollmentForUser(user, callback) {
  78. Modules.hooks.fire(
  79. 'getManagedUsersEnrollmentForUser',
  80. user,
  81. (error, [enrollment]) => {
  82. callback(error, enrollment)
  83. }
  84. )
  85. }
  86. getCapabilities(groupPolicy) {
  87. return PermissionsManager.getUserCapabilities(groupPolicy)
  88. }
  89. getUserValidationStatus(params, callback) {
  90. PermissionsManager.getUserValidationStatus(params, callback)
  91. }
  92. enrollManagedUser(user, callback) {
  93. SubscriptionModel.findById(this._id).exec((error, subscription) => {
  94. if (error) {
  95. return callback(error)
  96. }
  97. Modules.hooks.fire(
  98. 'enrollInManagedSubscription',
  99. user._id,
  100. subscription,
  101. callback
  102. )
  103. })
  104. }
  105. expectDeleted(deleterData, callback) {
  106. DeletedSubscriptionModel.find(
  107. { 'subscription._id': this._id },
  108. (error, deletedSubscriptions) => {
  109. if (error) {
  110. return callback(error)
  111. }
  112. expect(deletedSubscriptions.length).to.equal(1)
  113. const deletedSubscription = deletedSubscriptions[0]
  114. expect(deletedSubscription.subscription.teamInvites).to.be.empty
  115. expect(deletedSubscription.subscription.invited_emails).to.be.empty
  116. expect(deletedSubscription.deleterData.deleterIpAddress).to.equal(
  117. deleterData.ip
  118. )
  119. if (deleterData.id) {
  120. expect(deletedSubscription.deleterData.deleterId.toString()).to.equal(
  121. deleterData.id.toString()
  122. )
  123. } else {
  124. expect(deletedSubscription.deleterData.deleterId).to.be.undefined
  125. }
  126. SubscriptionModel.findById(this._id, (error, subscription) => {
  127. expect(subscription).to.be.null
  128. callback(error)
  129. })
  130. }
  131. )
  132. }
  133. }
  134. Subscription.promises = class extends Subscription {}
  135. // promisify User class methods - works for methods with 0-1 output parameters,
  136. // otherwise we will need to implement the method manually instead
  137. const nonPromiseMethods = ['constructor', 'getCapabilities']
  138. Object.getOwnPropertyNames(Subscription.prototype).forEach(methodName => {
  139. const method = Subscription.prototype[methodName]
  140. if (typeof method === 'function' && !nonPromiseMethods.includes(methodName)) {
  141. Subscription.promises.prototype[methodName] = promisify(method)
  142. }
  143. })
  144. module.exports = Subscription