|
@@ -1,34 +1,16 @@
|
|
|
-/* eslint-disable
|
|
|
|
|
- node/handle-callback-err,
|
|
|
|
|
- max-len,
|
|
|
|
|
- no-return-assign,
|
|
|
|
|
- no-unused-vars,
|
|
|
|
|
-*/
|
|
|
|
|
-// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
|
-// Fix any style issues and re-enable lint.
|
|
|
|
|
-/*
|
|
|
|
|
- * decaffeinate suggestions:
|
|
|
|
|
- * DS101: Remove unnecessary use of Array.from
|
|
|
|
|
- * DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
|
- * DS103: Rewrite code to no longer use __guard__
|
|
|
|
|
- * DS207: Consider shorter variations of null checks
|
|
|
|
|
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
|
- */
|
|
|
|
|
const Settings = require('settings-sharelatex')
|
|
const Settings = require('settings-sharelatex')
|
|
|
const RecurlyWrapper = require('./RecurlyWrapper')
|
|
const RecurlyWrapper = require('./RecurlyWrapper')
|
|
|
const PlansLocator = require('./PlansLocator')
|
|
const PlansLocator = require('./PlansLocator')
|
|
|
const SubscriptionFormatters = require('./SubscriptionFormatters')
|
|
const SubscriptionFormatters = require('./SubscriptionFormatters')
|
|
|
-const LimitationsManager = require('./LimitationsManager')
|
|
|
|
|
const SubscriptionLocator = require('./SubscriptionLocator')
|
|
const SubscriptionLocator = require('./SubscriptionLocator')
|
|
|
const V1SubscriptionManager = require('./V1SubscriptionManager')
|
|
const V1SubscriptionManager = require('./V1SubscriptionManager')
|
|
|
const InstitutionsGetter = require('../Institutions/InstitutionsGetter')
|
|
const InstitutionsGetter = require('../Institutions/InstitutionsGetter')
|
|
|
const PublishersGetter = require('../Publishers/PublishersGetter')
|
|
const PublishersGetter = require('../Publishers/PublishersGetter')
|
|
|
const sanitizeHtml = require('sanitize-html')
|
|
const sanitizeHtml = require('sanitize-html')
|
|
|
-const logger = require('logger-sharelatex')
|
|
|
|
|
const _ = require('underscore')
|
|
const _ = require('underscore')
|
|
|
const async = require('async')
|
|
const async = require('async')
|
|
|
|
|
|
|
|
-const buildHostedLink = function(recurlySubscription, type) {
|
|
|
|
|
|
|
+function buildHostedLink(recurlySubscription, type) {
|
|
|
const recurlySubdomain = Settings.apis.recurly.subdomain
|
|
const recurlySubdomain = Settings.apis.recurly.subdomain
|
|
|
const hostedLoginToken = recurlySubscription.account.hosted_login_token
|
|
const hostedLoginToken = recurlySubscription.account.hosted_login_token
|
|
|
let path = ''
|
|
let path = ''
|
|
@@ -48,28 +30,22 @@ const buildHostedLink = function(recurlySubscription, type) {
|
|
|
|
|
|
|
|
module.exports = {
|
|
module.exports = {
|
|
|
buildUsersSubscriptionViewModel(user, callback) {
|
|
buildUsersSubscriptionViewModel(user, callback) {
|
|
|
- if (callback == null) {
|
|
|
|
|
- callback = function(error, data) {}
|
|
|
|
|
- }
|
|
|
|
|
- return async.auto(
|
|
|
|
|
|
|
+ async.auto(
|
|
|
{
|
|
{
|
|
|
personalSubscription(cb) {
|
|
personalSubscription(cb) {
|
|
|
- return SubscriptionLocator.getUsersSubscription(user, cb)
|
|
|
|
|
|
|
+ SubscriptionLocator.getUsersSubscription(user, cb)
|
|
|
},
|
|
},
|
|
|
recurlySubscription: [
|
|
recurlySubscription: [
|
|
|
'personalSubscription',
|
|
'personalSubscription',
|
|
|
- function(cb, { personalSubscription }) {
|
|
|
|
|
|
|
+ (cb, { personalSubscription }) => {
|
|
|
if (
|
|
if (
|
|
|
- (personalSubscription != null
|
|
|
|
|
- ? personalSubscription.recurlySubscription_id
|
|
|
|
|
- : undefined) == null ||
|
|
|
|
|
- (personalSubscription != null
|
|
|
|
|
- ? personalSubscription.recurlySubscription_id
|
|
|
|
|
- : undefined) === ''
|
|
|
|
|
|
|
+ personalSubscription == null ||
|
|
|
|
|
+ personalSubscription.recurlySubscription_id == null ||
|
|
|
|
|
+ personalSubscription.recurlySubscription_id === ''
|
|
|
) {
|
|
) {
|
|
|
return cb(null, null)
|
|
return cb(null, null)
|
|
|
}
|
|
}
|
|
|
- return RecurlyWrapper.getSubscription(
|
|
|
|
|
|
|
+ RecurlyWrapper.getSubscription(
|
|
|
personalSubscription.recurlySubscription_id,
|
|
personalSubscription.recurlySubscription_id,
|
|
|
{ includeAccount: true },
|
|
{ includeAccount: true },
|
|
|
cb
|
|
cb
|
|
@@ -78,17 +54,17 @@ module.exports = {
|
|
|
],
|
|
],
|
|
|
recurlyCoupons: [
|
|
recurlyCoupons: [
|
|
|
'recurlySubscription',
|
|
'recurlySubscription',
|
|
|
- function(cb, { recurlySubscription }) {
|
|
|
|
|
|
|
+ (cb, { recurlySubscription }) => {
|
|
|
if (!recurlySubscription) {
|
|
if (!recurlySubscription) {
|
|
|
return cb(null, null)
|
|
return cb(null, null)
|
|
|
}
|
|
}
|
|
|
const accountId = recurlySubscription.account.account_code
|
|
const accountId = recurlySubscription.account.account_code
|
|
|
- return RecurlyWrapper.getAccountActiveCoupons(accountId, cb)
|
|
|
|
|
|
|
+ RecurlyWrapper.getAccountActiveCoupons(accountId, cb)
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|
|
|
plan: [
|
|
plan: [
|
|
|
'personalSubscription',
|
|
'personalSubscription',
|
|
|
- function(cb, { personalSubscription }) {
|
|
|
|
|
|
|
+ (cb, { personalSubscription }) => {
|
|
|
if (personalSubscription == null) {
|
|
if (personalSubscription == null) {
|
|
|
return cb()
|
|
return cb()
|
|
|
}
|
|
}
|
|
@@ -102,38 +78,38 @@ module.exports = {
|
|
|
)
|
|
)
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
- return cb(null, plan)
|
|
|
|
|
|
|
+ cb(null, plan)
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|
|
|
memberGroupSubscriptions(cb) {
|
|
memberGroupSubscriptions(cb) {
|
|
|
- return SubscriptionLocator.getMemberSubscriptions(user, cb)
|
|
|
|
|
|
|
+ SubscriptionLocator.getMemberSubscriptions(user, cb)
|
|
|
},
|
|
},
|
|
|
managedGroupSubscriptions(cb) {
|
|
managedGroupSubscriptions(cb) {
|
|
|
- return SubscriptionLocator.getManagedGroupSubscriptions(user, cb)
|
|
|
|
|
|
|
+ SubscriptionLocator.getManagedGroupSubscriptions(user, cb)
|
|
|
},
|
|
},
|
|
|
confirmedMemberAffiliations(cb) {
|
|
confirmedMemberAffiliations(cb) {
|
|
|
- return InstitutionsGetter.getConfirmedAffiliations(user._id, cb)
|
|
|
|
|
|
|
+ InstitutionsGetter.getConfirmedAffiliations(user._id, cb)
|
|
|
},
|
|
},
|
|
|
managedInstitutions(cb) {
|
|
managedInstitutions(cb) {
|
|
|
- return InstitutionsGetter.getManagedInstitutions(user._id, cb)
|
|
|
|
|
|
|
+ InstitutionsGetter.getManagedInstitutions(user._id, cb)
|
|
|
},
|
|
},
|
|
|
managedPublishers(cb) {
|
|
managedPublishers(cb) {
|
|
|
- return PublishersGetter.getManagedPublishers(user._id, cb)
|
|
|
|
|
|
|
+ PublishersGetter.getManagedPublishers(user._id, cb)
|
|
|
},
|
|
},
|
|
|
v1SubscriptionStatus(cb) {
|
|
v1SubscriptionStatus(cb) {
|
|
|
- return V1SubscriptionManager.getSubscriptionStatusFromV1(
|
|
|
|
|
|
|
+ V1SubscriptionManager.getSubscriptionStatusFromV1(
|
|
|
user._id,
|
|
user._id,
|
|
|
- function(error, status, v1Id) {
|
|
|
|
|
- if (error != null) {
|
|
|
|
|
|
|
+ (error, status, v1Id) => {
|
|
|
|
|
+ if (error) {
|
|
|
return cb(error)
|
|
return cb(error)
|
|
|
}
|
|
}
|
|
|
- return cb(null, status)
|
|
|
|
|
|
|
+ cb(null, status)
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- function(err, results) {
|
|
|
|
|
- if (err != null) {
|
|
|
|
|
|
|
+ (err, results) => {
|
|
|
|
|
+ if (err) {
|
|
|
return callback(err)
|
|
return callback(err)
|
|
|
}
|
|
}
|
|
|
let {
|
|
let {
|
|
@@ -168,9 +144,8 @@ module.exports = {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
if (
|
|
|
- (personalSubscription != null
|
|
|
|
|
- ? personalSubscription.toObject
|
|
|
|
|
- : undefined) != null
|
|
|
|
|
|
|
+ personalSubscription &&
|
|
|
|
|
+ typeof personalSubscription.toObject === 'function'
|
|
|
) {
|
|
) {
|
|
|
// Downgrade from Mongoose object, so we can add a recurly and plan attribute
|
|
// Downgrade from Mongoose object, so we can add a recurly and plan attribute
|
|
|
personalSubscription = personalSubscription.toObject()
|
|
personalSubscription = personalSubscription.toObject()
|
|
@@ -180,15 +155,13 @@ module.exports = {
|
|
|
personalSubscription.plan = plan
|
|
personalSubscription.plan = plan
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (personalSubscription != null && recurlySubscription != null) {
|
|
|
|
|
- const tax =
|
|
|
|
|
- (recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.tax_in_cents
|
|
|
|
|
- : undefined) || 0
|
|
|
|
|
|
|
+ if (personalSubscription && recurlySubscription) {
|
|
|
|
|
+ const tax = recurlySubscription.tax_in_cents || 0
|
|
|
// Some plans allow adding more seats than the base plan provides.
|
|
// Some plans allow adding more seats than the base plan provides.
|
|
|
// This is recorded as a subscription add on.
|
|
// This is recorded as a subscription add on.
|
|
|
// Note: tax_in_cents already includes the tax for any addon.
|
|
// Note: tax_in_cents already includes the tax for any addon.
|
|
|
let addOnPrice = 0
|
|
let addOnPrice = 0
|
|
|
|
|
+ let additionalLicenses = 0
|
|
|
if (
|
|
if (
|
|
|
plan.membersLimitAddOn &&
|
|
plan.membersLimitAddOn &&
|
|
|
Array.isArray(recurlySubscription.subscription_add_ons)
|
|
Array.isArray(recurlySubscription.subscription_add_ons)
|
|
@@ -196,18 +169,15 @@ module.exports = {
|
|
|
recurlySubscription.subscription_add_ons.forEach(addOn => {
|
|
recurlySubscription.subscription_add_ons.forEach(addOn => {
|
|
|
if (addOn.add_on_code === plan.membersLimitAddOn) {
|
|
if (addOn.add_on_code === plan.membersLimitAddOn) {
|
|
|
addOnPrice += addOn.quantity * addOn.unit_amount_in_cents
|
|
addOnPrice += addOn.quantity * addOn.unit_amount_in_cents
|
|
|
|
|
+ additionalLicenses += addOn.quantity
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
+ const totalLicenses = (plan.membersLimit || 0) + additionalLicenses
|
|
|
personalSubscription.recurly = {
|
|
personalSubscription.recurly = {
|
|
|
tax,
|
|
tax,
|
|
|
taxRate: parseFloat(
|
|
taxRate: parseFloat(
|
|
|
- __guard__(
|
|
|
|
|
- recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.tax_rate
|
|
|
|
|
- : undefined,
|
|
|
|
|
- x => x._
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ recurlySubscription.tax_rate && recurlySubscription.tax_rate._
|
|
|
),
|
|
),
|
|
|
billingDetailsLink: buildHostedLink(
|
|
billingDetailsLink: buildHostedLink(
|
|
|
recurlySubscription,
|
|
recurlySubscription,
|
|
@@ -215,26 +185,18 @@ module.exports = {
|
|
|
),
|
|
),
|
|
|
accountManagementLink: buildHostedLink(recurlySubscription),
|
|
accountManagementLink: buildHostedLink(recurlySubscription),
|
|
|
price: SubscriptionFormatters.formatPrice(
|
|
price: SubscriptionFormatters.formatPrice(
|
|
|
- (recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.unit_amount_in_cents
|
|
|
|
|
- : undefined) +
|
|
|
|
|
- addOnPrice +
|
|
|
|
|
- tax,
|
|
|
|
|
- recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.currency
|
|
|
|
|
- : undefined
|
|
|
|
|
|
|
+ recurlySubscription.unit_amount_in_cents + addOnPrice + tax,
|
|
|
|
|
+ recurlySubscription.currency
|
|
|
),
|
|
),
|
|
|
|
|
+ additionalLicenses,
|
|
|
|
|
+ totalLicenses,
|
|
|
nextPaymentDueAt: SubscriptionFormatters.formatDate(
|
|
nextPaymentDueAt: SubscriptionFormatters.formatDate(
|
|
|
- recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.current_period_ends_at
|
|
|
|
|
- : undefined
|
|
|
|
|
|
|
+ recurlySubscription.current_period_ends_at
|
|
|
),
|
|
),
|
|
|
currency: recurlySubscription.currency,
|
|
currency: recurlySubscription.currency,
|
|
|
state: recurlySubscription.state,
|
|
state: recurlySubscription.state,
|
|
|
trialEndsAtFormatted: SubscriptionFormatters.formatDate(
|
|
trialEndsAtFormatted: SubscriptionFormatters.formatDate(
|
|
|
- recurlySubscription != null
|
|
|
|
|
- ? recurlySubscription.trial_ends_at
|
|
|
|
|
- : undefined
|
|
|
|
|
|
|
+ recurlySubscription.trial_ends_at
|
|
|
),
|
|
),
|
|
|
trial_ends_at: recurlySubscription.trial_ends_at,
|
|
trial_ends_at: recurlySubscription.trial_ends_at,
|
|
|
activeCoupons: recurlyCoupons,
|
|
activeCoupons: recurlyCoupons,
|
|
@@ -242,9 +204,7 @@ module.exports = {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for (let memberGroupSubscription of Array.from(
|
|
|
|
|
- memberGroupSubscriptions
|
|
|
|
|
- )) {
|
|
|
|
|
|
|
+ for (const memberGroupSubscription of memberGroupSubscriptions) {
|
|
|
if (memberGroupSubscription.teamNotice) {
|
|
if (memberGroupSubscription.teamNotice) {
|
|
|
memberGroupSubscription.teamNotice = sanitizeHtml(
|
|
memberGroupSubscription.teamNotice = sanitizeHtml(
|
|
|
memberGroupSubscription.teamNotice
|
|
memberGroupSubscription.teamNotice
|
|
@@ -252,7 +212,7 @@ module.exports = {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return callback(null, {
|
|
|
|
|
|
|
+ callback(null, {
|
|
|
personalSubscription,
|
|
personalSubscription,
|
|
|
managedGroupSubscriptions,
|
|
managedGroupSubscriptions,
|
|
|
memberGroupSubscriptions,
|
|
memberGroupSubscriptions,
|
|
@@ -308,9 +268,3 @@ module.exports = {
|
|
|
return result
|
|
return result
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-function __guard__(value, transform) {
|
|
|
|
|
- return typeof value !== 'undefined' && value !== null
|
|
|
|
|
- ? transform(value)
|
|
|
|
|
- : undefined
|
|
|
|
|
-}
|
|
|