SubscriptionLocator.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. const { callbackifyAll } = require('@overleaf/promise-utils')
  2. const { Subscription } = require('../../models/Subscription')
  3. const { DeletedSubscription } = require('../../models/DeletedSubscription')
  4. const logger = require('@overleaf/logger')
  5. const {
  6. AI_ADD_ON_CODE,
  7. isStandaloneAiAddOnPlanCode,
  8. } = require('./PaymentProviderEntities')
  9. require('./GroupPlansData') // make sure dynamic group plans are loaded
  10. const SubscriptionLocator = {
  11. async getUsersSubscription(userOrId) {
  12. const userId = SubscriptionLocator._getUserId(userOrId)
  13. const subscription = await Subscription.findOne({ admin_id: userId }).exec()
  14. logger.debug({ userId }, 'got users subscription')
  15. return subscription
  16. },
  17. async getUserIndividualSubscription(userOrId) {
  18. const userId = SubscriptionLocator._getUserId(userOrId)
  19. const subscription = await Subscription.findOne({
  20. admin_id: userId,
  21. groupPlan: false,
  22. }).exec()
  23. logger.debug({ userId }, 'got users individual subscription')
  24. return subscription
  25. },
  26. async getManagedGroupSubscriptions(userOrId) {
  27. return await Subscription.find({
  28. manager_ids: userOrId,
  29. groupPlan: true,
  30. })
  31. .populate('admin_id', ['_id', 'email'])
  32. .exec()
  33. },
  34. async getMemberSubscriptions(userOrId, populate = []) {
  35. const userId = SubscriptionLocator._getUserId(userOrId)
  36. // eslint-disable-next-line no-restricted-syntax
  37. return await Subscription.find({ member_ids: userId })
  38. .populate('admin_id', 'email')
  39. .populate(populate)
  40. .exec()
  41. },
  42. async getAdminEmail(subscriptionId) {
  43. const subscription = await Subscription.findById(subscriptionId)
  44. .populate('admin_id', 'email')
  45. .exec()
  46. return subscription?.admin_id?.email
  47. },
  48. async getAdminEmailAndName(subscriptionId) {
  49. const subscription = await Subscription.findById(subscriptionId)
  50. .populate('admin_id', ['email', 'first_name', 'last_name'])
  51. .exec()
  52. return subscription?.admin_id
  53. },
  54. async hasRecurlyGroupSubscription(userOrId) {
  55. const userId = SubscriptionLocator._getUserId(userOrId)
  56. return await Subscription.exists({
  57. groupPlan: true,
  58. recurlySubscription_id: { $exists: true },
  59. $or: [
  60. { member_ids: userId },
  61. { manager_ids: userId },
  62. { admin_id: userId },
  63. ],
  64. }).exec()
  65. },
  66. async getSubscription(subscriptionId) {
  67. return await Subscription.findOne({ _id: subscriptionId }).exec()
  68. },
  69. async getSubscriptionByMemberIdAndId(userId, subscriptionId) {
  70. return await Subscription.findOne(
  71. { member_ids: userId, _id: subscriptionId },
  72. { _id: 1 }
  73. ).exec()
  74. },
  75. async getGroupSubscriptionsMemberOf(userId) {
  76. return await Subscription.find(
  77. { member_ids: userId },
  78. { _id: 1, planCode: 1 }
  79. )
  80. },
  81. async getGroupsWithEmailInvite(email) {
  82. return await Subscription.find({ invited_emails: email }).exec()
  83. },
  84. async getGroupsWithTeamInvitesEmail(email) {
  85. return await Subscription.find(
  86. { teamInvites: { $elemMatch: { email } } },
  87. { teamInvites: 1 }
  88. ).exec()
  89. },
  90. async getGroupWithV1Id(v1TeamId) {
  91. return await Subscription.findOne({ 'overleaf.id': v1TeamId }).exec()
  92. },
  93. async getUserDeletedSubscriptions(userId) {
  94. return await DeletedSubscription.find({
  95. 'subscription.admin_id': userId,
  96. }).exec()
  97. },
  98. async getDeletedSubscription(subscriptionId) {
  99. return await DeletedSubscription.findOne({
  100. 'subscription._id': subscriptionId,
  101. }).exec()
  102. },
  103. async hasAiAssist(userOrId) {
  104. const userId = SubscriptionLocator._getUserId(userOrId)
  105. const subscription = await Subscription.findOne({ admin_id: userId }).exec()
  106. return Boolean(
  107. isStandaloneAiAddOnPlanCode(subscription?.planCode) ||
  108. subscription?.addOns?.some(addOn => addOn.code === AI_ADD_ON_CODE)
  109. )
  110. },
  111. _getUserId(userOrId) {
  112. if (userOrId && userOrId._id) {
  113. return userOrId._id
  114. } else if (userOrId) {
  115. return userOrId
  116. }
  117. },
  118. }
  119. module.exports = {
  120. ...callbackifyAll(SubscriptionLocator),
  121. promises: SubscriptionLocator,
  122. }