Skip to content

Commit 6690c83

Browse files
fix: ensure redirects to active EnterpriseCustomerUser, where appropriate; otherwise, show 404 (#1327)
1 parent aff308f commit 6690c83

File tree

7 files changed

+23
-36
lines changed

7 files changed

+23
-36
lines changed

src/components/app/data/queries/utils.js

+1-9
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,7 @@ export function resolveBFFQuery(pathname) {
3838
* @param enterpriseSlug
3939
* @param authenticatedUser
4040
* @param queryEnterpriseLearnerConfig
41-
* @returns {
42-
* Promise<{
43-
* enterpriseCustomer,
44-
* activeEnterpriseCustomer,
45-
* allLinkedEnterpriseCustomerUsers,
46-
* staffEnterpriseCustomer,
47-
* enterpriseFeatures: *,
48-
* shouldUpdateActiveEnterpriseCustomerUser: *
49-
* }|*>}
41+
* @returns {Promise<{ data: Types.EnterpriseLearnerData, isBFFData: boolean }>}
5042
*/
5143
export async function getEnterpriseLearnerQueryData({
5244
requestUrl,

src/components/app/data/services/enterpriseCustomerUser.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ describe('fetchEnterpriseLearnerData', () => {
164164
enterpriseCustomer: expectedEnterpriseCustomer,
165165
}))
166166
.filter((ecu) => ecu.enterpriseCustomer),
167-
staffEnterpriseCustomer: isStaffUser ? expectedEnterpriseCustomer : undefined,
167+
staffEnterpriseCustomer: isStaffUser ? expectedEnterpriseCustomer : null,
168168
shouldUpdateActiveEnterpriseCustomerUser: false,
169169
});
170170
});

src/components/app/data/services/enterpriseCustomerUser.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ Promise<Types.EnterpriseLearnerData> {
7474
const { enterpriseFeatures } = enterpriseCustomerUsersResponse;
7575
// Transform enterprise customer user results
7676
const transformedEnterpriseCustomersUsers = enterpriseCustomersUsers
77+
.filter(enterpriseCustomerUser => !!enterpriseCustomerUser.enterpriseCustomer.enableLearnerPortal)
7778
.map(
7879
enterpriseCustomerUser => ({
7980
...enterpriseCustomerUser,
8081
enterpriseCustomer: transformEnterpriseCustomer(enterpriseCustomerUser.enterpriseCustomer),
8182
}),
82-
)
83-
.filter(enterpriseCustomerUser => !!enterpriseCustomerUser.enterpriseCustomer);
83+
);
8484

