Skip to content

Commit f552ac3

Browse files
authored
Merge pull request #346 from sf-aastha-paruthi/u/aparuthi/AssessModeForExpSites
@W-18480474 U/aparuthi/assess mode for exp sites
2 parents 2dee9ce + 7e861f1 commit f552ac3

25 files changed

+1209
-283
lines changed

messages/assess.json

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,5 +136,52 @@
136136
"generatedDiffForFile": "Generated diff for file: %s",
137137
"errorProcessingFlexiPage": "Error processing flexipage file: %s, %s",
138138
"flexipagesWithChanges": "Found %s flexipage files with changes",
139-
"migratingFlexiPages": "Migrating FlexiPages"
139+
"migratingFlexiPages": "Migrating FlexiPages",
140+
"experienceSiteMetadataConsent": "The consent for exp site is %s",
141+
"experienceSiteConsentNotProvidedWarning": "Consent for experience sites is not provided. Experience sites will not be processed",
142+
"relatedObjectsToProcessAfterExpSitesRemoval": "Objects to process after removing expsite are",
143+
"experienceBundleMetadataAPIAlreadyEnabled": "ExperienceBundle metadata api is already enabled",
144+
"enableExperienceBundleMetadataAPIProgramatically": "ExperienceBundle metadata api needs to be programatically enabled",
145+
"unableToEnableExperienceBundleMetadataAPI": "Since the api could not able enabled the experience sites would not be processed",
146+
"relatedObjectsToProcess": "Objects to process are",
147+
"consentForExperienceSites": "'By proceeding further, you hereby consent to enable digital experience metadata api(y/n). If y sites will be processed, if n expsites will not be processed';",
148+
"failedToGetConsentError": "Failed to get user consent: %s",
149+
"settingDesignersToStandardModel": "Setting designers to use the standard data model",
150+
"errorSettingDesignersToStandardModel": "Error occurred while setting designers to use the standard data model",
151+
"designersSetToStandardModel": "Successfully executed setDesignersToUseStandardDataModel",
152+
"exceptionSettingDesignersToStandardModel": "Exception occurred while setting designers to use the standard data model",
153+
"noRelatedObjects": "No related objects to process",
154+
"turnOffExperienceBundleAPI": "Since ExperienceSiteMetadata API was programatically enabled, turing it off",
155+
"errorRevertingExperienceBundleMetadataAPI": "Exception occurred while reverting metadata API. Please do that manually",
156+
"processingExperienceSites": "Starting experience sites processing for %s",
157+
"experienceSitesProcessingStarted": "Started processing the experience sites",
158+
"experienceSiteSuccessfullyProcessed": "Successfully processed experience sites for %s",
159+
"readingFile": "Started reading the files",
160+
"totalFileCount": "The total count of files is %s",
161+
"skipNonJsonFile": "Skipping non-JSON file - %s",
162+
"experienceSiteWithOmniWrapperSuccessfullyProcessed": "Successfully processed experience site file having vlocity wrapper",
163+
"fileNotHavingWrapper": "File does not contain vlocity wrapper",
164+
"errorProcessingExperienceSite": "Error processing experience site file",
165+
"experienceSiteReportingDetails": "Only the files in which have vlocity wrapper will be shown in the assessment report",
166+
"processingFile": "Processing for file",
167+
"currentRegionOfExperienceSite": "The current region being processed is %s",
168+
"currentComponentOfExperienceSite": "The current component being processed is %s",
169+
"omniWrapperFound": "Omnistudio wrapper component found",
170+
"printUpdatedObject": "Now printing the updated object %s",
171+
"printDifference": "Printing the difference %s",
172+
"updatingFile": "Updating the file content",
173+
"processingFlexcardComponent": "Started processing FC component %s",
174+
"processingOmniscriptComponent": "Started processing OS component",
175+
"targetData": "The target data is %s",
176+
"manualInterventionForExperienceSite": "%s needs manual intervention as the migrated key does not exist",
177+
"manualInterventionForExperienceSiteAsFailure": "%s needs manual intervention as migration failed",
178+
"manualInterventionForExperienceSiteAsDuplicateKey": "%s needs manual intervention as duplicated key found in storage",
179+
"updatingStorageForOmniscipt": "Started updating storage for omniscript %s",
180+
"keyAlreadyInStorage": "Key %s already exists in storage",
181+
"flexcardStorageProcessingStarted": "Started preparing storage for flexcards",
182+
"errorWhileProcessingFlexcardStorage": "Error occurred while processing key for flexcard storage",
183+
"missingInfo": "Info is missing",
184+
"errorCheckingGlobalAutoNumber": "We couldn’t check whether the Global Auto Number setting is enabled: %s. Try again later.",
185+
"errorMigrationMessage": "Error migrating object: %s",
186+
"nameMappingUndefined": "Name Mapping is undefined"
140187
}

