Skip to content

Commit 8055019

Browse files
authored
Improve UseCase API Performance (#1057)
1 parent 665471f commit 8055019

File tree

5 files changed

+50
-43
lines changed

5 files changed

+50
-43
lines changed

packages/cdk/lambda/useCaseBuilder/useCaseBuilderRepository.ts

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
UpdateCommand,
1818
BatchWriteCommand,
1919
TransactWriteCommand,
20+
QueryCommandOutput,
2021
} from '@aws-sdk/lib-dynamodb';
2122
import * as crypto from 'crypto';
2223
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
@@ -35,32 +36,30 @@ const getUserIdFromKey = (key: string): string => {
3536
return key.split('#').slice(1).join('#');
3637
};
3738

39+
// Create a query command to get use case by useCaseId
40+
const createFindUseCaseByUseCaseIdCommand = (useCaseId: string) =>
41+
new QueryCommand({
42+
TableName: USECASE_TABLE_NAME,
43+
IndexName: USECASE_ID_INDEX_NAME,
44+
KeyConditionExpression:
45+
'#useCaseId = :useCaseId and begins_with(#dataType, :dataTypePrefix)',
46+
ExpressionAttributeNames: {
47+
'#useCaseId': 'useCaseId',
48+
'#dataType': 'dataType',
49+
},
50+
ExpressionAttributeValues: {
51+
':useCaseId': useCaseId,
52+
':dataTypePrefix': 'useCase',
53+
},
54+
});
55+
3856
// Get use case by useCaseId
3957
const innerFindUseCaseByUseCaseId = async (
4058
useCaseId: string
4159
): Promise<UseCaseInTable | null> => {
42-
const useCaseInTable = await dynamoDbDocument.send(
43-
new QueryCommand({
44-
TableName: USECASE_TABLE_NAME,
45-
IndexName: USECASE_ID_INDEX_NAME,
46-
KeyConditionExpression:
47-
'#useCaseId = :useCaseId and begins_with(#dataType, :dataTypePrefix)',
48-
ExpressionAttributeNames: {
49-
'#useCaseId': 'useCaseId',
50-
'#dataType': 'dataType',
51-
},
52-
ExpressionAttributeValues: {
53-
':useCaseId': useCaseId,
54-
':dataTypePrefix': 'useCase',
55-
},
56-
})
57-
);
58-
59-
if (useCaseInTable.Items && useCaseInTable.Items.length > 0) {
60-
return useCaseInTable.Items[0] as UseCaseInTable;
61-
} else {
62-
return null;
63-
}
60+
const command = createFindUseCaseByUseCaseIdCommand(useCaseId);
61+
const useCaseInTable = await dynamoDbDocument.send(command);
62+
return (useCaseInTable.Items?.[0] as UseCaseInTable) || null;
6463
};
6564

