Skip to content

Commit 3876e84

Browse files
author
Shailesh Pachbhai
authored
Merge pull request #288 from RedisBot/madhur.singhal/disableRollBackFlagsPrefAddition-new-correct
feat: added utility class to enable rollback flags disable pref
2 parents ced6295 + 1c85f26 commit 3876e84

File tree

14 files changed

+360
-15
lines changed

14 files changed

+360
-15
lines changed

src/commands/omnistudio/migration/assess.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { DebugTimer } from '../../../utils';
1111
import { Logger } from '../../../utils/logger';
1212
import OmnistudioRelatedObjectMigrationFacade from '../../../migration/related/OmnistudioRelatedObjectMigrationFacade';
1313
import { OmnistudioOrgDetails, OrgUtils } from '../../../utils/orgUtils';
14+
import { OrgPreferences } from '../../../utils/orgpreferences';
1415
import { Constants } from '../../../utils/constants/stringContants';
1516

1617
Messages.importMessagesDirectory(__dirname);
@@ -108,7 +109,11 @@ export default class Assess extends OmniStudioBaseCommand {
108109
assesmentInfo.lwcAssessmentInfos = relatedObjectAssessmentResult.lwcAssessmentInfos;
109110
assesmentInfo.apexAssessmentInfos = relatedObjectAssessmentResult.apexAssessmentInfos;
110111
}
111-
112+
try {
113+
orgs.rollbackFlags = await OrgPreferences.checkRollbackFlags(conn);
114+
} catch (error) {
115+
this.ux.log(error.message);
116+
}
112117
await AssessmentReporter.generate(assesmentInfo, conn.instanceUrl, orgs, assessOnly, objectsToProcess);
113118
return assesmentInfo;
114119
}

src/commands/omnistudio/migration/migrate.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import OmnistudioRelatedObjectMigrationFacade from '../../../migration/related/O
2323
import { generatePackageXml } from '../../../utils/generatePackageXml';
2424
import { OmnistudioOrgDetails, OrgUtils } from '../../../utils/orgUtils';
2525
import { Constants } from '../../../utils/constants/stringContants';
26+
import { OrgPreferences } from '../../../utils/orgpreferences';
2627