messages/migrate.json

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,54 @@
149149
"startingGlobalAutoNumberAssessment": "Starting Global Auto Number assessment...",
150150
"foundGlobalAutoNumbersToAssess": "Found %s Global Auto Numbers to assess",
151151
"unexpectedError": "An unexpected error occurred during processing",
152-
"migrationValidationFailed": "The post-migration validation has failed.",
152+
"migrationValidationFailed": "Post Migration validation failed.",
153+
"incompleteMigrationDetected": "Incomplete migration detected. Source objects: %s, Target objects: %s.",
154+
"experienceSiteMetadataConsent": "The consent for exp site is %s",
155+
"experienceSiteConsentNotProvidedWarning": "Consent for experience sites is not provided. Experience sites will not be processed",
156+
"relatedObjectsToProcessAfterExpSitesRemoval": "Objects to process after removing expsite are",
157+
"experienceBundleMetadataAPIAlreadyEnabled": "ExperienceBundle metadata api is already enabled",
158+
"enableExperienceBundleMetadataAPIProgramatically": "ExperienceBundle metadata api needs to be programatically enabled",
159+
"unableToEnableExperienceBundleMetadataAPI": "Since the api could not able enabled the experience sites would not be processed",
160+
"relatedObjectsToProcess": "Objects to process are",
161+
"consentForExperienceSites": "'By proceeding further, you hereby consent to enable digital experience metadata api(y/n). If y sites will be processed, if n expsites will not be processed';",
162+
"failedToGetConsentError": "Failed to get user consent: %s",
163+
"settingDesignersToStandardModel": "Setting designers to use the standard data model",
164+
"errorSettingDesignersToStandardModel": "Error occurred while setting designers to use the standard data model",
165+
"designersSetToStandardModel": "Successfully executed setDesignersToUseStandardDataModel",
166+
"exceptionSettingDesignersToStandardModel": "Exception occurred while setting designers to use the standard data model",
167+
"noRelatedObjects": "No related objects to process",
168+
"turnOffExperienceBundleAPI": "Since ExperienceSiteMetadata API was programatically enabled, turing it off",
169+
"errorRevertingExperienceBundleMetadataAPI": "Exception occurred while reverting metadata API. Please do that manually",
170+
"processingExperienceSites": "Starting experience sites processing for %s",
171+
"experienceSitesProcessingStarted": "Started processing the experience sites",
172+
"experienceSiteSuccessfullyProcessed": "Successfully processed experience sites for %s",
173+
"readingFile": "Started reading the files",
174+
"totalFileCount": "The total count of files is %s",
175+
"skipNonJsonFile": "Skipping non-JSON file - %s",
176+
"experienceSiteWithOmniWrapperSuccessfullyProcessed": "Successfully processed experience site file having vlocity wrapper",
177+
"fileNotHavingWrapper": "File does not contain vlocity wrapper",
178+
"errorProcessingExperienceSite": "Error processing experience site file",
179+
"experienceSiteReportingDetails": "Only the files in which have vlocity wrapper will be shown in the assessment report",
180+
"processingFile": "Processing for file",
181+
"currentRegionOfExperienceSite": "The current region being processed is %s",
182+
"currentComponentOfExperienceSite": "The current component being processed is %s",
183+
"omniWrapperFound": "Omnistudio wrapper component found",
184+
"printUpdatedObject": "Now printing the updated object %s",
185+
"printDifference": "Printing the difference %s",
186+
"updatingFile": "Updating the file content",
187+
"processingFlexcardComponent": "Started processing FC component %s",
188+
"processingOmniscriptComponent": "Started processing OS component",
189+
"targetData": "The target data is %s",
190+
"manualInterventionForExperienceSite": "%s needs manual intervention as the migrated key does not exist",
191+
"manualInterventionForExperienceSiteAsFailure": "%s needs manual intervention as migration failed",
192+
"manualInterventionForExperienceSiteAsDuplicateKey": "%s needs manual intervention as duplicated key found in storage",
193+
"updatingStorageForOmniscipt": "Started updating storage for omniscript %s",
194+
"keyAlreadyInStorage": "Key %s already exists in storage",
195+
"flexcardStorageProcessingStarted": "Started preparing storage for flexcards",
196+
"errorWhileProcessingFlexcardStorage": "Error occurred while processing key for flexcard storage",
197+
"missingInfo": "Info is missing",
153198
"incompleteMigrationDetected": "We couldn’t complete the migration process",
154199
"errorCheckingGlobalAutoNumber": "We couldn’t check whether the Global Auto Number setting is enabled: %s. Try again later.",
155-
"errorMigrationMessage": "Error migrating object: %s"
200+
"errorMigrationMessage": "Error migrating object: %s",
201+
"nameMappingUndefined": "Name Mapping is undefined"
156202
}

