Skip to content

Commit d45b343

Browse files
committed
feat: use-most-recent cache
1 parent b1909c8 commit d45b343

File tree

4 files changed

+76
-3
lines changed

4 files changed

+76
-3
lines changed

config/config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"Account": {
3+
"numRecords": 10,
34
"fields": [
45
{
56
"name": "Name",
@@ -143,6 +144,7 @@
143144
"formats": []
144145
},
145146
"Contact": {
147+
"numRecords": 10,
146148
"fields": [
147149
{
148150
"name": "AccountId",
@@ -351,6 +353,7 @@
351353
"formats": []
352354
},
353355
"Opportunity": {
356+
"numRecords": 10,
354357
"fields": [
355358
{
356359
"name": "Amount",

src/commands/data-seeding/generate.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Duration } from '@salesforce/kit';
1111
import { initiateDataSeed, pollSeedStatus, PollSeedResponse } from '../../utils/api.js';
1212
import { getSeedGenerateMso, getSeedGenerateStage as getStage } from '../../utils/mso.js';
1313
import { DataSeedingGenerateResult } from '../../utils/types.js';
14+
import { GenerateRequestCache } from '../../utils/cache.js';
1415

1516
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1617
const messages = Messages.loadMessages('@salesforce/plugin-data-seeding', 'data-seeding.generate');
@@ -59,6 +60,8 @@ export default class DataSeedingGenerate extends SfCommand<DataSeedingGenerateRe
5960

6061
if (!jobId) throw new Error('Failed to receive job id');
6162

63+
await (await GenerateRequestCache.create()).createCacheEntry(jobId);
64+
6265
const buildResponse = (response: PollSeedResponse): DataSeedingGenerateResult => ({
6366
dataSeedingJob: 'generate',
6467
jobId,

src/commands/data-seeding/report.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Messages, SfError } from '@salesforce/core';
1010
import { pollSeedStatus } from '../../utils/api.js';
1111
import { getSeedGenerateMso, getSeedGenerateStage as getStage } from '../../utils/mso.js';
1212
import { DataSeedingReportResult } from '../../utils/types.js';
13+
import { GenerateRequestCache } from '../../utils/cache.js';
1314

1415
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1516
const messages = Messages.loadMessages('@salesforce/plugin-data-seeding', 'data-seeding.report');
@@ -26,19 +27,21 @@ export default class DataSeedingReport extends SfCommand<DataSeedingReportResult
2627
'job-id': Flags.string({
2728
summary: messages.getMessage('flags.job-id.summary'),
2829
char: 'i',
29-
exclusive: ['use-most-recent'],
30+
exactlyOne: ['job-id', 'use-most-recent'],
3031
}),
3132
'use-most-recent': Flags.boolean({
3233
summary: messages.getMessage('flags.use-most-recent.summary'),
3334
char: 'r',
34-
exclusive: ['job-id'],
35+
exactlyOne: ['job-id', 'use-most-recent'],
3536
}),
3637
};
3738

3839
public async run(): Promise<DataSeedingReportResult> {
3940
const { flags } = await this.parse(DataSeedingReport);
4041

41-
const jobId = flags['job-id'] ?? 'getMostRecentJobIdFromCache()';
42+
const jobId = flags['job-id'] ?? (await GenerateRequestCache.create()).resolveFromCache().jobId;
43+
44+
if (!jobId) throw new SfError('No job ID provided or found in cache');
4245

4346
const response = await pollSeedStatus(jobId);
4447

src/utils/cache.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright (c) 2023, salesforce.com, inc.
3+
* All rights reserved.
4+
* Licensed under the BSD 3-Clause license.
5+
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6+
*/
7+
8+
import { TTLConfig, Global, SfError } from '@salesforce/core';
9+
import { Duration } from '@salesforce/kit';
10+
11+
export type SeedingOptions = {
12+
jobId: string;
13+
};
14+
15+
export type SeedingCacheConfig = {
16+
jobId: string;
17+
};
18+
19+
export abstract class DataSeedingRequestCache extends TTLConfig<TTLConfig.Options, SeedingCacheConfig> {
20+
public static getDefaultOptions(): TTLConfig.Options {
21+
return {
22+
isGlobal: true,
23+
isState: true,
24+
filename: DataSeedingRequestCache.getFileName(),
25+
stateFolder: Global.SF_STATE_FOLDER,
26+
ttl: Duration.days(14),
27+
};
28+
}
29+
30+
public async createCacheEntry(jobId: string): Promise<void> {
31+
if (!jobId) throw new SfError('Job ID is required to create a cache entry');
32+
33+
this.set(jobId, { jobId });
34+
await this.write();
35+
}
36+
37+
public resolveFromCache(): SeedingOptions {
38+
const key = this.getLatestKey();
39+
if (!key) throw new SfError('Could not find a job ID to resume');
40+
41+
const { jobId } = this.get(key);
42+
return { jobId };
43+
}
44+
}
45+
46+
export class GenerateRequestCache extends DataSeedingRequestCache {
47+
public static getDefaultOptions(): TTLConfig.Options {
48+
return {
49+
isGlobal: true,
50+
isState: true,
51+
filename: 'data-seeding-generate-request-cache.json',
52+
stateFolder: Global.SF_STATE_FOLDER,
53+
ttl: Duration.days(14),
54+
};
55+
}
56+
57+
public static async unset(key: string): Promise<void> {
58+
const cache = await GenerateRequestCache.create();
59+
cache.unset(key);
60+
await cache.write();
61+
}
62+
}
63+
64+

0 commit comments

Comments
 (0)