2728
// Initialize Messages with the current plugin directory
2829
Messages.importMessagesDirectory(__dirname);
@@ -67,6 +68,7 @@ export default class Migrate extends OmniStudioBaseCommand {
6768

6869
Logger.initialiseLogger(this.ux, this.logger);
6970
this.logger = Logger.logger;
71+
7072
// this.org is guaranteed because requiresUsername=true, as opposed to supportsUsername
7173
const conn = this.org.getConnection();
7274
conn.setApiVersion(apiVersion);
@@ -87,6 +89,15 @@ export default class Migrate extends OmniStudioBaseCommand {
8789
return;
8890
}
8991

92+
// Enable Omni preferences
93+
try {
94+
orgs.rollbackFlags = await OrgPreferences.checkRollbackFlags(conn);
95+
await OrgPreferences.enableOmniPreferences(conn);
96+
} catch (error) {
97+
const errMsg = error instanceof Error ? error.message : String(error);
98+
this.ux.log(`Could not enable Omni preferences: ${errMsg}`);
99+
}
100+
90101
const namespace = orgs.packageDetails.namespace;
91102
// Let's time every step
92103
DebugTimer.getInstance().start();

src/utils/interfaces.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,23 @@ export interface oldNew {
144144
old: string;
145145
new: string;
146146
}
147+
148+
export interface OmniStudioSettingsMetadata {
149+
fullName: string;
150+
disableRollbackFlagsPref: boolean;
151+
}
152+
153+
export interface QueryResult {
154+
DeveloperName: string;
155+
Value: string;
156+
totalSize: number;
157+
done: boolean;
158+
records: Array<{
159+
attributes: {
160+
type: string;
161+
url: string;
162+
};
163+
DeveloperName: string;
164+
Value: string;
165+
}>
166+
}

src/utils/orgPreferences.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { Connection } from '@salesforce/core';
2+
import { OmniStudioSettingsMetadata, QueryResult } from './interfaces';
3+
4+
/**
5+
* Class to manage OmniStudio organization preferences
6+
*
7+
* @class OrgPreferences
8+
* @description Provides functionality to enable OmniStudio preferences and check rollback flags
9+
*/
10+
export class OrgPreferences {
11+
/**
12+
* List of rollback flags to check in OmniInteractionConfig
13+
*
14+
* @private
15+
* @static
16+
* @readonly
17+
* @type {string[]}
18+
*/
19+
private static readonly ROLLBACK_FLAGS: string[] = ['RollbackIPChanges', 'RollbackDRChanges', 'RollbackOSChanges'];
20+
21+
/**
22+
* Enables the disableRollbackFlagsPref setting in OmniStudio
23+
*
24+
* @public
25+
* @static
26+
* @async
27+
* @param {Connection} connection - Salesforce connection instance
28+
* @throws {Error} If enabling the preference fails
29+
* @returns {Promise<void>}
30+
*/
31+
public static async enableOmniPreferences(connection: Connection): Promise<void> {
32+
try {
33+
await connection.metadata.update('OmniStudioSettings', [
34+
{
35+
fullName: 'OmniStudio',
36+
disableRollbackFlagsPref: true,
37+
} as OmniStudioSettingsMetadata,
38+
]);
39+
} catch (error) {
40+
throw new Error(
41+
`Failed to enable disableRollbackFlagsPref: ${error instanceof Error ? error.message : String(error)}`
42+
);
43+
}
44+
}
45+
46+
/**
47+
* Checks which rollback flags are enabled in OmniInteractionConfig
48+
*
49+
* @public
50+
* @static
51+
* @async
52+
* @param {Connection} connection - Salesforce connection instance
53+
* @throws {Error} If checking rollback flags fails
54+
* @returns {Promise<string[]>} Array of enabled rollback flag names
55+
*/
56+
public static async checkRollbackFlags(connection: Connection): Promise<string[]> {
57+
try {
58+
const result = await connection.query<QueryResult>(
59+
`SELECT DeveloperName, Value FROM OmniInteractionConfig WHERE DeveloperName IN ('${this.ROLLBACK_FLAGS.join(
60+
"','"
61+
)}')`
62+
);
63+
const enabledFlags: string[] = [];
64+
for (const record of result.records) {
65+
if (record.Value === 'true') {
66+
enabledFlags.push(record.DeveloperName);
67+
}
68+
}
69+
return enabledFlags;
70+
} catch (error) {
71+
throw new Error(`Failed to check rollback flags: ${error instanceof Error ? error.message : String(error)}`);
72+
}
73+
}
74+
}

src/utils/orgUtils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface OmnistudioOrgDetails {
2121
orgDetails: OrgDetails;
2222
dataModel: string;
2323
hasValidNamespace: boolean;
24+
rollbackFlags?: string[];
2425
}
2526

2627
export interface PackageDetail {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
.rollback-flags-section {
2+
margin: 20px 0;
3+
padding: 16px 24px;
4+
background-color: #fff3e0;
5+
border: 1px solid #ffb74d;
6+
border-radius: 6px;
7+
display: flex;
8+
align-items: flex-start;
9+
gap: 16px;
10+
}
11+
12+
.rollback-flags-icon {
13+
flex-shrink: 0;
14+
margin-top: 2px;
15+
}
16+
17+
.rollback-flags-content {
18+
flex: 1;
19+
}
20+
21+
.rollback-flags-header {
22+
font-size: 1.1rem;
23+
font-weight: 600;
24+
color: #e65100;
25+
margin-bottom: 8px;
26+
display: flex;
27+
align-items: center;
28+
}
29+
30+
.rollback-flags-list {
31+
list-style-type: disc;
32+
margin-left: 20px;
33+
color: #e65100;
34+
}
35+
36+
.rollback-flags-list li {
37+
margin: 5px 0;
38+
font-weight: 500;
39+
}

src/utils/reportGenerator/reportGenerator.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ export function generateHtmlTable<T>(reportFrameworkParameters: ReportFrameworkP
2121
const reportHeaderLabel: string = reportFrameworkParameters.reportHeaderLabel;
2222
const indexedKey: string = reportFrameworkParameters.indexedKey;
2323
const showMigrationBanner: boolean = reportFrameworkParameters.showMigrationBanner;
24+
const rollbackFlags: string[] = reportFrameworkParameters.rollbackFlags || [];
25+
const rollbackFlagName: string = reportFrameworkParameters.rollbackFlagName;
26+
const commandType: 'assess' | 'migrate' = reportFrameworkParameters.commandType || 'assess';
2427

2528
const transformedHeader: TableHeaderCell[][] = transform(headerColumns);
2629
const tableId = `report-table-${reportTableInstance++}`;
@@ -202,6 +205,15 @@ export function generateHtmlTable<T>(reportFrameworkParameters: ReportFrameworkP
202205
${ctaSummary && ctaSummary.length > 0 ? ctaButton : ''}
203206
</div>`;
204207

208+
let rollbackFlagsHtml = '';
209+
if (rollbackFlags && rollbackFlagName) {
210+
const flagNames = rollbackFlagName.split(',').map(flag => flag.trim());
211+
const matchingFlags = flagNames.filter(flag => rollbackFlags.includes(flag));
212+
if (matchingFlags.length > 0) {
213+
rollbackFlagsHtml = generateRollbackFlagsHtml(rollbackFlags, matchingFlags.join(', '), commandType);
214+
}
215+
}
216+
205217
return `
206218
<div class="report-wrapper">
207219
<div id="scrollable-wrapper" class="scrollable-wrapper">
@@ -231,6 +243,7 @@ export function generateHtmlTable<T>(reportFrameworkParameters: ReportFrameworkP
231243
<script src="./reportGeneratorUtility.js" defer></script>
232244
<link rel="stylesheet" href="./reportGenerator.css">
233245
</div>
246+
${rollbackFlagsHtml}
234247
`;
235248
}
236249

@@ -301,3 +314,27 @@ function createIndexedRow<T>(row: T, indexedKey: string, columns: Array<TableCol
301314
}
302315
return rows;
303316
}
317+
export function generateRollbackFlagsHtml(rollbackFlags: string[], flagNames: string, commandType: 'assess' | 'migrate' = 'assess'): string {
318+
const flagNameArray = flagNames.split(',').map(flag => flag.trim());
319+
const matchingFlags = flagNameArray.filter(flag => rollbackFlags.includes(flag));
320+
321+
if (matchingFlags.length === 0) {
322+
return '';
323+
}
324+
325+
const actionText = commandType === 'migrate' ? matchingFlags.length > 1 ? 'were' : 'was' : 'will be';
326+
327+
return `
328+
<div class="slds-box" style="background-color: white; margin-top: 20px;">
329+
<div class="slds-text-heading_medium">Rollback Flags Disabled</div>
330+
<div style="margin-block: 15px">
331+
<p>The following rollback flag${matchingFlags.length > 1 ? 's' : ''} ${actionText} disabled during migration:</p>
332+
<ul class="slds-list_dotted">
333+
${matchingFlags.map(flag => `<li class="slds-item slds-text-color_destructive">${flag}</li>`).join('')}
334+
</ul>
335+
<p>
336+
<strong>Note:</strong> ${matchingFlags.length > 1 ? 'These ' : 'This '} flag${matchingFlags.length > 1 ? 's will' : ' will'} no longer be supported after migration. For assistance, please contact support.
337+
</p>
338+
</div>
339+
</div>`;
340+
}

src/utils/reportGenerator/reportInterfaces.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,7 @@ export interface ReportFrameworkParameters<T> {
7676
reportHeaderLabel: string;
7777
indexedKey?: string;
7878
showMigrationBanner: boolean;
79+
rollbackFlags?: string[];
80+
rollbackFlagName?: string;
81+
commandType?: 'assess' | 'migrate';
7982
}

src/utils/resultsbuilder/DRAssessmentReporter.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export class DRAssessmentReporter {
1313
public static generateDRAssesment(
1414
dataRaptorAssessmentInfos: DataRaptorAssessmentInfo[],
1515
instanceUrl: string,
16-
org: ReportHeaderFormat[]
16+
orgDetails: ReportHeaderFormat[],
17+
rollbackFlags: string[]
1718
): string {
1819
// Header Column
1920
const headerColumn: HeaderColumn[] = [
@@ -123,15 +124,18 @@ export class DRAssessmentReporter {
123124
},
124125
];
125126

126-
const reportFrameworkParameters: ReportFrameworkParameters<DRAssessmentReporter> = {
127+
const reportFrameworkParameters: ReportFrameworkParameters<DataRaptorAssessmentInfo> = {
127128
headerColumns: headerColumn,
128129
columns,
129130
rows: dataRaptorAssessmentInfos,
130-
orgDetails: org,
131+
orgDetails: orgDetails,
131132
filters,
132133
ctaSummary: [],
133134
reportHeaderLabel: 'Data Mapper Assessment',
134135
showMigrationBanner: true,
136+
rollbackFlags,
137+
rollbackFlagName: 'RollbackDRChanges',
138+
commandType: 'assess',
135139
};
136140
// Render table
137141
const tableHtml = generateHtmlTable(reportFrameworkParameters);

src/utils/resultsbuilder/IPAssessmentReporter.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ export class IPAssessmentReporter {
1212
public static generateIPAssesment(
1313
ipAssessmentInfos: IPAssessmentInfo[],
1414
instanceUrl: string,
15-
org: ReportHeaderFormat[]
15+
orgDetails: ReportHeaderFormat[],
16+
rollbackFlags: string[]
1617
): string {
1718
// Define multi-row headers
1819
const headerColumn: HeaderColumn[] = [
@@ -107,11 +108,14 @@ export class IPAssessmentReporter {
107108
headerColumns: headerColumn,
108109
columns,
109110
rows: ipAssessmentInfos,
110-
orgDetails: org,
111+
orgDetails: orgDetails,
111112
filters: [],
112113
ctaSummary: [],
113114
reportHeaderLabel: 'Integration Procedure Assessment',
114115
showMigrationBanner: true,
116+
rollbackFlags,
117+
rollbackFlagName: 'RollbackIPChanges',
118+
commandType: 'assess',
115119
};
116120
// Render table
117121
const tableHtml = generateHtmlTable(reportFrameworkParameters);

0 commit comments

Comments
 (0)