6665
// Get use case list by userId
@@ -104,17 +103,16 @@ const innerFindUseCasesByUserId = async (
104103
const innerFindUseCasesByUseCaseIds = async (
105104
useCaseIds: string[]
106105
): Promise<UseCaseInTable[]> => {
107-
const useCasesInTable: UseCaseInTable[] = [];
108-
109-
for (const useCaseId of useCaseIds) {
110-
const useCaseInTable = await innerFindUseCaseByUseCaseId(useCaseId);
111-
112-
if (useCaseInTable) {
113-
useCasesInTable.push(useCaseInTable);
114-
}
115-
}
116-
117-
return useCasesInTable;
106+
// Run multiple queries in parallel
107+
const useCasesInTable: QueryCommandOutput[] = await Promise.all(
108+
useCaseIds.map((useCaseId) =>
109+
dynamoDb.send(createFindUseCaseByUseCaseIdCommand(useCaseId))
110+
)
111+
);
112+
return useCasesInTable.flatMap(
113+
(useCaseInTable) =>
114+
(useCaseInTable.Items?.slice(0, 1) || []) as UseCaseInTable[]
115+
);
118116
};
119117

120118
// Get list of specific data type (favorite, recently used) by userId (all)
@@ -499,18 +497,19 @@ export const listRecentlyUsedUseCases = async (
499497
exclusiveStartKey
500498
);
501499
const useCaseIds = commons.map((c) => c.useCaseId);
502-
const useCasesInTable = await innerFindUseCasesByUseCaseIds(useCaseIds);
503500

504-
const favorites = await innerFindCommonsByUserIdAndDataType(
505-
userId,
506-
'favorite'
507-
);
508-
const favoritesUseCaseIds = favorites.map((f) => f.useCaseId);
501+
const [useCasesInTable, favorites] = await Promise.all([
502+
// List user's use cases
503+
innerFindUseCasesByUseCaseIds(useCaseIds),
504+
// List user's favorites
505+
innerFindCommonsByUserIdAndDataType(userId, 'favorite'),
506+
]);
507+
const favoritesUseCaseIds = new Set(favorites.map((f) => f.useCaseId));
509508

510509
const useCasesAsOutput: UseCaseAsOutput[] = useCasesInTable.map((u) => {
511510
return {
512511
...u,
513-
isFavorite: favoritesUseCaseIds.includes(u.useCaseId),
512+
isFavorite: favoritesUseCaseIds.has(u.useCaseId),
514513
isMyUseCase: getUserIdFromKey(u.id) === userId,
515514
};
516515
});

packages/cdk/lib/construct/use-case-builder.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class UseCaseBuilder extends Construct {
6464
// Add UseCaseBuilder related APIs
6565
const listUseCasesFunction = new NodejsFunction(this, 'ListUseCases', {
6666
...commonProperty,
67+
memorySize: 512,
6768
entry: `${commonPath}/listUseCases.ts`,
6869
});
6970
useCaseBuilderTable.grantReadData(listUseCasesFunction);
@@ -73,6 +74,7 @@ export class UseCaseBuilder extends Construct {
7374
'ListFavoriteUseCases',
7475
{
7576
...commonProperty,
77+
memorySize: 512,
7678
entry: `${commonPath}/listFavoriteUseCases.ts`,
7779
environment: {
7880
...commonProperty.environment,
@@ -84,6 +86,7 @@ export class UseCaseBuilder extends Construct {
8486

8587
const getUseCaseFunction = new NodejsFunction(this, 'GetUseCase', {
8688
...commonProperty,
89+
memorySize: 512,
8790
entry: `${commonPath}/getUseCase.ts`,
8891
});
8992
useCaseBuilderTable.grantReadData(getUseCaseFunction);
@@ -123,6 +126,7 @@ export class UseCaseBuilder extends Construct {
123126
'ListRecentlyUsedUseCases',
124127
{
125128
...commonProperty,
129+
memorySize: 512,
126130
entry: `${commonPath}/listRecentlyUsedUseCases.ts`,
127131
}
128132
);

packages/cdk/test/__snapshots__/generative-ai-use-cases.test.ts.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17635,6 +17635,7 @@ exports[`GenerativeAiUseCases matches the snapshot 5`] = `
1763517635
},
1763617636
},
1763717637
"Handler": "index.handler",
17638+
"MemorySize": 512,
1763817639
"Role": {
1763917640
"Fn::GetAtt": [
1764017641
"UseCaseBuilderGetUseCaseServiceRoleF32AAC5F",
@@ -17753,6 +17754,7 @@ exports[`GenerativeAiUseCases matches the snapshot 5`] = `
1775317754
},
1775417755
},
1775517756
"Handler": "index.handler",
17757+
"MemorySize": 512,
1775617758
"Role": {
1775717759
"Fn::GetAtt": [
1775817760
"UseCaseBuilderListFavoriteUseCasesServiceRole5BCFD9A7",
@@ -17871,6 +17873,7 @@ exports[`GenerativeAiUseCases matches the snapshot 5`] = `
1787117873
},
1787217874
},
1787317875
"Handler": "index.handler",
17876+
"MemorySize": 512,
1787417877
"Role": {
1787517878
"Fn::GetAtt": [
1787617879
"UseCaseBuilderListRecentlyUsedUseCasesServiceRole977F8D35",
@@ -17989,6 +17992,7 @@ exports[`GenerativeAiUseCases matches the snapshot 5`] = `
1798917992
},
1799017993
},
1799117994
"Handler": "index.handler",
17995+
"MemorySize": 512,
1799217996
"Role": {
1799317997
"Fn::GetAtt": [
1799417998
"UseCaseBuilderListUseCasesServiceRoleDE660444",

packages/types/src/protocolUseCaseBuilder.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export type ListRecentlyUsedUseCasesResponse = Pagination<UseCaseAsOutput>;
1313
export type GetUseCaseResponse = UseCaseAsOutput;
1414

1515
export type CreateUseCaseRequest = UseCaseContent;
16-
export type CreateUseCaseRespose = UseCaseAsOutput;
16+
export type CreateUseCaseResponse = UseCaseAsOutput;
1717

1818
export type UpdateUseCaseRequest = UseCaseContent;
1919

packages/web/src/hooks/useCaseBuilder/useUseCaseBuilderApi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
CreateUseCaseRequest,
3-
CreateUseCaseRespose,
3+
CreateUseCaseResponse,
44
GetUseCaseResponse,
55
ListFavoriteUseCasesResponse,
66
ListRecentlyUsedUseCasesResponse,
@@ -62,7 +62,7 @@ const useUseCaseBuilderApi = () => {
6262
},
6363
createUseCase: async (params: CreateUseCaseRequest) => {
6464
return http
65-
.post<CreateUseCaseRespose, CreateUseCaseRequest>('/usecases', params)
65+
.post<CreateUseCaseResponse, CreateUseCaseRequest>('/usecases', params)
6666
.then((res) => {
6767
return res.data;
6868
});

0 commit comments

Comments
 (0)