Skip to content

Commit 79396b9

Browse files
authored
Minor UI Changes (#5464)
* Refresh on delete table * Adding telemetry events * fixing errors * reverting icon changes * sort column names * edit item changes * Updated unit test cases * adding unit test cases
1 parent 3f607f5 commit 79396b9

File tree

11 files changed

+543
-204
lines changed

11 files changed

+543
-204
lines changed

packages/core/src/dynamoDb/activation.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,24 @@ import { DynamoDbTableNode } from './explorer/dynamoDbTableNode'
1313
import { deleteDynamoDbTable } from './commands/deleteDynamoDbTable'
1414
import { searchDynamoDbTables } from './commands/searchDynamoDbTables'
1515
import { DynamoDbInstanceNode } from './explorer/dynamoDbInstanceNode'
16+
import { telemetry } from '../shared/telemetry'
1617

1718
export async function activate(context: ExtContext): Promise<void> {
1819
context.extensionContext.subscriptions.push(
1920
Commands.register('aws.dynamoDb.searchTables', async (node: DynamoDbTableNode | DynamoDbInstanceNode) => {
20-
const dynamoDbtableInfo =
21-
node instanceof DynamoDbTableNode
22-
? { regionName: node.regionCode, groupName: node.regionCode! }
23-
: undefined
24-
const source = node ? (dynamoDbtableInfo ? 'ExplorerDynamoDbTableNode' : 'ExplorerServiceNode') : 'Command'
21+
const source = node ? 'ExplorerDynamoDbInstanceNode' : 'Command'
2522
await searchDynamoDbTables(context, source)
2623
}),
2724

2825
Commands.register('aws.dynamoDb.copyArn', async (node: DynamoDbTableNode) => await copyDynamoDbArn(node)),
2926

3027
Commands.register('aws.dynamoDb.refreshExplorer', async (node: DynamoDbInstanceNode) => node.refresh()),
3128

32-
Commands.register(
33-
'aws.dynamoDb.viewTable',
34-
async (node: DynamoDbTableNode) => await viewDynamoDbTable(context, node)
35-
),
29+
Commands.register('aws.dynamoDb.viewTable', async (node: DynamoDbTableNode) => {
30+
return telemetry.dynamodb_openTable.run(async () => {
31+
await viewDynamoDbTable(context, node)
32+
})
33+
}),
3634

3735
Commands.register('aws.dynamoDb.deleteTable', async (node: DynamoDbTableNode) => {
3836
await deleteDynamoDbTable(node)

packages/core/src/dynamoDb/commands/deleteDynamoDbTable.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,20 @@ export async function deleteDynamoDbTable(
3333

3434
await telemetry.dynamodb_deleteTable.run(async () => {
3535
telemetry.record({ action: 'user' })
36-
const response = await client.deleteTable({ TableName: node.dynamoDbtable })
37-
if (response.TableDescription && response.TableDescription.TableName) {
38-
getLogger().debug(`Deleted DynamoDB table: ${response.TableDescription.TableName}`)
39-
node.parentNode.refresh()
40-
return
36+
try {
37+
const response = await client.deleteTable({ TableName: node.dynamoDbtable })
38+
if (response.TableDescription && response.TableDescription.TableName) {
39+
getLogger().debug(`Deleted DynamoDB table: ${response.TableDescription.TableName}`)
40+
await new Promise((resolve) => setTimeout(resolve, 3000)).then(async () => {
41+
await node.parentNode.refreshNode()
42+
})
43+
} else {
44+
throw new Error(`Delete failed with error : ${JSON.stringify(response)}`)
45+
}
46+
} catch (err) {
47+
const errorString = `Failed to delete DynamoDB table: ${node.dynamoDbtable}`
48+
getLogger().error(errorString)
49+
throw new Error(errorString)
4150
}
42-
const errorString = `Failed to delete DynamoDB table: ${node.dynamoDbtable}`
43-
getLogger().error(errorString)
44-
throw new Error(errorString)
4551
})
4652
}

packages/core/src/dynamoDb/commands/searchDynamoDbTables.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
import * as nls from 'vscode-nls'
77
import { Wizard } from '../../shared/wizards/wizard'
8-
import { telemetry } from '../../shared/telemetry/telemetry'
98
import { DataQuickPickItem } from '../../shared/ui/pickerPrompter'
109
import { DynamoDbClient } from '../../shared/clients/dynamoDbClient'
1110
import { toArrayAsync } from '../../shared/utilities/collectionUtils'
1211
import { CancellationError } from '../../shared/utilities/timeoutUtils'
1312
import { RegionSubmenu, RegionSubmenuResponse } from '../../shared/ui/common/regionSubmenu'
1413
import { ExtContext } from '../../shared/extensions'
1514
import { viewDynamoDbTable } from '../vue/tableView'
15+
import { telemetry } from '../../shared/telemetry'
1616

1717
const localize = nls.loadMessageBundle()
1818

packages/core/src/dynamoDb/explorer/dynamoDbInstanceNode.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { DynamoDbClient } from '../../shared/clients/dynamoDbClient'
1010
import { AWSTreeNodeBase } from '../../shared/treeview/nodes/awsTreeNodeBase'
1111
import { PlaceholderNode } from '../../shared/treeview/nodes/placeholderNode'
1212
import { toMap, toArrayAsync, updateInPlace } from '../../shared/utilities/collectionUtils'
13+
import { telemetry } from '../../shared/telemetry'
1314

1415
export class DynamoDbInstanceNode extends AWSTreeNodeBase {
1516
protected readonly placeHolderMessage = '[No Tables Found]'
@@ -35,13 +36,25 @@ export class DynamoDbInstanceNode extends AWSTreeNodeBase {
3536
}
3637

3738
public async updateChildren(): Promise<void> {
38-
const tables = toMap(await toArrayAsync(this.dynamoDbClient.getTables()), (configuration) => configuration)
39-
const sortedTablesByName = new Map([...tables.entries()].sort((a, b) => a[0].localeCompare(b[0])))
40-
updateInPlace(
41-
this.dynamoDbTableNodes,
42-
sortedTablesByName.keys(),
43-
(key) => this.dynamoDbTableNodes.get(key)!,
44-
(key) => new DynamoDbTableNode(this.regionCode, key, this)
45-
)
39+
return telemetry.dynamodb_view.run(async (span) => {
40+
span.record({ dynamoDbTarget: 'table' })
41+
const tables = toMap(await toArrayAsync(this.dynamoDbClient.getTables()), (configuration) => configuration)
42+
const sortedTablesByName = new Map([...tables.entries()].sort((a, b) => a[0].localeCompare(b[0])))
43+
updateInPlace(
44+
this.dynamoDbTableNodes,
45+
sortedTablesByName.keys(),
46+
(key) => this.dynamoDbTableNodes.get(key)!,
47+
(key) => new DynamoDbTableNode(this.regionCode, key, this)
48+
)
49+
})
50+
}
51+
52+
public async clearChildren() {
53+
this.dynamoDbTableNodes = new Map<string, DynamoDbTableNode>()
54+
}
55+
56+
public async refreshNode(): Promise<void> {
57+
await this.clearChildren()
58+
await vscode.commands.executeCommand('aws.refreshAwsExplorerNode', this)
4659
}
4760
}

packages/core/src/dynamoDb/utils/dynamodb.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { copyToClipboard } from '../../shared/utilities/messages'
1010
import { DynamoDbTableNode } from '../explorer/dynamoDbTableNode'
1111
import { DynamoDbClient } from '../../shared/clients/dynamoDbClient'
1212
import { AttributeValue, Key, ScanInput } from 'aws-sdk/clients/dynamodb'
13+
import { telemetry } from '../../shared/telemetry'
1314

1415
export interface RowData {
1516
[key: string]: string
@@ -33,11 +34,12 @@ export interface TableSchema {
3334
export async function getTableContent(
3435
tableRequest: ScanInput,
3536
regionCode: string,
37+
tableSchema: TableSchema,
3638
client = new DynamoDbClient(regionCode)
3739
) {
3840
tableRequest.Limit = await getMaxItemsPerPage()
3941
const response = await client.scanTable(tableRequest)
40-
const { columnNames, tableHeader } = getTableColumnsNames(response)
42+
const { columnNames, tableHeader } = getTableColumnsNames(response, tableSchema)
4143
const tableItems = getTableItems(columnNames, response)
4244

4345
const tableData: TableData = {
@@ -48,25 +50,38 @@ export async function getTableContent(
4850
return tableData
4951
}
5052

51-
export function getTableColumnsNames(items: DynamoDB.Types.ScanOutput): {
53+
export function getTableColumnsNames(
54+
items: DynamoDB.Types.ScanOutput,
55+
tableSchema: TableSchema
56+
): {
5257
columnNames: Set<string>
5358
tableHeader: RowData[]
5459
} {
5560
const tableColumnsNames = new Set<string>()
5661
const tableHeader = [] as RowData[]
62+
const response = {
63+
columnNames: tableColumnsNames,
64+
tableHeader: tableHeader,
65+
}
66+
if (!items.Items || items.Items.length === 0) {
67+
return response
68+
}
69+
tableColumnsNames.add(tableSchema.partitionKey.name)
70+
if (tableSchema.sortKey) {
71+
tableColumnsNames.add(tableSchema.sortKey.name)
72+
}
5773
for (const item of items.Items ?? []) {
5874
for (const key of Object.keys(item)) {
59-
tableColumnsNames.add(key)
75+
if (!tableColumnsNames.has(key)) {
76+
tableColumnsNames.add(key)
77+
}
6078
}
6179
}
6280
for (const columnName of tableColumnsNames) {
6381
tableHeader.push({ columnDataKey: columnName, title: columnName })
6482
}
6583

66-
return {
67-
columnNames: tableColumnsNames,
68-
tableHeader: tableHeader,
69-
}
84+
return response
7085
}
7186

7287
export function getTableItems(tableColumnsNames: Set<string>, items: DynamoDB.Types.ScanOutput) {
@@ -92,24 +107,30 @@ export function getTableItems(tableColumnsNames: Set<string>, items: DynamoDB.Ty
92107
* @param {DynamoDbTableNode} node - The DynamoDB table node containing table and region information.
93108
*/
94109
export async function copyDynamoDbArn(node: DynamoDbTableNode, client = new DynamoDbClient(node.regionCode)) {
95-
const response = await client.getTableInformation({ TableName: node.dynamoDbtable })
96-
if (response.TableArn !== undefined) {
97-
await copyToClipboard(response.TableArn, 'ARN')
98-
}
110+
return telemetry.dynamodb_view.run(async (span) => {
111+
const response = await client.getTableInformation({ TableName: node.dynamoDbtable })
112+
if (response.TableArn !== undefined) {
113+
span.emit({ dynamoDbTarget: 'tableProperties', result: 'Succeeded' })
114+
await copyToClipboard(response.TableArn, 'ARN')
115+
} else {
116+
span.emit({ dynamoDbTarget: 'tableProperties', result: 'Failed', reason: 'Table ARN is undefined' })
117+
}
118+
})
99119
}
100120

101121
export async function queryTableContent(
102122
queryRequest: { partitionKey: string; sortKey: string },
103123
regionCode: string,
104124
tableName: string,
125+
tableSchema: TableSchema,
105126
lastEvaluatedKey?: Key,
106127
client = new DynamoDbClient(regionCode)
107128
) {
108129
const queryRequestObject = await prepareQueryRequestObject(tableName, regionCode, client, queryRequest)
109130
queryRequestObject.Limit = await getMaxItemsPerPage()
110131
queryRequestObject.ExclusiveStartKey = lastEvaluatedKey
111132
const queryResponse = await client.queryTable(queryRequestObject)
112-
const { columnNames, tableHeader } = getTableColumnsNames(queryResponse)
133+
const { columnNames, tableHeader } = getTableColumnsNames(queryResponse, tableSchema)
113134
const tableItems = getTableItems(columnNames, queryResponse)
114135

115136
const tableData: TableData = {

0 commit comments

Comments
 (0)