Skip to content

Commit ebecf21

Browse files
authored
Chore: Release 10.1.0 (#3148)
* Chore: app migration with feature flags (#3144)
1 parent 1099e03 commit ebecf21

File tree

9 files changed

+108
-59
lines changed

9 files changed

+108
-59
lines changed

.github/workflows/linter.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ jobs:
185185
REACT_APP_NOMINATION_PERIOD: ${{secrets.REACT_APP_NOMINATION_PERIOD}}
186186
REACT_APP_COOLDOWN_PERIOD: ${{secrets.REACT_APP_COOLDOWN_PERIOD}}
187187
REACT_APP_USAGE_TIME: ${{secrets.REACT_APP_USAGE_TIME}}
188+
REACT_APP_MIGRATION_PARAMETER: ${{secrets.REACT_APP_MIGRATION_PARAMETER}}
188189
CI: false
189190
id: builddeploy
190191
uses: Azure/[email protected]

azure-pipelines.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ extends:
190190
REACT_APP_NOMINATION_PERIOD: $(REACT_APP_NOMINATION_PERIOD)
191191
REACT_APP_COOLDOWN_PERIOD: $(REACT_APP_COOLDOWN_PERIOD)
192192
REACT_APP_USAGE_TIME: $(REACT_APP_USAGE_TIME)
193+
REACT_APP_MIGRATION_PARAMETER: $(REACT_APP_MIGRATION_PARAMETER)
193194
displayName: "Build static assets for staging"
194195
195196
- task: PowerShell@2
@@ -215,6 +216,7 @@ extends:
215216
REACT_APP_NOMINATION_PERIOD: $(REACT_APP_NOMINATION_PERIOD)
216217
REACT_APP_COOLDOWN_PERIOD: $(REACT_APP_COOLDOWN_PERIOD)
217218
REACT_APP_USAGE_TIME: $(REACT_APP_USAGE_TIME)
219+
REACT_APP_MIGRATION_PARAMETER: $(REACT_APP_MIGRATION_PARAMETER)
218220
displayName: "Build static assets for prod"
219221
220222
- task: PowerShell@2

package-lock.json

Lines changed: 32 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "graph-explorer-v2",
3-
"version": "10.0.0",
3+
"version": "10.1.0",
44
"private": true,
55
"dependencies": {
66
"@augloop/types-core": "file:packages/types-core-2.16.189.tgz",
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
export const ALWAYSSHOWBUTTONS = 'alwaysShowButtons';
1+
export const ALWAYSSHOWBUTTONS = 'alwaysShowButtons';
2+
export const SAFEROLLOUTACTIVE = 'safeRolloutActive';

src/app/services/variant-service.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/* eslint-disable max-len */
2-
import { VariantAssignmentRequest } from 'expvariantassignmentsdk/src/interfaces/VariantAssignmentRequest';
3-
import {VariantAssignmentServiceClient} from 'expvariantassignmentsdk/src/contracts/VariantAssignmentServiceClient';
2+
import { SeverityLevel } from '@microsoft/applicationinsights-web';
43
import { VariantAssignmentClientSettings } from 'expvariantassignmentsdk/src/contracts/VariantAssignmentClientSettings';
4+
import { VariantAssignmentServiceClient } from 'expvariantassignmentsdk/src/contracts/VariantAssignmentServiceClient';
5+
import { VariantAssignmentRequest } from 'expvariantassignmentsdk/src/interfaces/VariantAssignmentRequest';
6+
57
import { errorTypes, telemetry } from '../../telemetry';
68
import { readFromLocalStorage, saveToLocalStorage } from '../utils/local-storage';
79
import { EXP_URL } from './graph-constants';
8-
import { SeverityLevel } from '@microsoft/applicationinsights-web';
9-
1010

1111
interface TasResponse {
1212
Id: string;
@@ -15,6 +15,7 @@ interface TasResponse {
1515
interface Parameters {
1616
[key: string]: string | boolean | number;
1717
}
18+
1819
class VariantService {
1920

2021
private endpoint = EXP_URL;
@@ -25,21 +26,18 @@ class VariantService {
2526
const settings: VariantAssignmentClientSettings = { endpoint: this.endpoint };
2627
this.createUser();
2728
const request: VariantAssignmentRequest =
28-
{
29-
parameters: this.getParameters()
30-
};
29+
{
30+
parameters: this.getParameters()
31+
};
3132

3233
const client = new VariantAssignmentServiceClient(settings);
33-
const response = await client.getVariantAssignments(request);
34-
Promise.resolve(response).then((r) => {
35-
if (r){
36-
this.expResponse = r.featureVariables as TasResponse[] | null;
37-
this.assignmentContext = r.assignmentContext;
38-
}
39-
})
40-
.catch((error) => {
41-
telemetry.trackException(new Error(errorTypes.UNHANDLED_ERROR), SeverityLevel.Error, error);
42-
});
34+
try {
35+
const response = await client.getVariantAssignments(request);
36+
this.expResponse = response.featureVariables as TasResponse[] | null;
37+
this.assignmentContext = response.assignmentContext;
38+
} catch (error) {
39+
telemetry.trackException(new Error(errorTypes.UNHANDLED_ERROR), SeverityLevel.Error, error as object);
40+
}
4341
}
4442

4543
public createUser() {
@@ -51,7 +49,7 @@ class VariantService {
5149
return this.assignmentContext;
5250
}
5351

54-
public async getFeatureVariables(namespace: string, flagname: string) {
52+
public getFeatureVariables(namespace: string, flagname: string) {
5553
const defaultConfig = this.expResponse?.find(c => c.Id === namespace);
5654
return defaultConfig?.Parameters[flagname];
5755
}

src/modules/authentication/AuthenticationWrapper.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import {
1111
DEFAULT_USER_SCOPES,
1212
HOME_ACCOUNT_KEY
1313
} from '../../app/services/graph-constants';
14-
import { signInAuthError } from './authentication-error-hints';
14+
import { SAFEROLLOUTACTIVE } from '../../app/services/variant-constants';
15+
import variantService from '../../app/services/variant-service';
1516
import { geLocale } from '../../appLocale';
17+
import { IQuery } from '../../types/query-runner';
18+
import { ClaimsChallenge } from './ClaimsChallenge';
1619
import { getCurrentUri } from './authUtils';
20+
import { signInAuthError } from './authentication-error-hints';
1721
import IAuthenticationWrapper from './interfaces/IAuthenticationWrapper';
1822
import { msalApplication } from './msal-app';
19-
import { IQuery } from '../../types/query-runner';
20-
import { ClaimsChallenge } from './ClaimsChallenge';
2123

2224
const defaultScopes = DEFAULT_USER_SCOPES.split(' ');
2325

@@ -73,7 +75,7 @@ export class AuthenticationWrapper implements IAuthenticationWrapper {
7375
authority: this.getAuthority(),
7476
prompt: 'select_account',
7577
redirectUri: getCurrentUri(),
76-
extraQueryParameters: { mkt: geLocale }
78+
extraQueryParameters: getExtraQueryParameters()
7779
};
7880
try {
7981
const result = await msalApplication.loginPopup(popUpRequest);
@@ -205,7 +207,7 @@ export class AuthenticationWrapper implements IAuthenticationWrapper {
205207
authority: this.getAuthority(),
206208
prompt: 'select_account',
207209
redirectUri: getCurrentUri(),
208-
extraQueryParameters: { mkt: geLocale },
210+
extraQueryParameters: getExtraQueryParameters(),
209211
claims: this.getClaims()
210212
};
211213

@@ -297,3 +299,20 @@ export class AuthenticationWrapper implements IAuthenticationWrapper {
297299
window.sessionStorage.clear();
298300
}
299301
}
302+
303+
function getExtraQueryParameters(): { [key: string]: string } {
304+
const params: { [key: string]: string } = {
305+
mkt: geLocale
306+
};
307+
getSafeRolloutParameter(params);
308+
return params;
309+
}
310+
311+
function getSafeRolloutParameter(params: { [key: string]: string; }) {
312+
const safeRolloutActive = variantService.getFeatureVariables('default', SAFEROLLOUTACTIVE);
313+
const migrationParam = process.env.REACT_APP_MIGRATION_PARAMETER;
314+
if (safeRolloutActive && migrationParam) {
315+
params.safe_rollout = migrationParam;
316+
}
317+
}
318+

src/modules/authentication/msal-app.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Configuration, PublicClientApplication } from '@azure/msal-browser';
1+
import { Configuration, LogLevel, PublicClientApplication } from '@azure/msal-browser';
2+
import { eventTypes, telemetry } from '../../telemetry';
23

34
function getClientIdFromWindow() {
45
return (window as any).ClientId;
@@ -19,10 +20,36 @@ export const configuration: Configuration = {
1920
cacheLocation: 'localStorage',
2021
storeAuthStateInCookie: true,
2122
claimsBasedCachingEnabled: true
23+
},
24+
system: {
25+
loggerOptions: {
26+
logLevel: LogLevel.Verbose,
27+
loggerCallback: (level, message, containsPii) => {
28+
if (containsPii) {
29+
return;
30+
}
31+
telemetry.trackEvent(eventTypes.AUTH_REQUEST_EVENT, { message, level });
32+
switch (level) {
33+
case LogLevel.Error:
34+
console.error('[MSAL]', message);
35+
return;
36+
case LogLevel.Info:
37+
console.info('[MSAL]', message);
38+
return;
39+
case LogLevel.Verbose:
40+
console.debug('[MSAL]', message);
41+
return;
42+
case LogLevel.Warning:
43+
console.warn('[MSAL]', message);
44+
return;
45+
}
46+
},
47+
piiLoggingEnabled: false
48+
}
2249
}
2350
};
2451

2552

2653
const msalApplication = new PublicClientApplication(configuration);
2754
msalApplication.initialize();
28-
export{ msalApplication };
55+
export { msalApplication };

src/telemetry/event-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export const LISTITEM_CLICK_EVENT = 'LISTITEM_CLICK_EVENT';
77
export const DROPDOWN_CHANGE_EVENT = 'DROPDOWN_CHANGE_EVENT';
88
export const WINDOW_OPEN_EVENT = 'WINDOW_OPEN_EVENT';
99
export const KEYBOARD_COPY_EVENT = 'KEYBOARD_COPY_EVENT';
10+
export const AUTH_REQUEST_EVENT = 'AUTH_REQUEST_EVENT';

0 commit comments

Comments
 (0)