InstitutionsFeatures.mjs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { callbackifyAll } from '@overleaf/promise-utils'
  2. import UserGetter from '../User/UserGetter.mjs'
  3. import PlansLocator from '../Subscription/PlansLocator.mjs'
  4. import Settings from '@overleaf/settings'
  5. import InstitutionsGetter from './InstitutionsGetter.mjs'
  6. import FeaturesHelper from '../Subscription/FeaturesHelper.mjs'
  7. import Features from '../../infrastructure/Features.mjs'
  8. async function _getInstitutionsAddons(userId) {
  9. if (!Features.hasFeature('saas')) return {}
  10. const affiliates =
  11. await InstitutionsGetter.promises.getCurrentAffiliations(userId)
  12. // currently only addOn available to institutions is assist/WF bundle,
  13. // which is denoted by the presence of writefullCommonsAccount on the institution
  14. const hasAssistBundle = affiliates.some(
  15. affiliate => affiliate?.institution?.writefullCommonsAccount === true
  16. )
  17. return hasAssistBundle ? { aiErrorAssistant: true } : {}
  18. }
  19. async function getInstitutionsFeatures(userId) {
  20. if (!Features.hasFeature('saas')) return {}
  21. const planCode = await getInstitutionsPlan(userId)
  22. const plan = planCode && PlansLocator.findLocalPlanInSettings(planCode)
  23. let features = plan && plan.features
  24. const addOns = await _getInstitutionsAddons(userId)
  25. features = FeaturesHelper.mergeFeatures(features, addOns)
  26. return features || {}
  27. }
  28. async function getInstitutionsPlan(userId) {
  29. if (!Features.hasFeature('saas')) return null
  30. if (await hasLicence(userId)) {
  31. return Settings.institutionPlanCode
  32. }
  33. return null
  34. }
  35. async function hasLicence(userId) {
  36. if (!Features.hasFeature('saas')) return false
  37. const emailsData = await UserGetter.promises.getUserFullEmails(userId)
  38. return emailsData.some(emailData => emailData.emailHasInstitutionLicence)
  39. }
  40. const InstitutionsFeatures = {
  41. getInstitutionsFeatures,
  42. getInstitutionsPlan,
  43. hasLicence,
  44. }
  45. export default {
  46. promises: InstitutionsFeatures,
  47. ...callbackifyAll(InstitutionsFeatures),
  48. }