Merge pull request #14178 from overleaf/mf-admin-email-managed-group-alert

Add managed group admin email inside managed group alert on the subscription page & team invite page warning

GitOrigin-RevId: 00929008170ef9302ddcbbf10aefd76f95e189a8
This commit is contained in:
M Fahru 2023-08-09 11:50:19 -07:00 committed by Copybot
parent 34aec8f8be
commit a3e30c0a39
8 changed files with 66 additions and 5 deletions

View file

@ -40,6 +40,17 @@ const SubscriptionLocator = {
.exec(callback)
},
getAdminEmail(subscriptionId, callback) {
Subscription.findById(subscriptionId)
.populate('admin_id', 'email')
.exec((err, subscription) => {
if (err) {
return callback(err)
}
callback(err, subscription?.admin_id?.email)
})
},
getAdminEmailAndName(subscriptionId, callback) {
Subscription.findById(subscriptionId)
.populate('admin_id', ['email', 'first_name', 'last_name'])
@ -122,6 +133,7 @@ SubscriptionLocator.promises = {
SubscriptionLocator.getManagedGroupSubscriptions
),
getMemberSubscriptions: promisify(SubscriptionLocator.getMemberSubscriptions),
getAdminEmail: promisify(SubscriptionLocator.getAdminEmail),
getAdminEmailAndName: promisify(SubscriptionLocator.getAdminEmailAndName),
getSubscription: promisify(SubscriptionLocator.getSubscription),
getSubscriptionByMemberIdAndId: promisify(

View file

@ -1,4 +1,5 @@
const settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
const TeamInvitesHandler = require('./TeamInvitesHandler')
const SessionManager = require('../Authentication/SessionManager')
const SubscriptionLocator = require('./SubscriptionLocator')
@ -106,6 +107,14 @@ async function viewInvite(req, res, next) {
validationStatus: Object.fromEntries(validationStatus),
})
} else {
let currentManagedUserAdminEmail
try {
currentManagedUserAdminEmail =
await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
} catch (err) {
logger.error({ err }, 'error getting subscription admin email')
}
return res.render('subscriptions/team/invite', {
inviterName: invite.inviterName,
inviteToken: invite.token,
@ -113,6 +122,7 @@ async function viewInvite(req, res, next) {
appName: settings.appName,
expired: req.query.expired,
userRestrictions: Array.from(req.userRestrictions || []),
currentManagedUserAdminEmail,
})
}
} else {

View file

@ -6,6 +6,7 @@ const Settings = require('@overleaf/settings')
const AuthenticationController = require('../Authentication/AuthenticationController')
const SessionManager = require('../Authentication/SessionManager')
const NewsletterManager = require('../Newsletter/NewsletterManager')
const SubscriptionLocator = require('../Subscription/SubscriptionLocator')
const _ = require('lodash')
const { expressify } = require('../../util/promises')
const Features = require('../../infrastructure/Features')
@ -81,6 +82,14 @@ async function settingsPage(req, res) {
}
}
let currentManagedUserAdminEmail
try {
currentManagedUserAdminEmail =
await SubscriptionLocator.promises.getAdminEmail(req.managedBy)
} catch (err) {
logger.error({ err }, 'error getting subscription admin email')
}
res.render('user/settings', {
title: 'account_settings',
user: {
@ -128,6 +137,7 @@ async function settingsPage(req, res) {
emailAddressLimit: Settings.emailAddressLimit,
isManagedAccount: !!req.managedBy,
userRestrictions: Array.from(req.userRestrictions || []),
currentManagedUserAdminEmail,
})
}

View file

@ -20,7 +20,7 @@ block content
div(ng-show="view =='restrictedByManagedGroup'")
.alert.alert-info #{translate("restricted")}
p #{translate("account_managed_by_group_administrator")}
p #{translate("account_managed_by_group_administrator", {admin: currentManagedUserAdminEmail})}
div(ng-show="view =='hasIndividualRecurlySubscription'")
p #{translate("cancel_personal_subscription_first")}

View file

@ -25,6 +25,7 @@ block append meta
meta(name="ol-showPersonalAccessToken", data-type="boolean" content=showPersonalAccessToken)
meta(name="ol-personalAccessTokens", data-type="json" content=personalAccessTokens)
meta(name="ol-emailAddressLimit", data-type="json", content=emailAddressLimit)
meta(name="ol-currentManagedUserAdminEmail" data-type="string" content=currentManagedUserAdminEmail)
block content
main.content.content-alt#settings-page-root

View file

@ -1,9 +1,12 @@
import { Trans, useTranslation } from 'react-i18next'
import { Trans } from 'react-i18next'
import getMeta from '../../../utils/meta'
export default function ManagedAccountAlert() {
const { t } = useTranslation()
const isManaged = getMeta('ol-isManagedAccount', false)
const currentManagedUserAdminEmail: string = getMeta(
'ol-currentManagedUserAdminEmail',
''
)
if (!isManaged) {
return null
@ -16,7 +19,14 @@ export default function ManagedAccountAlert() {
</div>
<div>
<div>
<strong>{t('account_managed_by_group_administrator')}</strong>
<strong>
<Trans
i18nKey="account_managed_by_group_administrator"
values={{
admin: currentManagedUserAdminEmail,
}}
/>
</strong>
</div>
<div>
<Trans

View file

@ -39,7 +39,7 @@
"account_has_been_link_to_institution_account": "Your __appName__ account on <b>__email__</b> has been linked to your <b>__institutionName__</b> institutional account.",
"account_has_past_due_invoice_change_plan_warning": "Your account currently has a past due invoice. You will not be able to change your plan until this is resolved.",
"account_linking": "Account Linking",
"account_managed_by_group_administrator": "Your account is managed by your group administrator",
"account_managed_by_group_administrator": "Your account is managed by your group administrator (__admin__)",
"account_not_linked_to_dropbox": "Your account is not linked to Dropbox",
"account_settings": "Account Settings",
"account_with_email_exists": "It looks like an <b>__appName__</b> account with the email <b>__email__</b> already exists.",

View file

@ -48,6 +48,10 @@ describe('UserPagesController', function () {
zotero: { encrypted: 'bbbb' },
},
}
this.adminEmail = 'group-admin-email@overleaf.com'
this.subscriptionViewModel = {
memberGroupSubscriptions: [],
}
this.UserGetter = {
getUser: sinon.stub(),
@ -73,6 +77,11 @@ describe('UserPagesController', function () {
this.PersonalAccessTokenManager = {
listTokens: sinon.stub().returns([]),
}
this.SubscriptionLocator = {
promises: {
getAdminEmail: sinon.stub().returns(this.adminEmail),
},
}
this.UserPagesController = SandboxedModule.require(modulePath, {
requires: {
'@overleaf/settings': this.settings,
@ -82,6 +91,7 @@ describe('UserPagesController', function () {
'../Errors/ErrorController': this.ErrorController,
'../Authentication/AuthenticationController':
this.AuthenticationController,
'../Subscription/SubscriptionLocator': this.SubscriptionLocator,
'../../infrastructure/Features': this.Features,
'../../../../modules/oauth2-server/app/src/OAuthPersonalAccessTokenManager':
this.PersonalAccessTokenManager,
@ -325,6 +335,14 @@ describe('UserPagesController', function () {
return this.UserPagesController.settingsPage(this.req, this.res)
})
it('should send the correct managed user admin email', function (done) {
this.res.render = (page, opts) => {
expect(opts.currentManagedUserAdminEmail).to.equal(this.adminEmail)
return done()
}
return this.UserPagesController.settingsPage(this.req, this.res)
})
describe('when ldap.updateUserDetailsOnLogin is true', function () {
beforeEach(function () {
return (this.settings.ldap = { updateUserDetailsOnLogin: true })