8585
const activeLinkedEnterpriseCustomerUser = transformedEnterpriseCustomersUsers.find(
8686
enterpriseCustomerUser => enterpriseCustomerUser.active,
@@ -91,17 +91,17 @@ Promise<Types.EnterpriseLearnerData> {
9191
// Find enterprise customer metadata for the currently viewed
9292
// enterprise slug in the page route params.
9393
const foundEnterpriseCustomerUserForCurrentSlug = transformedEnterpriseCustomersUsers.find(
94-
enterpriseCustomerUser => enterpriseCustomerUser.enterpriseCustomer?.slug === enterpriseSlug,
94+
enterpriseCustomerUser => enterpriseCustomerUser.enterpriseCustomer.slug === enterpriseSlug,
9595
);
9696

9797
// If no enterprise customer is found (i.e., authenticated user not explicitly
9898
// linked), but the authenticated user is staff, attempt to retrieve enterprise
9999
// customer metadata from the `/enterprise-customer` LMS API.
100-
let staffEnterpriseCustomer;
100+
let staffEnterpriseCustomer: Types.EnterpriseCustomer | null = null;
101101
if (getAuthenticatedUser().administrator && enterpriseSlug && !foundEnterpriseCustomerUserForCurrentSlug) {
102-
const originalStaffEnterpriseCustomer = await fetchEnterpriseCustomerForSlug(enterpriseSlug);
103-
if (originalStaffEnterpriseCustomer) {
104-
staffEnterpriseCustomer = transformEnterpriseCustomer(originalStaffEnterpriseCustomer);
102+
const staffEnterpriseCustomerResult = await fetchEnterpriseCustomerForSlug(enterpriseSlug);
103+
if (staffEnterpriseCustomerResult?.enableLearnerPortal) {
104+
staffEnterpriseCustomer = transformEnterpriseCustomer(staffEnterpriseCustomerResult);
105105
}
106106
}
107107

src/components/app/data/utils.js

-6
Original file line numberDiff line numberDiff line change
@@ -272,12 +272,6 @@ export function getAssignmentsByState(assignments = []) {
272272
* @returns
273273
*/
274274
export function transformEnterpriseCustomer(enterpriseCustomer) {
275-
// If the learner portal is not enabled for the displayed enterprise customer, return null. This
276-
// results in the enterprise learner portal not being accessible for the user, showing a 404 page.
277-
// This logic needs to be maintained for individuals checks against the enterprise customer for staff users
278-
if (!enterpriseCustomer.enableLearnerPortal) {
279-
return null;
280-
}
281275
// Otherwise, learner portal is enabled, so transform the enterprise customer data.
282276
const disableSearch = !!(
283277
!enterpriseCustomer.enableIntegratedCustomerLearnerPortalSearch

src/components/app/routes/data/utils.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,10 @@ export async function ensureActiveEnterpriseCustomerUser({
273273
allLinkedEnterpriseCustomerUsers,
274274
} = enterpriseLearnerData;
275275
const {
276+
staffEnterpriseCustomer,
276277
shouldUpdateActiveEnterpriseCustomerUser,
277278
} = enterpriseLearnerData;
279+
278280
const matchedBFFQuery = resolveBFFQuery(requestUrl.pathname);
279281
// If the enterprise slug in the URL matches the active enterprise customer user's slug OR no
280282
// active enterprise customer exists, return early.
@@ -310,9 +312,8 @@ export async function ensureActiveEnterpriseCustomerUser({
310312
try {
311313
await updateUserActiveEnterprise({ enterpriseCustomer: nextActiveEnterpriseCustomer });
312314
} catch (error) {
313-
logError(`Unable to update active enterprise customer: ${nextActiveEnterpriseCustomer}
314-
for user ${authenticatedUser.userId}
315-
${error.message}`);
315+
error.message = `Unable to update active enterprise customer: ${nextActiveEnterpriseCustomer} for user ${authenticatedUser.userId}: ${error.message}`;
316+
logError(error);
316317
return {
317318
enterpriseCustomer,
318319
allLinkedEnterpriseCustomerUsers,
@@ -345,13 +346,21 @@ export async function ensureActiveEnterpriseCustomerUser({
345346
};
346347
}
347348

349+
if (staffEnterpriseCustomer) {
350+
return {
351+
enterpriseCustomer: staffEnterpriseCustomer,
352+
allLinkedEnterpriseCustomerUsers,
353+
};
354+
}
355+
348356
// Given the user has an active ECU, but the current route has no slug, redirect to the slug of the active ECU.
349-
if (activeEnterpriseCustomer && !enterpriseSlug) {
357+
if (activeEnterpriseCustomer && activeEnterpriseCustomer.slug !== enterpriseSlug) {
350358
throw redirect(generatePath('/:enterpriseSlug/*', {
351359
enterpriseSlug: activeEnterpriseCustomer.slug,
352360
'*': requestUrl.pathname.split('/').filter(pathPart => !!pathPart).slice(1).join('/'),
353361
}));
354362
}
363+
355364
return {
356365
enterpriseCustomer,
357366
allLinkedEnterpriseCustomerUsers,

src/components/app/routes/data/utils.test.js

-8
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,6 @@ jest.mock('../../data', () => ({
1616
}));
1717

1818
describe('transformEnterpriseCustomer', () => {
19-
it('returns null with disabled learner portal', () => {
20-
const enterpriseCustomer = {
21-
enableLearnerPortal: false,
22-
};
23-
const result = transformEnterpriseCustomer(enterpriseCustomer);
24-
expect(result).toBeNull();
25-
});
26-
2719
it.each([
2820
{
2921
identityProvider: undefined,

src/components/app/routes/loaders/rootLoader.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const makeRootLoader: Types.MakeRouteLoaderFunctionWithQueryClient = function ma
3939
});
4040

4141
// User has no active, linked enterprise customer and no staff-only customer metadata exists; return early.
42-
if (!enterpriseLearnerData.enterpriseCustomer) {
42+
if (!enterpriseLearnerData.enterpriseCustomer && !enterpriseLearnerData.activeEnterpriseCustomer) {
4343
return null;
4444
}
4545

0 commit comments

Comments
 (0)