src/commands/omnistudio/migration/assess.ts

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { OmnistudioOrgDetails, OrgUtils } from '../../../utils/orgUtils';
1515
import { OrgPreferences } from '../../../utils/orgPreferences';
1616
import { Constants } from '../../../utils/constants/stringContants';
1717
import { ProjectPathUtil } from '../../../utils/projectPathUtil';
18+
import { PreMigrate } from '../../../migration/premigrate';
19+
import { PostMigrate } from '../../../migration/postMigrate';
1820

1921
Messages.importMessagesDirectory(__dirname);
2022
const messages = Messages.loadMessages('@salesforce/plugin-omnistudio-migration-tool', 'assess');
@@ -69,8 +71,11 @@ export default class Assess extends OmniStudioBaseCommand {
6971
const allVersions = (this.flags.allversions || false) as boolean;
7072
const assessOnly = (this.flags.only || '') as string;
7173
const relatedObjects = (this.flags.relatedobjects || '') as string;
74+
const isExperienceBundleMetadataAPIProgramaticallyEnabled: { value: boolean } = { value: false };
7275
const conn = this.org.getConnection();
73-
76+
let objectsToProcess: string[];
77+
// To-Do: Add LWC to valid options when GA is released
78+
const validOptions = [Constants.Apex, Constants.ExpSites, Constants.FlexiPage];
7479
if (apiVersion) {
7580
conn.setApiVersion(apiVersion);
7681
} else {
@@ -93,8 +98,16 @@ export default class Assess extends OmniStudioBaseCommand {
9398

9499
const namespace = orgs.packageDetails.namespace;
95100
let projectPath = '';
101+
const preMigrate: PreMigrate = new PreMigrate(this.org, namespace, conn, this.logger, messages, this.ux);
96102
if (relatedObjects) {
103+
objectsToProcess = relatedObjects.split(',').map((obj) => obj.trim());
97104
projectPath = await ProjectPathUtil.getProjectPath(messages, true);
105+
106+
await preMigrate.handleExperienceSitePrerequisites(
107+
objectsToProcess,
108+
conn,
109+
isExperienceBundleMetadataAPIProgramaticallyEnabled
110+
);
98111
}
99112

100113
const assesmentInfo: AssessmentInfo = {
@@ -108,6 +121,7 @@ export default class Assess extends OmniStudioBaseCommand {
108121
ipAssessmentInfos: [],
109122
},
110123
flexipageAssessmentInfos: [],
124+
experienceSiteAssessmentInfos: [],
111125
};
112126

113127
Logger.log(messages.getMessage('assessmentInitialization', [String(namespace)]));
@@ -124,13 +138,8 @@ export default class Assess extends OmniStudioBaseCommand {
124138
process.exit(1);
125139
}
126140

127-
let objectsToProcess: string[];
128141
// Assess related objects if specified
129142
if (relatedObjects) {
130-
// To-Do: Add LWC to valid options when GA is released
131-
const validOptions = [Constants.Apex, Constants.FlexiPage];
132-
objectsToProcess = relatedObjects.split(',').map((obj) => obj.trim());
133-
134143
// Validate input
135144
for (const obj of objectsToProcess) {
136145
if (!validOptions.includes(obj)) {
@@ -150,14 +159,41 @@ export default class Assess extends OmniStudioBaseCommand {
150159
assesmentInfo.lwcAssessmentInfos = relatedObjectAssessmentResult.lwcAssessmentInfos;
151160
assesmentInfo.apexAssessmentInfos = relatedObjectAssessmentResult.apexAssessmentInfos;
152161
assesmentInfo.flexipageAssessmentInfos = relatedObjectAssessmentResult.flexipageAssessmentInfos;
162+
assesmentInfo.experienceSiteAssessmentInfos = relatedObjectAssessmentResult.experienceSiteAssessmentInfos;
153163
}
154164
try {
155165
orgs.rollbackFlags = await OrgPreferences.checkRollbackFlags(conn);
156166
} catch (error) {
157167
Logger.log((error as Error).message);
158168
Logger.log((error as Error).stack);
159169
}
160-
await AssessmentReporter.generate(assesmentInfo, conn.instanceUrl, orgs, assessOnly, objectsToProcess, messages);
170+
171+
// Post Assessment tasks
172+
const postMigrate: PostMigrate = new PostMigrate(
173+
this.org,
174+
namespace,
175+
conn,
176+
this.logger,
177+
messages,
178+
this.ux,
179+
objectsToProcess
180+
);
181+
182+
const userActionMessages: string[] = [];
183+
await postMigrate.restoreExperienceAPIMetadataSettings(
184+
isExperienceBundleMetadataAPIProgramaticallyEnabled,
185+
userActionMessages
186+
);
187+
188+
await AssessmentReporter.generate(
189+
assesmentInfo,
190+
conn.instanceUrl,
191+
orgs,
192+
assessOnly,
193+
objectsToProcess,
194+
messages,
195+
userActionMessages
196+
);
161197
return assesmentInfo;
162198
}
163199

src/commands/omnistudio/migration/migrate.ts

Lines changed: 18 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*/
1010
import * as os from 'os';
1111
import { flags } from '@salesforce/command';
12-
import { Connection, Messages } from '@salesforce/core';
12+
import { Messages } from '@salesforce/core';
1313
import OmniStudioBaseCommand from '../../basecommand';
1414
import { DataRaptorMigrationTool } from '../../../migration/dataraptor';
1515
import { DebugTimer, MigratedObject, MigratedRecordInfo } from '../../../utils';
@@ -27,6 +27,7 @@ import { ProjectPathUtil } from '../../../utils/projectPathUtil';
2727
import { PromptUtil } from '../../../utils/promptUtil';
2828
import { YES_SHORT, YES_LONG, NO_SHORT, NO_LONG } from '../../../utils/projectPathUtil';
2929
import { PostMigrate } from '../../../migration/postMigrate';
30+
import { PreMigrate } from '../../../migration/premigrate';
3031
import { GlobalAutoNumberMigrationTool } from '../../../migration/globalautonumber';
3132

3233
// Initialize Messages with the current plugin directory
@@ -131,6 +132,7 @@ export default class Migrate extends OmniStudioBaseCommand {
131132
let projectPath: string;
132133
let objectsToProcess: string[] = [];
133134
let targetApexNamespace: string;
135+
const preMigrate: PreMigrate = new PreMigrate(this.org, namespace, conn, this.logger, messages, this.ux);
134136
const isExperienceBundleMetadataAPIProgramaticallyEnabled: { value: boolean } = { value: false };
135137
if (relatedObjects) {
136138
// To-Do: Add LWC to valid options when GA is released
@@ -149,7 +151,7 @@ export default class Migrate extends OmniStudioBaseCommand {
149151
// Use ProjectPathUtil for APEX project folder selection (matches assess.ts logic)
150152
projectPath = await ProjectPathUtil.getProjectPath(messages, true);
151153
targetApexNamespace = await this.getTargetApexNamespace(objectsToProcess, targetApexNamespace);
152-
await this.handleExperienceSitePrerequisites(
154+
await preMigrate.handleExperienceSitePrerequisites(
153155
objectsToProcess,
154156
conn,
155157
isExperienceBundleMetadataAPIProgramaticallyEnabled
@@ -192,11 +194,6 @@ export default class Migrate extends OmniStudioBaseCommand {
192194
targetApexNamespace
193195
);
194196
const relatedObjectMigrationResult = omnistudioRelatedObjectsMigration.migrateAll(objectsToProcess);
195-
generatePackageXml.createChangeList(
196-
relatedObjectMigrationResult.apexAssessmentInfos,
197-
relatedObjectMigrationResult.lwcAssessmentInfos,
198-
relatedObjectMigrationResult.flexipageAssessmentInfos
199-
);
200197

201198
// POST MIGRATION
202199
let actionItems = [];
@@ -211,12 +208,24 @@ export default class Migrate extends OmniStudioBaseCommand {
211208
);
212209

213210
if (!migrateOnly) {
214-
actionItems = await postMigrate.setDesignersToUseStandardDataModel(namespace);
211+
await postMigrate.setDesignersToUseStandardDataModel(namespace, actionItems);
215212
}
216-
await postMigrate.restoreExperienceAPIMetadataSettings(isExperienceBundleMetadataAPIProgramaticallyEnabled);
213+
// From here also actionItems need to be collected
214+
await postMigrate.restoreExperienceAPIMetadataSettings(
215+
isExperienceBundleMetadataAPIProgramaticallyEnabled,
216+
actionItems
217+
);
218+
217219
const migrationActionItems = this.collectActionItems(objectMigrationResults);
218220
actionItems = [...actionItems, ...migrationActionItems];
219221

222+
generatePackageXml.createChangeList(
223+
relatedObjectMigrationResult.apexAssessmentInfos,
224+
relatedObjectMigrationResult.lwcAssessmentInfos,
225+
relatedObjectMigrationResult.experienceSiteAssessmentInfos,
226+
relatedObjectMigrationResult.flexipageAssessmentInfos
227+
);
228+
220229
await ResultsBuilder.generateReport(
221230
objectMigrationResults,
222231
relatedObjectMigrationResult,
@@ -259,42 +268,6 @@ export default class Migrate extends OmniStudioBaseCommand {
259268
return consent;
260269
}
261270

262-
private async handleExperienceSitePrerequisites(
263-
objectsToProcess: string[],
264-
conn: Connection,
265-
isExperienceBundleMetadataAPIProgramaticallyEnabled: { value: boolean }
266-
): Promise<void> {
267-
if (objectsToProcess.includes(Constants.ExpSites)) {
268-
const expMetadataApiConsent = await this.getExpSiteMetadataEnableConsent();
269-
Logger.logVerbose(`The consent for exp site is ${expMetadataApiConsent}`);
270-
271-
if (expMetadataApiConsent === false) {
272-
Logger.warn('Consent for experience sites is not provided. Experience sites will not be processed');
273-
this.removeKeyFromRelatedObjectsToProcess(Constants.ExpSites, objectsToProcess);
274-
Logger.logVerbose(`Objects to process after removing expsite are ${JSON.stringify(objectsToProcess)}`);
275-
return;
276-
}
277-
278-
const isMetadataAPIPreEnabled = await OrgPreferences.isExperienceBundleMetadataAPIEnabled(conn);
279-
if (isMetadataAPIPreEnabled === true) {
280-
Logger.logVerbose('ExperienceBundle metadata api is already enabled');
281-
return;
282-
}
283-
284-
Logger.logVerbose('ExperienceBundle metadata api needs to be programatically enabled');
285-
isExperienceBundleMetadataAPIProgramaticallyEnabled.value = await OrgPreferences.setExperienceBundleMetadataAPI(
286-
conn,
287-
true
288-
);
289-
if (isExperienceBundleMetadataAPIProgramaticallyEnabled.value === false) {
290-
this.removeKeyFromRelatedObjectsToProcess(Constants.ExpSites, objectsToProcess);
291-
Logger.warn('Since the api could not able enabled the experience sites would not be processed');
292-
}
293-
294-
Logger.logVerbose(`Objects to process are ${JSON.stringify(objectsToProcess)}`);
295-
}
296-
}
297-
298271
private collectActionItems(objectMigrationResults: MigratedObject[]): string[] {
299272
const actionItems: string[] = [];
300273
// Collect errors from migration results and add them to action items
@@ -307,13 +280,6 @@ export default class Migrate extends OmniStudioBaseCommand {
307280
return actionItems;
308281
}
309282

310-
private removeKeyFromRelatedObjectsToProcess(keyToRemove: string, relatedObjects: string[]): void {
311-
const index = relatedObjects.indexOf(Constants.ExpSites);
312-
if (index > -1) {
313-
relatedObjects.splice(index, 1);
314-
}
315-
}
316-
317283
private async truncateObjects(migrationObjects: MigrationTool[], debugTimer: DebugTimer): Promise<MigratedObject[]> {
318284
const objectMigrationResults: MigratedObject[] = [];
319285
for (const cls of migrationObjects.reverse()) {
@@ -463,23 +429,6 @@ export default class Migrate extends OmniStudioBaseCommand {
463429
return consent;
464430
}
465431

466-
private async getExpSiteMetadataEnableConsent(): Promise<boolean> {
467-
let consent: boolean | null = null;
468-
469-
while (consent === null) {
470-
try {
471-
consent = await Logger.confirm(
472-
'By proceeding further, you hereby consent to enable digital experience metadata api(y/n). If y sites will be processed, if n expsites will not be processed'
473-
);
474-
} catch (error) {
475-
Logger.log(messages.getMessage('invalidYesNoResponse'));
476-
consent = null;
477-
}
478-
}
479-
480-
return consent;
481-
}
482-
483432
private mergeRecordAndUploadResults(
484433
migrationResults: MigrationResult,
485434
migrationTool: MigrationTool

0 commit comments

Comments
 (0)