SubscriptionLocator.js 3.6 KB

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