Skip to content

Commit 8a181b5

Browse files
committed
cleanup
1 parent 85634c0 commit 8a181b5

12 files changed

Lines changed: 169 additions & 245 deletions

File tree

packages/b2c-cli/src/commands/job/base.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.

packages/b2c-cli/src/commands/job/export.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {Flags} from '@oclif/core';
2+
import {JobCommand} from '@salesforce/b2c-tooling/cli';
23
import {
34
siteArchiveExportToPath,
45
JobExecutionError,
56
type SiteArchiveExportResult,
67
type ExportDataUnitsConfiguration,
78
} from '@salesforce/b2c-tooling/operations/jobs';
89
import {t} from '../../i18n/index.js';
9-
import {JobCommand} from './base.js';
1010

1111
export default class JobExport extends JobCommand<typeof JobExport> {
1212
static description = t(
@@ -157,7 +157,7 @@ export default class JobExport extends JobCommand<typeof JobExport> {
157157
const elapsedSec = Math.floor(elapsed / 1000);
158158
this.log(
159159
t('commands.job.export.progress', ' Status: {{status}} ({{elapsed}}s elapsed)', {
160-
status: exec.executionStatus,
160+
status: exec.execution_status,
161161
elapsed: elapsedSec.toString(),
162162
}),
163163
);
@@ -169,7 +169,7 @@ export default class JobExport extends JobCommand<typeof JobExport> {
169169
const durationSec = result.execution.duration ? (result.execution.duration / 1000).toFixed(1) : 'N/A';
170170
this.log(
171171
t('commands.job.export.completed', 'Export completed: {{status}} (duration: {{duration}}s)', {
172-
status: result.execution.exitStatus || result.execution.executionStatus,
172+
status: result.execution.exit_status?.code || result.execution.execution_status,
173173
duration: durationSec,
174174
}),
175175
);
@@ -198,7 +198,7 @@ export default class JobExport extends JobCommand<typeof JobExport> {
198198
}
199199
this.error(
200200
t('commands.job.export.failed', 'Export failed: {{status}}', {
201-
status: error.execution.exitStatus || 'ERROR',
201+
status: error.execution.exit_status?.code || 'ERROR',
202202
}),
203203
);
204204
}

packages/b2c-cli/src/commands/job/import.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import {Args, Flags} from '@oclif/core';
2+
import {JobCommand} from '@salesforce/b2c-tooling/cli';
23
import {
34
siteArchiveImport,
45
JobExecutionError,
56
type SiteArchiveImportResult,
67
} from '@salesforce/b2c-tooling/operations/jobs';
78
import {t} from '../../i18n/index.js';
8-
import {JobCommand} from './base.js';
99

1010
export default class JobImport extends JobCommand<typeof JobImport> {
1111
static args = {
@@ -88,7 +88,7 @@ export default class JobImport extends JobCommand<typeof JobImport> {
8888
const elapsedSec = Math.floor(elapsed / 1000);
8989
this.log(
9090
t('commands.job.import.progress', ' Status: {{status}} ({{elapsed}}s elapsed)', {
91-
status: exec.executionStatus,
91+
status: exec.execution_status,
9292
elapsed: elapsedSec.toString(),
9393
}),
9494
);
@@ -100,7 +100,7 @@ export default class JobImport extends JobCommand<typeof JobImport> {
100100
const durationSec = result.execution.duration ? (result.execution.duration / 1000).toFixed(1) : 'N/A';
101101
this.log(
102102
t('commands.job.import.completed', 'Import completed: {{status}} (duration: {{duration}}s)', {
103-
status: result.execution.exitStatus || result.execution.executionStatus,
103+
status: result.execution.exit_status?.code || result.execution.execution_status,
104104
duration: durationSec,
105105
}),
106106
);
@@ -121,7 +121,7 @@ export default class JobImport extends JobCommand<typeof JobImport> {
121121
}
122122
this.error(
123123
t('commands.job.import.failed', 'Import failed: {{status}}', {
124-
status: error.execution.exitStatus || 'ERROR',
124+
status: error.execution.exit_status?.code || 'ERROR',
125125
}),
126126
);
127127
}

packages/b2c-cli/src/commands/job/run.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Args, Flags} from '@oclif/core';
2+
import {JobCommand} from '@salesforce/b2c-tooling/cli';
23
import {executeJob, waitForJob, JobExecutionError, type JobExecution} from '@salesforce/b2c-tooling/operations/jobs';
34
import {t} from '../../i18n/index.js';
4-
import {JobCommand} from './base.js';
55

66
export default class JobRun extends JobCommand<typeof JobRun> {
77
static args = {
@@ -83,7 +83,7 @@ export default class JobRun extends JobCommand<typeof JobRun> {
8383
this.log(
8484
t('commands.job.run.started', 'Job started: {{executionId}} (status: {{status}})', {
8585
executionId: execution.id,
86-
status: execution.executionStatus,
86+
status: execution.execution_status,
8787
}),
8888
);
8989

@@ -92,14 +92,14 @@ export default class JobRun extends JobCommand<typeof JobRun> {
9292
this.log(t('commands.job.run.waiting', 'Waiting for job to complete...'));
9393

9494
try {
95-
execution = await waitForJob(this.instance, jobId, execution.id, {
95+
execution = await waitForJob(this.instance, jobId, execution.id!, {
9696
timeout: timeout ? timeout * 1000 : undefined,
9797
onProgress: (exec, elapsed) => {
9898
if (!this.jsonEnabled()) {
9999
const elapsedSec = Math.floor(elapsed / 1000);
100100
this.log(
101101
t('commands.job.run.progress', ' Status: {{status}} ({{elapsed}}s elapsed)', {
102-
status: exec.executionStatus,
102+
status: exec.execution_status,
103103
elapsed: elapsedSec.toString(),
104104
}),
105105
);
@@ -110,7 +110,7 @@ export default class JobRun extends JobCommand<typeof JobRun> {
110110
const durationSec = execution.duration ? (execution.duration / 1000).toFixed(1) : 'N/A';
111111
this.log(
112112
t('commands.job.run.completed', 'Job completed: {{status}} (duration: {{duration}}s)', {
113-
status: execution.exitStatus || execution.executionStatus,
113+
status: execution.exit_status?.code || execution.execution_status,
114114
duration: durationSec,
115115
}),
116116
);
@@ -121,7 +121,7 @@ export default class JobRun extends JobCommand<typeof JobRun> {
121121
}
122122
this.error(
123123
t('commands.job.run.jobFailed', 'Job failed: {{status}}', {
124-
status: error.execution.exitStatus || 'ERROR',
124+
status: error.execution.exit_status?.code || 'ERROR',
125125
}),
126126
);
127127
}

packages/b2c-cli/src/commands/job/search.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,15 @@ export default class JobSearch extends InstanceCommand<typeof JobSearch> {
113113

114114
// Rows
115115
for (const exec of executions) {
116-
const status = exec.exitStatus || exec.executionStatus;
117-
const startTime = exec.startTime ? exec.startTime.toISOString().replace('T', ' ').slice(0, 19) : 'N/A';
116+
const status = exec.exit_status?.code || exec.execution_status;
117+
const startTime = exec.start_time
118+
? new Date(exec.start_time).toISOString().replace('T', ' ').slice(0, 19)
119+
: 'N/A';
118120

119121
ui.div(
120-
{text: exec.id, width: 38, padding: [0, 1, 0, 0]},
121-
{text: exec.jobId, width: 30, padding: [0, 1, 0, 0]},
122-
{text: status, width: 12, padding: [0, 1, 0, 0]},
122+
{text: exec.id ?? '', width: 38, padding: [0, 1, 0, 0]},
123+
{text: exec.job_id ?? '', width: 30, padding: [0, 1, 0, 0]},
124+
{text: status ?? '', width: 12, padding: [0, 1, 0, 0]},
123125
{text: startTime, width: 20, padding: [0, 0, 0, 0]},
124126
);
125127
}

packages/b2c-cli/src/commands/job/wait.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Args, Flags} from '@oclif/core';
2+
import {JobCommand} from '@salesforce/b2c-tooling/cli';
23
import {waitForJob, JobExecutionError, type JobExecution} from '@salesforce/b2c-tooling/operations/jobs';
34
import {t} from '../../i18n/index.js';
4-
import {JobCommand} from './base.js';
55

66
export default class JobWait extends JobCommand<typeof JobWait> {
77
static args = {
@@ -63,7 +63,7 @@ export default class JobWait extends JobCommand<typeof JobWait> {
6363
const elapsedSec = Math.floor(elapsed / 1000);
6464
this.log(
6565
t('commands.job.wait.progress', ' Status: {{status}} ({{elapsed}}s elapsed)', {
66-
status: exec.executionStatus,
66+
status: exec.execution_status,
6767
elapsed: elapsedSec.toString(),
6868
}),
6969
);
@@ -74,7 +74,7 @@ export default class JobWait extends JobCommand<typeof JobWait> {
7474
const durationSec = execution.duration ? (execution.duration / 1000).toFixed(1) : 'N/A';
7575
this.log(
7676
t('commands.job.wait.completed', 'Job completed: {{status}} (duration: {{duration}}s)', {
77-
status: execution.exitStatus || execution.executionStatus,
77+
status: execution.exit_status?.code || execution.execution_status,
7878
duration: durationSec,
7979
}),
8080
);
@@ -87,7 +87,7 @@ export default class JobWait extends JobCommand<typeof JobWait> {
8787
}
8888
this.error(
8989
t('commands.job.wait.jobFailed', 'Job failed: {{status}}', {
90-
status: error.execution.exitStatus || 'ERROR',
90+
status: error.execution.exit_status?.code || 'ERROR',
9191
}),
9292
);
9393
}

packages/b2c-tooling/src/cli/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export type {Flags, Args} from './base-command.js';
44
export {OAuthCommand} from './oauth-command.js';
55
export {InstanceCommand} from './instance-command.js';
66
export {CartridgeCommand} from './cartridge-command.js';
7+
export {JobCommand} from './job-command.js';
78
export {MrtCommand} from './mrt-command.js';
89
export {OdsCommand} from './ods-command.js';
910

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import {Command} from '@oclif/core';
2+
import {InstanceCommand} from './instance-command.js';
3+
import {getJobLog, getJobErrorMessage, type JobExecution} from '../operations/jobs/index.js';
4+
import {t} from '../i18n/index.js';
5+
6+
/**
7+
* Base command for job operations.
8+
*
9+
* Extends InstanceCommand with job-specific functionality like
10+
* displaying job logs on failure.
11+
*
12+
* @example
13+
* export default class MyJobCommand extends JobCommand<typeof MyJobCommand> {
14+
* async run(): Promise<void> {
15+
* try {
16+
* await executeJob(this.instance, 'my-job');
17+
* } catch (error) {
18+
* if (error instanceof JobExecutionError) {
19+
* await this.showJobLog(error.execution);
20+
* }
21+
* throw error;
22+
* }
23+
* }
24+
* }
25+
*/
26+
export abstract class JobCommand<T extends typeof Command> extends InstanceCommand<T> {
27+
/**
28+
* Display a job's log file content and error message if available.
29+
* Outputs to stderr since this is typically shown for failed jobs.
30+
*
31+
* @param execution - Job execution with log file info
32+
*/
33+
protected async showJobLog(execution: JobExecution): Promise<void> {
34+
// Extract error message from failed step executions
35+
const errorMessage = getJobErrorMessage(execution);
36+
37+
if (!execution.is_log_file_existing) {
38+
// No log file, but we may still have an error message
39+
if (errorMessage) {
40+
this.logger.error({errorMessage}, errorMessage);
41+
}
42+
return;
43+
}
44+
45+
try {
46+
const log = await getJobLog(this.instance, execution);
47+
const logFileName = execution.log_file_path?.split('/').pop() ?? 'job.log';
48+
49+
const header = t('cli.job.logHeader', 'Job log ({{logFileName}}):', {logFileName});
50+
this.logger.error({log, errorMessage}, `${header}\n${log}`);
51+
52+
// Log the error message separately if available
53+
if (errorMessage) {
54+
this.logger.error(t('cli.job.errorMessage', 'Error: {{message}}', {message: errorMessage}));
55+
}
56+
} catch {
57+
this.warn(t('cli.job.logFetchFailed', 'Could not retrieve job log'));
58+
// Still try to show error message even if log fetch failed
59+
if (errorMessage) {
60+
this.logger.error({errorMessage}, errorMessage);
61+
}
62+
}
63+
}
64+
}

packages/b2c-tooling/src/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,11 @@ export {
113113
searchJobExecutions,
114114
findRunningJobExecution,
115115
getJobLog,
116+
getJobErrorMessage,
116117
JobExecutionError,
117118
siteArchiveImport,
118119
siteArchiveExport,
119120
siteArchiveExportToPath,
120-
// Legacy exports (deprecated)
121-
runJob,
122-
getJobStatus,
123121
} from './operations/jobs/index.js';
124122
export type {
125123
JobExecution,
@@ -137,8 +135,6 @@ export type {
137135
ExportDataUnitsConfiguration,
138136
ExportSitesConfiguration,
139137
ExportGlobalDataConfiguration,
140-
// Legacy exports (deprecated)
141-
JobExecutionResult,
142138
} from './operations/jobs/index.js';
143139

144140
// Operations - Sites

packages/b2c-tooling/src/operations/jobs/index.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export {
6868
searchJobExecutions,
6969
findRunningJobExecution,
7070
getJobLog,
71+
getJobErrorMessage,
7172
JobExecutionError,
7273
} from './run.js';
7374

@@ -94,11 +95,3 @@ export type {
9495
ExportSitesConfiguration,
9596
ExportGlobalDataConfiguration,
9697
} from './site-archive.js';
97-
98-
// Legacy exports for backwards compatibility (deprecated)
99-
/** @deprecated Use executeJob instead */
100-
export {executeJob as runJob} from './run.js';
101-
/** @deprecated Use getJobExecution instead */
102-
export {getJobExecution as getJobStatus} from './run.js';
103-
/** @deprecated Use JobExecution instead */
104-
export type {JobExecution as JobExecutionResult} from './run.js';

0 commit comments

Comments
 (0)