Skip to content

Commit e436dd1

Browse files
committed
refactor
1 parent 81136a1 commit e436dd1

File tree

2 files changed

+52
-40
lines changed

2 files changed

+52
-40
lines changed

packages/core/src/codewhisperer/client/codewhisperer.ts

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,21 @@ import { AWSError, Credentials, Service } from 'aws-sdk'
77
import globals from '../../shared/extensionGlobals'
88
import * as CodeWhispererClient from './codewhispererclient'
99
import * as CodeWhispererUserClient from './codewhispereruserclient'
10-
import { ListAvailableCustomizationsResponse, SendTelemetryEventRequest } from './codewhispereruserclient'
10+
import { SendTelemetryEventRequest } from './codewhispereruserclient'
1111
import { ServiceOptions } from '../../shared/awsClientBuilder'
1212
import { hasVendedIamCredentials } from '../../auth/auth'
1313
import { CodeWhispererSettings } from '../util/codewhispererSettings'
1414
import { PromiseResult } from 'aws-sdk/lib/request'
1515
import { AuthUtil } from '../util/authUtil'
1616
import { isSsoConnection } from '../../auth/connection'
17-
import { pageableToCollection } from '../../shared/utilities/collectionUtils'
1817
import apiConfig = require('./service-2.json')
1918
import userApiConfig = require('./user-service-2.json')
2019
import { session } from '../util/codeWhispererSession'
2120
import { getLogger } from '../../shared/logger/logger'
22-
import { indent } from '../../shared/utilities/textUtilities'
2321
import { getClientId, getOptOutPreference, getOperatingSystem } from '../../shared/telemetry/util'
2422
import { extensionVersion, getServiceEnvVarConfig } from '../../shared/vscode/env'
2523
import { DevSettings } from '../../shared/settings'
26-
import { CodeWhispererConfig, RegionProfile } from '../models/model'
24+
import { CodeWhispererConfig } from '../models/model'
2725

2826
const keepAliveHeader = 'keep-alive-codewhisperer'
2927

@@ -219,27 +217,6 @@ export class DefaultCodeWhispererClient {
219217
.promise()
220218
}
221219

222-
public async listAvailableCustomizations(profile: RegionProfile): Promise<ListAvailableCustomizationsResponse[]> {
223-
const client = await AuthUtil.instance.regionProfileManager.createQClient(profile)
224-
const requester = async (request: CodeWhispererUserClient.ListAvailableCustomizationsRequest) =>
225-
client.listAvailableCustomizations(request).promise()
226-
return pageableToCollection(requester, { profileArn: profile?.arn }, 'nextToken')
227-
.promise()
228-
.then((resps) => {
229-
let logStr = 'amazonq: listAvailableCustomizations API request:'
230-
for (const resp of resps) {
231-
const requestId = resp.$response.requestId
232-
logStr += `\n${indent('RequestID: ', 4)}${requestId},\n${indent('Customizations:', 4)}`
233-
for (const [index, c] of resp.customizations.entries()) {
234-
const entry = `${index.toString().padStart(2, '0')}: ${c.name?.trim()}`
235-
logStr += `\n${indent(entry, 8)}`
236-
}
237-
}
238-
getLogger().debug(logStr)
239-
return resps
240-
})
241-
}
242-
243220
public async sendTelemetryEvent(request: SendTelemetryEventRequest) {
244221
const requestWithCommonFields: SendTelemetryEventRequest = {
245222
...request,

packages/core/src/codewhisperer/util/customizationUtil.ts

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,45 @@ import { AuthUtil } from './authUtil'
1010
import * as vscode from 'vscode'
1111
import { createCommonButtons } from '../../shared/ui/buttons'
1212
import { DataQuickPickItem, showQuickPick } from '../../shared/ui/pickerPrompter'
13-
import { codeWhispererClient } from '../client/codewhisperer'
14-
import { Customization, ResourceArn } from '../client/codewhispereruserclient'
13+
import CodeWhispererUserClient, { Customization, ResourceArn } from '../client/codewhispereruserclient'
1514
import { codicon, getIcon } from '../../shared/icons'
1615
import { getLogger } from '../../shared/logger/logger'
1716
import { showMessageWithUrl } from '../../shared/utilities/messages'
1817
import { parse } from '@aws-sdk/util-arn-parser'
1918
import { Commands } from '../../shared/vscode/commands2'
2019
import { RegionProfile, vsCodeState } from '../models/model'
20+
import { pageableToCollection } from '../../shared/utilities/collectionUtils'
21+
import { isAwsError } from '../../shared/errors'
22+
23+
export class CustomizationProvider {
24+
constructor(
25+
private readonly client: CodeWhispererUserClient,
26+
private readonly profile: RegionProfile
27+
) {}
28+
29+
async listAvailableCustomizations(): Promise<Customization[]> {
30+
const requester = async (request: CodeWhispererUserClient.ListAvailableCustomizationsRequest) =>
31+
this.client.listAvailableCustomizations(request).promise()
32+
33+
try {
34+
const request = { profileArn: this.profile.arn }
35+
const customizations = await pageableToCollection(requester, request, 'nextToken', 'customizations')
36+
.flatten()
37+
.promise()
38+
39+
return customizations
40+
} catch (e) {
41+
const logMsg = isAwsError(e) ? `requestId=${e.requestId}; message=${e.message}` : (e as Error).message
42+
getLogger().error(`failed to listAvailableCustomizations: ${logMsg}`)
43+
return []
44+
}
45+
}
46+
47+
static async init(profile: RegionProfile): Promise<CustomizationProvider> {
48+
const client = await AuthUtil.instance.regionProfileManager.createQClient(profile)
49+
return new CustomizationProvider(client, profile)
50+
}
51+
}
2152

2253
/**
2354
*
@@ -336,23 +367,27 @@ export const selectCustomization = async (customization: Customization) => {
336367
)
337368
}
338369

339-
// should collect all customizations across different profiles and if users select the customization, we also change the profile if needed if the customization is accessible from a different profile
370+
// Should collect all customizations across different profiles and if users select the customization, we also change the profile if needed if the customization is accessible from a different profile.
340371
export const getAvailableCustomizationsList = async () => {
341372
const items: (Customization & { profile: RegionProfile })[] = []
342-
// TODO: try catch listProfile
343-
const profiles = await AuthUtil.instance.regionProfileManager.listRegionProfile()
373+
const profiles: RegionProfile[] = []
374+
try {
375+
const r = await AuthUtil.instance.regionProfileManager.listRegionProfile()
376+
profiles.push(...r)
377+
} catch (e) {
378+
getLogger().error(`Failed to list customizations because listAvailableProfiles failed %s`, (e as Error).message)
379+
return []
380+
}
344381

345382
for (const profile of profiles) {
346-
const response = await codeWhispererClient.listAvailableCustomizations(profile)
347-
for (const customizations of response.map(
348-
(listAvailableCustomizationsResponse) => listAvailableCustomizationsResponse.customizations
349-
)) {
350-
for (const c of customizations) {
351-
items.push({
352-
...c,
353-
profile: profile,
354-
})
355-
}
383+
const provider = await CustomizationProvider.init(profile)
384+
const customizations = await provider.listAvailableCustomizations()
385+
386+
for (const c of customizations) {
387+
items.push({
388+
...c,
389+
profile: profile,
390+
})
356391
}
357392
}
358393

0 commit comments

Comments
 (0)