@exabugs/dynamodb-client 1.3.35 → 1.3.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/dist/server/handler.cjs +710 -1639
- package/dist/server/handler.cjs.map +4 -4
- package/dist/server/operations/deleteOne.d.ts +4 -5
- package/dist/server/operations/deleteOne.d.ts.map +1 -1
- package/dist/server/operations/deleteOne.js +51 -71
- package/dist/server/operations/deleteOne.js.map +1 -1
- package/dist/server/operations/findMany.d.ts +4 -2
- package/dist/server/operations/findMany.d.ts.map +1 -1
- package/dist/server/operations/findMany.js +66 -39
- package/dist/server/operations/findMany.js.map +1 -1
- package/dist/server/operations/findOne.d.ts +4 -4
- package/dist/server/operations/findOne.d.ts.map +1 -1
- package/dist/server/operations/findOne.js +28 -41
- package/dist/server/operations/findOne.js.map +1 -1
- package/dist/server/operations/insertOne.d.ts +4 -5
- package/dist/server/operations/insertOne.d.ts.map +1 -1
- package/dist/server/operations/insertOne.js +33 -48
- package/dist/server/operations/insertOne.js.map +1 -1
- package/dist/server/operations/parameterConverter.d.ts +1 -0
- package/dist/server/operations/parameterConverter.d.ts.map +1 -1
- package/dist/server/operations/parameterConverter.js +13 -5
- package/dist/server/operations/parameterConverter.js.map +1 -1
- package/dist/server/operations/updateOne.d.ts +9 -7
- package/dist/server/operations/updateOne.d.ts.map +1 -1
- package/dist/server/operations/updateOne.js +68 -267
- package/dist/server/operations/updateOne.js.map +1 -1
- package/dist/server/types.d.ts +2 -10
- package/dist/server/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -3,16 +3,15 @@ import type { DeleteOneParams, DeleteOneResult } from '../types.js';
|
|
|
3
3
|
* deleteOne 操作を実行する
|
|
4
4
|
*
|
|
5
5
|
* 処理フロー:
|
|
6
|
-
* 1. filter
|
|
7
|
-
* 2.
|
|
8
|
-
* 3.
|
|
9
|
-
* 4. TransactWriteItemsでメインレコード + 全シャドーレコードを削除
|
|
6
|
+
* 1. deleteMany([id])を呼び出す(idまたはfilterから対象を特定)
|
|
7
|
+
* 2. 結果を検証し、失敗した場合は通常のErrorをスロー
|
|
8
|
+
* 3. 成功した場合は削除されたIDを返却
|
|
10
9
|
*
|
|
11
10
|
* @param resource - リソース名
|
|
12
11
|
* @param params - deleteOneパラメータ
|
|
13
12
|
* @param requestId - リクエストID
|
|
14
13
|
* @returns 削除されたレコードのID
|
|
15
|
-
* @throws {
|
|
14
|
+
* @throws {Error} レコードが存在しない場合、または削除に失敗した場合
|
|
16
15
|
*/
|
|
17
16
|
export declare function handleDeleteOne(resource: string, params: DeleteOneParams, requestId: string): Promise<DeleteOneResult>;
|
|
18
17
|
//# sourceMappingURL=deleteOne.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/deleteOne.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deleteOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/deleteOne.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIpE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAkF1B"}
|
|
@@ -3,28 +3,28 @@
|
|
|
3
3
|
* 単一レコードを削除する
|
|
4
4
|
*
|
|
5
5
|
* 要件: 4.4, 5.2, 5.3
|
|
6
|
+
*
|
|
7
|
+
* リファクタリング: deleteManyを内部で使用
|
|
6
8
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import { ItemNotFoundError, createLogger } from '../../shared/index.js';
|
|
9
|
-
import { generateMainRecordSK } from '../shadow/index.js';
|
|
10
|
-
import { executeDynamoDBOperation, getDBClient, getTableName } from '../utils/dynamodb.js';
|
|
9
|
+
import { createLogger } from '../../shared/index.js';
|
|
11
10
|
const logger = createLogger({ service: 'records-lambda' });
|
|
12
11
|
/**
|
|
13
12
|
* deleteOne 操作を実行する
|
|
14
13
|
*
|
|
15
14
|
* 処理フロー:
|
|
16
|
-
* 1. filter
|
|
17
|
-
* 2.
|
|
18
|
-
* 3.
|
|
19
|
-
* 4. TransactWriteItemsでメインレコード + 全シャドーレコードを削除
|
|
15
|
+
* 1. deleteMany([id])を呼び出す(idまたはfilterから対象を特定)
|
|
16
|
+
* 2. 結果を検証し、失敗した場合は通常のErrorをスロー
|
|
17
|
+
* 3. 成功した場合は削除されたIDを返却
|
|
20
18
|
*
|
|
21
19
|
* @param resource - リソース名
|
|
22
20
|
* @param params - deleteOneパラメータ
|
|
23
21
|
* @param requestId - リクエストID
|
|
24
22
|
* @returns 削除されたレコードのID
|
|
25
|
-
* @throws {
|
|
23
|
+
* @throws {Error} レコードが存在しない場合、または削除に失敗した場合
|
|
26
24
|
*/
|
|
27
25
|
export async function handleDeleteOne(resource, params, requestId) {
|
|
26
|
+
// deleteManyをインポート
|
|
27
|
+
const { handleDeleteMany } = await import('./deleteMany.js');
|
|
28
28
|
// idまたはfilterから対象レコードを特定
|
|
29
29
|
let targetId;
|
|
30
30
|
if ('id' in params) {
|
|
@@ -35,6 +35,23 @@ export async function handleDeleteOne(resource, params, requestId) {
|
|
|
35
35
|
resource,
|
|
36
36
|
id: targetId,
|
|
37
37
|
});
|
|
38
|
+
// deleteMany([id])を呼び出す
|
|
39
|
+
const deleteManyResult = await handleDeleteMany(resource, {
|
|
40
|
+
ids: [targetId],
|
|
41
|
+
}, requestId);
|
|
42
|
+
// 結果を検証
|
|
43
|
+
if (deleteManyResult.count === 0) {
|
|
44
|
+
// 削除に失敗した場合
|
|
45
|
+
const error = Object.values(deleteManyResult.errors)[0];
|
|
46
|
+
if (error) {
|
|
47
|
+
throw new Error(`Failed to delete record: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new Error(`Failed to delete record: ${targetId}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 既存のインターフェースを維持: { id } を返す
|
|
54
|
+
return { id: targetId };
|
|
38
55
|
}
|
|
39
56
|
else {
|
|
40
57
|
// filterが指定されている場合
|
|
@@ -43,70 +60,33 @@ export async function handleDeleteOne(resource, params, requestId) {
|
|
|
43
60
|
resource,
|
|
44
61
|
filter: params.filter,
|
|
45
62
|
});
|
|
46
|
-
// filter
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
// deleteMany({ filter })を呼び出す
|
|
64
|
+
const deleteManyResult = await handleDeleteMany(resource, {
|
|
65
|
+
filter: params.filter,
|
|
66
|
+
}, requestId);
|
|
67
|
+
// 結果を検証
|
|
68
|
+
if (deleteManyResult.count === 0) {
|
|
69
|
+
// 削除に失敗した場合
|
|
70
|
+
const error = Object.values(deleteManyResult.errors)[0];
|
|
71
|
+
if (error) {
|
|
72
|
+
throw new Error(`Failed to delete record: ${error.message}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw new Error(`No records found matching filter`);
|
|
76
|
+
}
|
|
54
77
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
TableName: tableName,
|
|
65
|
-
Key: {
|
|
66
|
-
PK: resource,
|
|
67
|
-
SK: mainSK,
|
|
68
|
-
},
|
|
69
|
-
ConsistentRead: true,
|
|
70
|
-
})), 'GetItem');
|
|
71
|
-
if (!getResult.Item) {
|
|
72
|
-
throw new ItemNotFoundError(`Record not found: ${targetId}`, { resource, id: targetId });
|
|
73
|
-
}
|
|
74
|
-
const existingData = getResult.Item.data;
|
|
75
|
-
const shadowKeys = existingData.__shadowKeys || [];
|
|
76
|
-
// TransactWriteItemsで一括削除
|
|
77
|
-
const transactItems = [];
|
|
78
|
-
// メインレコードを削除
|
|
79
|
-
transactItems.push({
|
|
80
|
-
Delete: {
|
|
81
|
-
TableName: tableName,
|
|
82
|
-
Key: {
|
|
83
|
-
PK: resource,
|
|
84
|
-
SK: mainSK,
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
// 全シャドーレコードを削除
|
|
89
|
-
for (const shadowSK of shadowKeys) {
|
|
90
|
-
transactItems.push({
|
|
91
|
-
Delete: {
|
|
92
|
-
TableName: tableName,
|
|
93
|
-
Key: {
|
|
94
|
-
PK: resource,
|
|
95
|
-
SK: shadowSK,
|
|
96
|
-
},
|
|
97
|
-
},
|
|
78
|
+
// 成功した場合は削除されたレコードのIDを取得
|
|
79
|
+
const deletedId = Object.values(deleteManyResult.successIds)[0];
|
|
80
|
+
if (!deletedId) {
|
|
81
|
+
throw new Error('Failed to get deleted record ID');
|
|
82
|
+
}
|
|
83
|
+
logger.info('deleteOne succeeded', {
|
|
84
|
+
requestId,
|
|
85
|
+
resource,
|
|
86
|
+
id: deletedId,
|
|
98
87
|
});
|
|
88
|
+
// 既存のインターフェースを維持: { id } を返す
|
|
89
|
+
return { id: deletedId };
|
|
99
90
|
}
|
|
100
|
-
// トランザクション実行
|
|
101
|
-
await executeDynamoDBOperation(() => dbClient.send(new TransactWriteCommand({
|
|
102
|
-
TransactItems: transactItems,
|
|
103
|
-
})), 'TransactWriteItems');
|
|
104
|
-
logger.info('deleteOne succeeded', {
|
|
105
|
-
requestId,
|
|
106
|
-
resource,
|
|
107
|
-
id: targetId,
|
|
108
|
-
shadowCount: shadowKeys.length,
|
|
109
|
-
});
|
|
110
|
-
return { id: targetId };
|
|
111
91
|
}
|
|
112
92
|
//# sourceMappingURL=deleteOne.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteOne.js","sourceRoot":"","sources":["../../../src/server/operations/deleteOne.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deleteOne.js","sourceRoot":"","sources":["../../../src/server/operations/deleteOne.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,MAAuB,EACvB,SAAiB;IAEjB,mBAAmB;IACnB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7D,yBAAyB;IACzB,IAAI,QAA4B,CAAC;IAEjC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QACnB,eAAe;QACf,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;QAErB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,SAAS;YACT,QAAQ;YACR,EAAE,EAAE,QAAQ;SACb,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAC7C,QAAQ,EACR;YACE,GAAG,EAAE,CAAC,QAAQ,CAAC;SAChB,EACD,SAAS,CACV,CAAC;QAEF,QAAQ;QACR,IAAI,gBAAgB,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACjC,YAAY;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC9C,SAAS;YACT,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAC7C,QAAQ,EACR;YACE,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,EACD,SAAS,CACV,CAAC;QAEF,QAAQ;QACR,IAAI,gBAAgB,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACjC,YAAY;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACjC,SAAS;YACT,QAAQ;YACR,EAAE,EAAE,SAAS;SACd,CAAC,CAAC;QAEH,6BAA6B;QAC7B,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -2,10 +2,12 @@ import type { FindManyParams, FindManyResult } from '../types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* findMany 操作を実行する
|
|
4
4
|
*
|
|
5
|
-
* BatchGetItemで複数のメインレコードを取得し、
|
|
5
|
+
* idsが指定された場合はBatchGetItemで複数のメインレコードを取得し、
|
|
6
|
+
* filterが指定された場合はfind操作で検索する。
|
|
7
|
+
* __shadowKeysを除外してレスポンスを返す。
|
|
6
8
|
*
|
|
7
9
|
* @param resource - リソース名
|
|
8
|
-
* @param params - findMany
|
|
10
|
+
* @param params - findManyパラメータ(idsまたはfilter)
|
|
9
11
|
* @param requestId - リクエストID
|
|
10
12
|
* @returns レコードデータの配列
|
|
11
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../src/server/operations/findMany.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../../src/server/operations/findMany.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlE;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAuFzB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* findMany 操作
|
|
3
|
-
* 複数レコードをID
|
|
3
|
+
* 複数レコードをIDリストまたはフィルター条件で取得する
|
|
4
4
|
*
|
|
5
5
|
* 要件: 4.3, 5.4, 5.5
|
|
6
6
|
*/
|
|
@@ -8,54 +8,81 @@ import { BatchGetCommand } from '@aws-sdk/lib-dynamodb';
|
|
|
8
8
|
import { createLogger } from '../../shared/index.js';
|
|
9
9
|
import { generateMainRecordSK } from '../shadow/index.js';
|
|
10
10
|
import { executeDynamoDBOperation, extractCleanRecord, getDBClient, getTableName, } from '../utils/dynamodb.js';
|
|
11
|
+
import { handleFind } from './find.js';
|
|
11
12
|
const logger = createLogger({ service: 'records-lambda' });
|
|
12
13
|
/**
|
|
13
14
|
* findMany 操作を実行する
|
|
14
15
|
*
|
|
15
|
-
* BatchGetItemで複数のメインレコードを取得し、
|
|
16
|
+
* idsが指定された場合はBatchGetItemで複数のメインレコードを取得し、
|
|
17
|
+
* filterが指定された場合はfind操作で検索する。
|
|
18
|
+
* __shadowKeysを除外してレスポンスを返す。
|
|
16
19
|
*
|
|
17
20
|
* @param resource - リソース名
|
|
18
|
-
* @param params - findMany
|
|
21
|
+
* @param params - findManyパラメータ(idsまたはfilter)
|
|
19
22
|
* @param requestId - リクエストID
|
|
20
23
|
* @returns レコードデータの配列
|
|
21
24
|
*/
|
|
22
25
|
export async function handleFindMany(resource, params, requestId) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
26
|
+
// idsが指定された場合は従来通りBatchGetItemで取得
|
|
27
|
+
if ('ids' in params) {
|
|
28
|
+
const { ids } = params;
|
|
29
|
+
logger.debug('Executing findMany by ids', {
|
|
30
|
+
requestId,
|
|
31
|
+
resource,
|
|
32
|
+
count: ids.length,
|
|
33
|
+
});
|
|
34
|
+
// IDが空の場合は空配列を返す
|
|
35
|
+
if (ids.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const dbClient = getDBClient();
|
|
39
|
+
const tableName = getTableName();
|
|
40
|
+
// BatchGetItemのキーを生成
|
|
41
|
+
const keys = ids.map((id) => ({
|
|
42
|
+
PK: resource,
|
|
43
|
+
SK: generateMainRecordSK(id),
|
|
44
|
+
}));
|
|
45
|
+
// BatchGetItemでレコードを取得(ConsistentRead=true)
|
|
46
|
+
const result = await executeDynamoDBOperation(() => dbClient.send(new BatchGetCommand({
|
|
47
|
+
RequestItems: {
|
|
48
|
+
[tableName]: {
|
|
49
|
+
Keys: keys,
|
|
50
|
+
ConsistentRead: true,
|
|
51
|
+
},
|
|
46
52
|
},
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
})), 'BatchGetItem');
|
|
54
|
+
// レスポンスからレコードを抽出
|
|
55
|
+
const items = result.Responses?.[tableName] || [];
|
|
56
|
+
// data属性から__shadowKeysを除外
|
|
57
|
+
const records = items.map((item) => extractCleanRecord(item));
|
|
58
|
+
logger.info('findMany by ids succeeded', {
|
|
59
|
+
requestId,
|
|
60
|
+
resource,
|
|
61
|
+
requested: ids.length,
|
|
62
|
+
found: records.length,
|
|
63
|
+
});
|
|
64
|
+
return records;
|
|
65
|
+
}
|
|
66
|
+
// filterが指定された場合はfind操作で検索
|
|
67
|
+
if ('filter' in params) {
|
|
68
|
+
const { filter } = params;
|
|
69
|
+
logger.debug('Executing findMany by filter', {
|
|
70
|
+
requestId,
|
|
71
|
+
resource,
|
|
72
|
+
filter,
|
|
73
|
+
});
|
|
74
|
+
const findResult = await handleFind(resource, {
|
|
75
|
+
filter,
|
|
76
|
+
}, requestId);
|
|
77
|
+
logger.info('findMany by filter succeeded', {
|
|
78
|
+
requestId,
|
|
79
|
+
resource,
|
|
80
|
+
filter,
|
|
81
|
+
found: findResult.items.length,
|
|
82
|
+
});
|
|
83
|
+
return findResult.items;
|
|
84
|
+
}
|
|
85
|
+
// idsもfilterも指定されていない場合(型的にはありえないが念のため)
|
|
86
|
+
throw new Error('findMany requires either ids or filter');
|
|
60
87
|
}
|
|
61
88
|
//# sourceMappingURL=findMany.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findMany.js","sourceRoot":"","sources":["../../../src/server/operations/findMany.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,YAAY,GACb,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"findMany.js","sourceRoot":"","sources":["../../../src/server/operations/findMany.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,14 @@ import type { FindOneParams, FindOneResult } from '../types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* findOne 操作を実行する
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* findManyを内部で使用して単一レコードを取得する。
|
|
6
|
+
* idが指定された場合はfindMany([id])を呼び出し、
|
|
7
|
+
* filterが指定された場合はfindMany({ filter })を呼び出して最初の結果を返す。
|
|
8
8
|
*
|
|
9
9
|
* @param resource - リソース名
|
|
10
10
|
* @param params - findOneパラメータ(idまたはfilter)
|
|
11
11
|
* @param requestId - リクエストID
|
|
12
|
-
* @returns
|
|
12
|
+
* @returns レコードデータ(単一レコードオブジェクト)
|
|
13
13
|
* @throws {ItemNotFoundError} レコードが存在しない場合
|
|
14
14
|
*/
|
|
15
15
|
export declare function handleFindOne(resource: string, params: FindOneParams, requestId: string): Promise<FindOneResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/findOne.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/findOne.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKhE;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA2DxB"}
|
|
@@ -2,75 +2,61 @@
|
|
|
2
2
|
* findOne 操作
|
|
3
3
|
* 単一レコードをIDまたはフィルター条件で取得する
|
|
4
4
|
*
|
|
5
|
+
* リファクタリング: findManyを内部で使用してコードの重複を削減
|
|
6
|
+
*
|
|
5
7
|
* 要件: 4.3, 5.4, 5.5
|
|
6
8
|
*/
|
|
7
|
-
import { GetCommand } from '@aws-sdk/lib-dynamodb';
|
|
8
9
|
import { ItemNotFoundError, createLogger } from '../../shared/index.js';
|
|
9
|
-
import {
|
|
10
|
-
import { executeDynamoDBOperation, extractCleanRecord, getDBClient, getTableName, } from '../utils/dynamodb.js';
|
|
11
|
-
import { handleFind } from './find.js';
|
|
10
|
+
import { handleFindMany } from './findMany.js';
|
|
12
11
|
const logger = createLogger({ service: 'records-lambda' });
|
|
13
12
|
/**
|
|
14
13
|
* findOne 操作を実行する
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* findManyを内部で使用して単一レコードを取得する。
|
|
16
|
+
* idが指定された場合はfindMany([id])を呼び出し、
|
|
17
|
+
* filterが指定された場合はfindMany({ filter })を呼び出して最初の結果を返す。
|
|
19
18
|
*
|
|
20
19
|
* @param resource - リソース名
|
|
21
20
|
* @param params - findOneパラメータ(idまたはfilter)
|
|
22
21
|
* @param requestId - リクエストID
|
|
23
|
-
* @returns
|
|
22
|
+
* @returns レコードデータ(単一レコードオブジェクト)
|
|
24
23
|
* @throws {ItemNotFoundError} レコードが存在しない場合
|
|
25
24
|
*/
|
|
26
25
|
export async function handleFindOne(resource, params, requestId) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
logger.debug('Executing findOne by id', {
|
|
26
|
+
// idが指定された場合はfindManyを1件のIDで呼び出し
|
|
27
|
+
if ('id' in params) {
|
|
28
|
+
const { id } = params;
|
|
29
|
+
logger.debug('Executing findOne by id (using findMany)', {
|
|
31
30
|
requestId,
|
|
32
31
|
resource,
|
|
33
32
|
id,
|
|
34
33
|
});
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
// GetItemでレコードを取得(ConsistentRead=true)
|
|
40
|
-
const result = await executeDynamoDBOperation(() => dbClient.send(new GetCommand({
|
|
41
|
-
TableName: tableName,
|
|
42
|
-
Key: {
|
|
43
|
-
PK: resource,
|
|
44
|
-
SK: sk,
|
|
45
|
-
},
|
|
46
|
-
ConsistentRead: true,
|
|
47
|
-
})), 'GetItem');
|
|
48
|
-
// レコードが存在しない場合
|
|
49
|
-
if (!result.Item) {
|
|
34
|
+
// findManyを呼び出して1件のレコードを取得
|
|
35
|
+
const results = await handleFindMany(resource, { ids: [id] }, requestId);
|
|
36
|
+
// レコードが存在しない場合(既存のインターフェースを維持)
|
|
37
|
+
if (results.length === 0) {
|
|
50
38
|
throw new ItemNotFoundError(`Record not found: ${id}`, { resource, id });
|
|
51
39
|
}
|
|
52
|
-
// data属性から__shadowKeysを除外してレスポンスを返す
|
|
53
|
-
const record = extractCleanRecord(result.Item);
|
|
54
40
|
logger.info('findOne by id succeeded', {
|
|
55
41
|
requestId,
|
|
56
42
|
resource,
|
|
57
43
|
id,
|
|
58
44
|
});
|
|
59
|
-
|
|
45
|
+
// 既存のインターフェースを維持: 単一レコードオブジェクトを返す
|
|
46
|
+
return results[0];
|
|
60
47
|
}
|
|
61
|
-
// filterが指定された場合は
|
|
62
|
-
if (filter) {
|
|
63
|
-
|
|
48
|
+
// filterが指定された場合はfindManyをfilterで呼び出し
|
|
49
|
+
if ('filter' in params) {
|
|
50
|
+
const { filter } = params;
|
|
51
|
+
logger.debug('Executing findOne by filter (using findMany)', {
|
|
64
52
|
requestId,
|
|
65
53
|
resource,
|
|
66
54
|
filter,
|
|
67
55
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// レコードが存在しない場合
|
|
73
|
-
if (!findResult.items || findResult.items.length === 0) {
|
|
56
|
+
// findManyを呼び出してフィルター検索
|
|
57
|
+
const results = await handleFindMany(resource, { filter }, requestId);
|
|
58
|
+
// レコードが存在しない場合(既存のインターフェースを維持)
|
|
59
|
+
if (results.length === 0) {
|
|
74
60
|
throw new ItemNotFoundError(`Record not found with filter`, { resource, filter });
|
|
75
61
|
}
|
|
76
62
|
logger.info('findOne by filter succeeded', {
|
|
@@ -78,9 +64,10 @@ export async function handleFindOne(resource, params, requestId) {
|
|
|
78
64
|
resource,
|
|
79
65
|
filter,
|
|
80
66
|
});
|
|
81
|
-
|
|
67
|
+
// 既存のインターフェースを維持: 単一レコードオブジェクトを返す
|
|
68
|
+
return results[0];
|
|
82
69
|
}
|
|
83
|
-
// idもfilter
|
|
70
|
+
// idもfilterも指定されていない場合(型的にはありえないが念のため)
|
|
84
71
|
throw new Error('findOne requires either id or filter');
|
|
85
72
|
}
|
|
86
73
|
//# sourceMappingURL=findOne.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findOne.js","sourceRoot":"","sources":["../../../src/server/operations/findOne.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"findOne.js","sourceRoot":"","sources":["../../../src/server/operations/findOne.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,MAAqB,EACrB,SAAiB;IAEjB,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAEtB,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;YACvD,SAAS;YACT,QAAQ;YACR,EAAE;SACH,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEzE,+BAA+B;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,SAAS;YACT,QAAQ;YACR,EAAE;SACH,CAAC,CAAC;QAEH,kCAAkC;QAClC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE1B,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE;YAC3D,SAAS;YACT,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;QAEtE,+BAA+B;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,SAAS;YACT,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QAEH,kCAAkC;QAClC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -3,16 +3,15 @@ import type { InsertOneParams, InsertOneResult } from '../types.js';
|
|
|
3
3
|
* insertOne 操作を実行する
|
|
4
4
|
*
|
|
5
5
|
* 処理フロー:
|
|
6
|
-
* 1.
|
|
7
|
-
* 2.
|
|
8
|
-
* 3.
|
|
9
|
-
* 4. メインレコードをPutItemで保存
|
|
10
|
-
* 5. シャドーレコードをPutItemで保存
|
|
6
|
+
* 1. insertMany([data])を呼び出す
|
|
7
|
+
* 2. 結果を検証し、失敗した場合は通常のErrorをスロー
|
|
8
|
+
* 3. 成功した場合は作成されたレコードをfindOneで取得して返却
|
|
11
9
|
*
|
|
12
10
|
* @param resource - リソース名
|
|
13
11
|
* @param params - insertOneパラメータ
|
|
14
12
|
* @param requestId - リクエストID
|
|
15
13
|
* @returns 作成されたレコード
|
|
14
|
+
* @throws {Error} レコード作成に失敗した場合
|
|
16
15
|
*/
|
|
17
16
|
export declare function handleInsertOne(resource: string, params: InsertOneParams, requestId: string): Promise<InsertOneResult>;
|
|
18
17
|
//# sourceMappingURL=insertOne.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insertOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/insertOne.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"insertOne.d.ts","sourceRoot":"","sources":["../../../src/server/operations/insertOne.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIpE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CA8C1B"}
|