@exabugs/dynamodb-client 0.1.0
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 +41 -0
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/client/Collection.d.ts +57 -0
- package/dist/client/Collection.d.ts.map +1 -0
- package/dist/client/Collection.js +174 -0
- package/dist/client/Collection.js.map +1 -0
- package/dist/client/Database.d.ts +35 -0
- package/dist/client/Database.d.ts.map +1 -0
- package/dist/client/Database.js +48 -0
- package/dist/client/Database.js.map +1 -0
- package/dist/client/DynamoClient.d.ts +43 -0
- package/dist/client/DynamoClient.d.ts.map +1 -0
- package/dist/client/DynamoClient.js +62 -0
- package/dist/client/DynamoClient.js.map +1 -0
- package/dist/client/FindCursor.d.ts +174 -0
- package/dist/client/FindCursor.d.ts.map +1 -0
- package/dist/client/FindCursor.js +256 -0
- package/dist/client/FindCursor.js.map +1 -0
- package/dist/client/aws-sigv4.d.ts +10 -0
- package/dist/client/aws-sigv4.d.ts.map +1 -0
- package/dist/client/aws-sigv4.js +54 -0
- package/dist/client/aws-sigv4.js.map +1 -0
- package/dist/client/index.cognito.d.ts +34 -0
- package/dist/client/index.cognito.d.ts.map +1 -0
- package/dist/client/index.cognito.js +30 -0
- package/dist/client/index.cognito.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.iam.d.ts +34 -0
- package/dist/client/index.iam.d.ts.map +1 -0
- package/dist/client/index.iam.js +28 -0
- package/dist/client/index.iam.js.map +1 -0
- package/dist/client/index.js +12 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.token.d.ts +33 -0
- package/dist/client/index.token.d.ts.map +1 -0
- package/dist/client/index.token.js +28 -0
- package/dist/client/index.token.js.map +1 -0
- package/dist/dynamodb.d.ts +20 -0
- package/dist/dynamodb.d.ts.map +1 -0
- package/dist/dynamodb.js +31 -0
- package/dist/dynamodb.js.map +1 -0
- package/dist/errors.d.ts +100 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +146 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
- package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
- package/dist/integrations/react-admin/dataProvider.js +364 -0
- package/dist/integrations/react-admin/dataProvider.js.map +1 -0
- package/dist/integrations/react-admin/index.d.ts +24 -0
- package/dist/integrations/react-admin/index.d.ts.map +1 -0
- package/dist/integrations/react-admin/index.js +23 -0
- package/dist/integrations/react-admin/index.js.map +1 -0
- package/dist/integrations/react-admin/types.d.ts +47 -0
- package/dist/integrations/react-admin/types.d.ts.map +1 -0
- package/dist/integrations/react-admin/types.js +5 -0
- package/dist/integrations/react-admin/types.js.map +1 -0
- package/dist/logger.d.ts +61 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +87 -0
- package/dist/logger.js.map +1 -0
- package/dist/scripts/repair-shadows.d.ts +3 -0
- package/dist/scripts/repair-shadows.d.ts.map +1 -0
- package/dist/scripts/repair-shadows.js +190 -0
- package/dist/scripts/repair-shadows.js.map +1 -0
- package/dist/server/handler.cjs +31378 -0
- package/dist/server/handler.cjs.map +7 -0
- package/dist/server/handler.d.ts +18 -0
- package/dist/server/handler.d.ts.map +1 -0
- package/dist/server/handler.js +435 -0
- package/dist/server/handler.js.map +1 -0
- package/dist/server/handler.zip +0 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/operations/deleteMany.d.ts +18 -0
- package/dist/server/operations/deleteMany.d.ts.map +1 -0
- package/dist/server/operations/deleteMany.js +222 -0
- package/dist/server/operations/deleteMany.js.map +1 -0
- package/dist/server/operations/deleteOne.d.ts +17 -0
- package/dist/server/operations/deleteOne.d.ts.map +1 -0
- package/dist/server/operations/deleteOne.js +87 -0
- package/dist/server/operations/deleteOne.js.map +1 -0
- package/dist/server/operations/find.d.ts +18 -0
- package/dist/server/operations/find.d.ts.map +1 -0
- package/dist/server/operations/find.js +382 -0
- package/dist/server/operations/find.js.map +1 -0
- package/dist/server/operations/findMany.d.ts +13 -0
- package/dist/server/operations/findMany.d.ts.map +1 -0
- package/dist/server/operations/findMany.js +61 -0
- package/dist/server/operations/findMany.js.map +1 -0
- package/dist/server/operations/findManyReference.d.ts +18 -0
- package/dist/server/operations/findManyReference.d.ts.map +1 -0
- package/dist/server/operations/findManyReference.js +150 -0
- package/dist/server/operations/findManyReference.js.map +1 -0
- package/dist/server/operations/findOne.d.ts +14 -0
- package/dist/server/operations/findOne.d.ts.map +1 -0
- package/dist/server/operations/findOne.js +56 -0
- package/dist/server/operations/findOne.js.map +1 -0
- package/dist/server/operations/insertMany.d.ts +19 -0
- package/dist/server/operations/insertMany.d.ts.map +1 -0
- package/dist/server/operations/insertMany.js +243 -0
- package/dist/server/operations/insertMany.js.map +1 -0
- package/dist/server/operations/insertOne.d.ts +18 -0
- package/dist/server/operations/insertOne.d.ts.map +1 -0
- package/dist/server/operations/insertOne.js +85 -0
- package/dist/server/operations/insertOne.js.map +1 -0
- package/dist/server/operations/updateMany.d.ts +20 -0
- package/dist/server/operations/updateMany.d.ts.map +1 -0
- package/dist/server/operations/updateMany.js +316 -0
- package/dist/server/operations/updateMany.js.map +1 -0
- package/dist/server/operations/updateOne.d.ts +20 -0
- package/dist/server/operations/updateOne.d.ts.map +1 -0
- package/dist/server/operations/updateOne.js +159 -0
- package/dist/server/operations/updateOne.js.map +1 -0
- package/dist/server/query/converter.d.ts +85 -0
- package/dist/server/query/converter.d.ts.map +1 -0
- package/dist/server/query/converter.js +161 -0
- package/dist/server/query/converter.js.map +1 -0
- package/dist/server/query/index.d.ts +5 -0
- package/dist/server/query/index.d.ts.map +1 -0
- package/dist/server/query/index.js +5 -0
- package/dist/server/query/index.js.map +1 -0
- package/dist/server/shadow/config.d.ts +147 -0
- package/dist/server/shadow/config.d.ts.map +1 -0
- package/dist/server/shadow/config.js +162 -0
- package/dist/server/shadow/config.js.map +1 -0
- package/dist/server/shadow/differ.d.ts +42 -0
- package/dist/server/shadow/differ.d.ts.map +1 -0
- package/dist/server/shadow/differ.js +66 -0
- package/dist/server/shadow/differ.js.map +1 -0
- package/dist/server/shadow/generator.d.ts +104 -0
- package/dist/server/shadow/generator.d.ts.map +1 -0
- package/dist/server/shadow/generator.js +148 -0
- package/dist/server/shadow/generator.js.map +1 -0
- package/dist/server/shadow/index.d.ts +11 -0
- package/dist/server/shadow/index.d.ts.map +1 -0
- package/dist/server/shadow/index.js +11 -0
- package/dist/server/shadow/index.js.map +1 -0
- package/dist/server/shadow/types.d.ts +44 -0
- package/dist/server/shadow/types.d.ts.map +1 -0
- package/dist/server/shadow/types.js +2 -0
- package/dist/server/shadow/types.js.map +1 -0
- package/dist/server/types.d.ts +295 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +7 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/utils/auth.d.ts +43 -0
- package/dist/server/utils/auth.d.ts.map +1 -0
- package/dist/server/utils/auth.js +123 -0
- package/dist/server/utils/auth.js.map +1 -0
- package/dist/server/utils/bulkOperations.d.ts +81 -0
- package/dist/server/utils/bulkOperations.d.ts.map +1 -0
- package/dist/server/utils/bulkOperations.js +147 -0
- package/dist/server/utils/bulkOperations.js.map +1 -0
- package/dist/server/utils/chunking.d.ts +96 -0
- package/dist/server/utils/chunking.d.ts.map +1 -0
- package/dist/server/utils/chunking.js +225 -0
- package/dist/server/utils/chunking.js.map +1 -0
- package/dist/server/utils/dynamodb.d.ts +41 -0
- package/dist/server/utils/dynamodb.d.ts.map +1 -0
- package/dist/server/utils/dynamodb.js +83 -0
- package/dist/server/utils/dynamodb.js.map +1 -0
- package/dist/server/utils/filter.d.ts +152 -0
- package/dist/server/utils/filter.d.ts.map +1 -0
- package/dist/server/utils/filter.js +270 -0
- package/dist/server/utils/filter.js.map +1 -0
- package/dist/server/utils/pagination.d.ts +27 -0
- package/dist/server/utils/pagination.d.ts.map +1 -0
- package/dist/server/utils/pagination.js +56 -0
- package/dist/server/utils/pagination.js.map +1 -0
- package/dist/server/utils/timestamps.d.ts +31 -0
- package/dist/server/utils/timestamps.d.ts.map +1 -0
- package/dist/server/utils/timestamps.js +84 -0
- package/dist/server/utils/timestamps.js.map +1 -0
- package/dist/server/utils/ttl.d.ts +17 -0
- package/dist/server/utils/ttl.d.ts.map +1 -0
- package/dist/server/utils/ttl.js +62 -0
- package/dist/server/utils/ttl.js.map +1 -0
- package/dist/server/utils/validation.d.ts +40 -0
- package/dist/server/utils/validation.d.ts.map +1 -0
- package/dist/server/utils/validation.js +54 -0
- package/dist/server/utils/validation.js.map +1 -0
- package/dist/shadows/config.d.ts +54 -0
- package/dist/shadows/config.d.ts.map +1 -0
- package/dist/shadows/config.js +95 -0
- package/dist/shadows/config.js.map +1 -0
- package/dist/shadows/differ.d.ts +42 -0
- package/dist/shadows/differ.d.ts.map +1 -0
- package/dist/shadows/differ.js +66 -0
- package/dist/shadows/differ.js.map +1 -0
- package/dist/shadows/generator.d.ts +63 -0
- package/dist/shadows/generator.d.ts.map +1 -0
- package/dist/shadows/generator.js +107 -0
- package/dist/shadows/generator.js.map +1 -0
- package/dist/shadows/index.d.ts +15 -0
- package/dist/shadows/index.d.ts.map +1 -0
- package/dist/shadows/index.js +17 -0
- package/dist/shadows/index.js.map +1 -0
- package/dist/shadows/types.d.ts +44 -0
- package/dist/shadows/types.d.ts.map +1 -0
- package/dist/shadows/types.js +2 -0
- package/dist/shadows/types.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ulid.d.ts +46 -0
- package/dist/ulid.d.ts.map +1 -0
- package/dist/ulid.js +66 -0
- package/dist/ulid.js.map +1 -0
- package/package.json +136 -0
- package/terraform/README.md +222 -0
- package/terraform/examples/advanced/README.md +129 -0
- package/terraform/examples/advanced/main.tf +158 -0
- package/terraform/examples/advanced/shadow.config.json +35 -0
- package/terraform/examples/advanced/variables.tf +28 -0
- package/terraform/examples/basic/README.md +53 -0
- package/terraform/examples/basic/main.tf +99 -0
- package/terraform/examples/basic/variables.tf +17 -0
- package/terraform/main.tf +159 -0
- package/terraform/outputs.tf +56 -0
- package/terraform/variables.tf +59 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records Lambda - エントリーポイント
|
|
3
|
+
*
|
|
4
|
+
* HTTP API(Lambda Function URL)経由でCRUD操作を提供
|
|
5
|
+
* MongoDB 風の10操作をサポート
|
|
6
|
+
*/
|
|
7
|
+
import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda';
|
|
8
|
+
/**
|
|
9
|
+
* Lambda ハンドラー(HTTP対応)
|
|
10
|
+
*
|
|
11
|
+
* HTTPリクエストを受け取り、操作に応じた処理を実行してレスポンスを返す。
|
|
12
|
+
* react-admin完全準拠の10操作をサポート。
|
|
13
|
+
*
|
|
14
|
+
* @param event - Lambda Function URL イベント
|
|
15
|
+
* @returns HTTP レスポンス
|
|
16
|
+
*/
|
|
17
|
+
export declare function handler(event: APIGatewayProxyEventV2): Promise<APIGatewayProxyResultV2>;
|
|
18
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AA8DlF;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAkG7F"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { isAppError } from '../errors.js';
|
|
2
|
+
import { createLogger } from '../logger.js';
|
|
3
|
+
import { handleDeleteMany } from './operations/deleteMany.js';
|
|
4
|
+
import { handleDeleteOne } from './operations/deleteOne.js';
|
|
5
|
+
import { handleFind } from './operations/find.js';
|
|
6
|
+
import { handleFindMany } from './operations/findMany.js';
|
|
7
|
+
// 操作ハンドラーのインポート
|
|
8
|
+
import { handleFindManyReference } from './operations/findManyReference.js';
|
|
9
|
+
import { handleFindOne } from './operations/findOne.js';
|
|
10
|
+
import { handleInsertMany } from './operations/insertMany.js';
|
|
11
|
+
import { handleInsertOne } from './operations/insertOne.js';
|
|
12
|
+
import { handleUpdateMany } from './operations/updateMany.js';
|
|
13
|
+
import { handleUpdateOne } from './operations/updateOne.js';
|
|
14
|
+
import { getSchemaVersion, getShadowConfigHash } from './shadow/config.js';
|
|
15
|
+
import { verifyAuthHeader } from './utils/auth.js';
|
|
16
|
+
/**
|
|
17
|
+
* ロガーインスタンス
|
|
18
|
+
*/
|
|
19
|
+
const logger = createLogger({
|
|
20
|
+
service: 'records-lambda',
|
|
21
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
22
|
+
});
|
|
23
|
+
// 起動時に設定情報をログ出力(コールドスタート時のみ実行される)
|
|
24
|
+
try {
|
|
25
|
+
const schemaVersion = getSchemaVersion();
|
|
26
|
+
const configHash = getShadowConfigHash();
|
|
27
|
+
logger.info('Records Lambda started', {
|
|
28
|
+
schemaVersion,
|
|
29
|
+
configHash,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logger.warn('Failed to load shadow config at startup', {
|
|
34
|
+
error: error instanceof Error ? error.message : String(error),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* CORS ヘッダー
|
|
39
|
+
* Lambda Function URLのCORS設定を使用するため、ここでは空のオブジェクトにする
|
|
40
|
+
*/
|
|
41
|
+
const CORS_HEADERS = {};
|
|
42
|
+
/**
|
|
43
|
+
* Lambda ハンドラー(HTTP対応)
|
|
44
|
+
*
|
|
45
|
+
* HTTPリクエストを受け取り、操作に応じた処理を実行してレスポンスを返す。
|
|
46
|
+
* react-admin完全準拠の10操作をサポート。
|
|
47
|
+
*
|
|
48
|
+
* @param event - Lambda Function URL イベント
|
|
49
|
+
* @returns HTTP レスポンス
|
|
50
|
+
*/
|
|
51
|
+
export async function handler(event) {
|
|
52
|
+
const requestId = event.requestContext.requestId;
|
|
53
|
+
logger.info('Received request', {
|
|
54
|
+
requestId,
|
|
55
|
+
method: event.requestContext.http.method,
|
|
56
|
+
path: event.requestContext.http.path,
|
|
57
|
+
});
|
|
58
|
+
try {
|
|
59
|
+
// CORS プリフライトリクエスト処理
|
|
60
|
+
if (event.requestContext.http.method === 'OPTIONS') {
|
|
61
|
+
return createCorsResponse(200);
|
|
62
|
+
}
|
|
63
|
+
// POST メソッドのみ許可
|
|
64
|
+
if (event.requestContext.http.method !== 'POST') {
|
|
65
|
+
return createErrorResponse('METHOD_NOT_ALLOWED', 'Only POST method is allowed', 405, requestId);
|
|
66
|
+
}
|
|
67
|
+
// 認証チェック: IAM または Cognito JWT
|
|
68
|
+
// Lambda Function URL が NONE の場合、両方の認証方式をサポート
|
|
69
|
+
const authHeader = event.headers.authorization || event.headers.Authorization;
|
|
70
|
+
// AWS SigV4 署名の検出(複数のヘッダーで判定)
|
|
71
|
+
const hasAmzDate = event.headers['x-amz-date'] || event.headers['X-Amz-Date'];
|
|
72
|
+
const hasAmzContentSha = event.headers['x-amz-content-sha256'] || event.headers['X-Amz-Content-Sha256'];
|
|
73
|
+
const hasAwsSigV4Auth = authHeader?.startsWith('AWS4-HMAC-SHA256');
|
|
74
|
+
// デバッグ: ヘッダーをログ出力
|
|
75
|
+
logger.debug('Authentication check', {
|
|
76
|
+
requestId,
|
|
77
|
+
hasAuthHeader: !!authHeader,
|
|
78
|
+
hasAmzDate: !!hasAmzDate,
|
|
79
|
+
hasAmzContentSha: !!hasAmzContentSha,
|
|
80
|
+
hasAwsSigV4Auth: !!hasAwsSigV4Auth,
|
|
81
|
+
authHeaderPrefix: authHeader?.substring(0, 20),
|
|
82
|
+
});
|
|
83
|
+
// IAM 認証チェック(AWS SigV4 署名の特徴的なヘッダーで判定)
|
|
84
|
+
// 以下のいずれかの条件を満たす場合、IAM 認証とみなす:
|
|
85
|
+
// 1. Authorization ヘッダーが AWS4-HMAC-SHA256 で始まる
|
|
86
|
+
// 2. x-amz-date と x-amz-content-sha256 の両方が存在する
|
|
87
|
+
const isIAMAuth = hasAwsSigV4Auth || !!(hasAmzDate && hasAmzContentSha);
|
|
88
|
+
if (isIAMAuth) {
|
|
89
|
+
// IAM 認証(スクリプトからのアクセス)
|
|
90
|
+
// Lambda Function URL が NONE の場合、署名検証は行われないため、
|
|
91
|
+
// ここでは IAM 認証として扱うが、実際の検証は AWS 側で行われる
|
|
92
|
+
logger.info('IAM authenticated request', {
|
|
93
|
+
requestId,
|
|
94
|
+
sourceIp: event.requestContext.http.sourceIp,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Cognito JWT 認証(ブラウザからのアクセス)
|
|
99
|
+
const userPoolId = process.env.COGNITO_USER_POOL_ID;
|
|
100
|
+
const clientId = process.env.COGNITO_CLIENT_ID; // オプション
|
|
101
|
+
if (!userPoolId) {
|
|
102
|
+
throw new Error('COGNITO_USER_POOL_ID environment variable is required');
|
|
103
|
+
}
|
|
104
|
+
const jwtPayload = await verifyAuthHeader(authHeader, userPoolId, clientId);
|
|
105
|
+
logger.debug('Cognito JWT verified', {
|
|
106
|
+
requestId,
|
|
107
|
+
sub: jwtPayload.sub,
|
|
108
|
+
email: jwtPayload.email,
|
|
109
|
+
});
|
|
110
|
+
// TODO: テナント境界の実装
|
|
111
|
+
// jwtPayload.sub をレコードの userId フィールドと照合する
|
|
112
|
+
}
|
|
113
|
+
// リクエストボディのパース(2つの API 形式をサポート)
|
|
114
|
+
const request = parseRequestBody(event.body);
|
|
115
|
+
logger.info('Parsed request', {
|
|
116
|
+
requestId,
|
|
117
|
+
operation: request.op,
|
|
118
|
+
resource: request.resource,
|
|
119
|
+
});
|
|
120
|
+
// 操作の実行
|
|
121
|
+
const result = await executeOperation(request, requestId);
|
|
122
|
+
// 成功レスポンスの生成
|
|
123
|
+
return createSuccessResponse(result, requestId);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// エラーハンドリング
|
|
127
|
+
return handleError(error, requestId);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* リクエストボディをパースする(MongoDB 風 API)
|
|
132
|
+
*
|
|
133
|
+
* @param body - HTTPリクエストボディ(JSON文字列)
|
|
134
|
+
* @returns パース済みリクエスト
|
|
135
|
+
* @throws {Error} パースに失敗した場合
|
|
136
|
+
*/
|
|
137
|
+
function parseRequestBody(body) {
|
|
138
|
+
if (!body) {
|
|
139
|
+
throw new Error('Request body is required');
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const parsed = JSON.parse(body);
|
|
143
|
+
// 必須フィールドの検証
|
|
144
|
+
if (!parsed.operation) {
|
|
145
|
+
throw new Error('Missing required field: operation');
|
|
146
|
+
}
|
|
147
|
+
if (!parsed.database) {
|
|
148
|
+
throw new Error('Missing required field: database');
|
|
149
|
+
}
|
|
150
|
+
if (!parsed.collection) {
|
|
151
|
+
throw new Error('Missing required field: collection');
|
|
152
|
+
}
|
|
153
|
+
if (parsed.params === undefined) {
|
|
154
|
+
throw new Error('Missing required field: params');
|
|
155
|
+
}
|
|
156
|
+
// MongoDB 風の operation 名をそのまま使用(変換なし)
|
|
157
|
+
const op = parsed.operation;
|
|
158
|
+
return {
|
|
159
|
+
op,
|
|
160
|
+
resource: parsed.collection,
|
|
161
|
+
params: parsed.params,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (error instanceof SyntaxError) {
|
|
166
|
+
throw new Error('Invalid JSON in request body');
|
|
167
|
+
}
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 操作を実行する(MongoDB 風 API)
|
|
173
|
+
*
|
|
174
|
+
* @param request - API リクエスト
|
|
175
|
+
* @param requestId - リクエストID
|
|
176
|
+
* @returns 操作結果
|
|
177
|
+
*/
|
|
178
|
+
async function executeOperation(request, requestId) {
|
|
179
|
+
const { op, resource } = request;
|
|
180
|
+
logger.debug('Executing operation', {
|
|
181
|
+
requestId,
|
|
182
|
+
operation: op,
|
|
183
|
+
resource,
|
|
184
|
+
});
|
|
185
|
+
switch (op) {
|
|
186
|
+
case 'find': {
|
|
187
|
+
// MongoDB: { filter, options: { sort, limit, nextToken } } -> 内部: { filter, sort, pagination }
|
|
188
|
+
const mongoParams = request.params;
|
|
189
|
+
const { filter = {}, options = {} } = mongoParams;
|
|
190
|
+
const { sort, limit, nextToken } = options;
|
|
191
|
+
// デバッグログ
|
|
192
|
+
logger.debug('Processing find operation', {
|
|
193
|
+
requestId,
|
|
194
|
+
hasSort: !!sort,
|
|
195
|
+
sortType: typeof sort,
|
|
196
|
+
sortKeys: sort ? Object.keys(sort) : [],
|
|
197
|
+
sortValues: sort ? Object.values(sort) : [],
|
|
198
|
+
sort,
|
|
199
|
+
hasNextToken: !!nextToken,
|
|
200
|
+
});
|
|
201
|
+
const internalParams = {
|
|
202
|
+
filter,
|
|
203
|
+
...(sort &&
|
|
204
|
+
Object.keys(sort).length > 0 && {
|
|
205
|
+
sort: {
|
|
206
|
+
field: Object.keys(sort)[0],
|
|
207
|
+
order: Object.values(sort)[0] === 'desc' ? 'DESC' : 'ASC',
|
|
208
|
+
},
|
|
209
|
+
}),
|
|
210
|
+
...((limit || nextToken) && {
|
|
211
|
+
pagination: {
|
|
212
|
+
...(limit && { perPage: limit }),
|
|
213
|
+
...(nextToken && { nextToken }),
|
|
214
|
+
},
|
|
215
|
+
}),
|
|
216
|
+
};
|
|
217
|
+
return await handleFind(resource, internalParams, requestId);
|
|
218
|
+
}
|
|
219
|
+
case 'findOne': {
|
|
220
|
+
// MongoDB: { filter: { id: ... } } -> 内部: { id: ... }
|
|
221
|
+
const mongoParams = request.params;
|
|
222
|
+
const id = typeof mongoParams.filter?.id === 'string' ? mongoParams.filter.id : undefined;
|
|
223
|
+
if (!id) {
|
|
224
|
+
throw new Error('findOne requires filter.id');
|
|
225
|
+
}
|
|
226
|
+
const internalParams = { id };
|
|
227
|
+
return await handleFindOne(resource, internalParams, requestId);
|
|
228
|
+
}
|
|
229
|
+
case 'findMany': {
|
|
230
|
+
// MongoDB: { filter: { id: { in: [...] } } } -> 内部: { ids: [...] }
|
|
231
|
+
const mongoParams = request.params;
|
|
232
|
+
const idFilter = mongoParams.filter?.id;
|
|
233
|
+
const ids = typeof idFilter === 'object' && idFilter !== null && 'in' in idFilter
|
|
234
|
+
? idFilter.in || []
|
|
235
|
+
: [];
|
|
236
|
+
const internalParams = { ids };
|
|
237
|
+
return await handleFindMany(resource, internalParams, requestId);
|
|
238
|
+
}
|
|
239
|
+
case 'findManyReference':
|
|
240
|
+
return await handleFindManyReference(resource, request.params, requestId);
|
|
241
|
+
case 'insertOne': {
|
|
242
|
+
// MongoDB: { document: {...} } -> 内部: { data: {...} }
|
|
243
|
+
const mongoParams = request.params;
|
|
244
|
+
if (!mongoParams.document) {
|
|
245
|
+
throw new Error('insertOne requires document');
|
|
246
|
+
}
|
|
247
|
+
const internalParams = {
|
|
248
|
+
data: mongoParams.document,
|
|
249
|
+
};
|
|
250
|
+
return await handleInsertOne(resource, internalParams, requestId);
|
|
251
|
+
}
|
|
252
|
+
case 'updateOne': {
|
|
253
|
+
// MongoDB: { filter: { id: ... }, update: { set: {...} } } -> 内部: { id: ..., data: {...} }
|
|
254
|
+
const mongoParams = request.params;
|
|
255
|
+
const id = typeof mongoParams.filter?.id === 'string' ? mongoParams.filter.id : undefined;
|
|
256
|
+
if (!id) {
|
|
257
|
+
throw new Error('updateOne requires filter.id');
|
|
258
|
+
}
|
|
259
|
+
const updateData = mongoParams.update && typeof mongoParams.update === 'object'
|
|
260
|
+
? 'set' in mongoParams.update
|
|
261
|
+
? mongoParams.update.set || {}
|
|
262
|
+
: mongoParams.update
|
|
263
|
+
: {};
|
|
264
|
+
const internalParams = {
|
|
265
|
+
id,
|
|
266
|
+
data: updateData,
|
|
267
|
+
};
|
|
268
|
+
return await handleUpdateOne(resource, internalParams, requestId);
|
|
269
|
+
}
|
|
270
|
+
case 'updateMany': {
|
|
271
|
+
// MongoDB: { filter: { id: { in: [...] } }, update: { set: {...} } } -> 内部: { ids: [...], data: {...} }
|
|
272
|
+
const mongoParams = request.params;
|
|
273
|
+
const idFilter = mongoParams.filter?.id;
|
|
274
|
+
const ids = typeof idFilter === 'object' && idFilter !== null && 'in' in idFilter
|
|
275
|
+
? idFilter.in || []
|
|
276
|
+
: [];
|
|
277
|
+
const updateData = mongoParams.update && typeof mongoParams.update === 'object'
|
|
278
|
+
? 'set' in mongoParams.update
|
|
279
|
+
? mongoParams.update.set || {}
|
|
280
|
+
: mongoParams.update
|
|
281
|
+
: {};
|
|
282
|
+
const internalParams = {
|
|
283
|
+
ids,
|
|
284
|
+
data: updateData,
|
|
285
|
+
};
|
|
286
|
+
return await handleUpdateMany(resource, internalParams, requestId);
|
|
287
|
+
}
|
|
288
|
+
case 'deleteOne': {
|
|
289
|
+
// MongoDB: { filter: { id: ... } } -> 内部: { id: ... }
|
|
290
|
+
const mongoParams = request.params;
|
|
291
|
+
const id = typeof mongoParams.filter?.id === 'string' ? mongoParams.filter.id : undefined;
|
|
292
|
+
if (!id) {
|
|
293
|
+
throw new Error('deleteOne requires filter.id');
|
|
294
|
+
}
|
|
295
|
+
const internalParams = { id };
|
|
296
|
+
return await handleDeleteOne(resource, internalParams, requestId);
|
|
297
|
+
}
|
|
298
|
+
case 'deleteMany': {
|
|
299
|
+
// MongoDB: { filter: { id: { in: [...] } } } -> 内部: { ids: [...] }
|
|
300
|
+
const mongoParams = request.params;
|
|
301
|
+
const idFilter = mongoParams.filter?.id;
|
|
302
|
+
const ids = typeof idFilter === 'object' && idFilter !== null && 'in' in idFilter
|
|
303
|
+
? idFilter.in || []
|
|
304
|
+
: [];
|
|
305
|
+
const internalParams = { ids };
|
|
306
|
+
return await handleDeleteMany(resource, internalParams, requestId);
|
|
307
|
+
}
|
|
308
|
+
case 'insertMany': {
|
|
309
|
+
// MongoDB: { documents: [...] } -> 内部: { data: [...] }
|
|
310
|
+
const mongoParams = request.params;
|
|
311
|
+
if (!mongoParams.documents) {
|
|
312
|
+
throw new Error('insertMany requires documents');
|
|
313
|
+
}
|
|
314
|
+
const internalParams = {
|
|
315
|
+
data: mongoParams.documents,
|
|
316
|
+
};
|
|
317
|
+
return await handleInsertMany(resource, internalParams, requestId);
|
|
318
|
+
}
|
|
319
|
+
default:
|
|
320
|
+
throw new Error(`Unknown operation: ${op}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* 成功レスポンスを生成する
|
|
325
|
+
*
|
|
326
|
+
* @param data - レスポンスデータ
|
|
327
|
+
* @param requestId - リクエストID
|
|
328
|
+
* @returns HTTP レスポンス
|
|
329
|
+
*/
|
|
330
|
+
function createSuccessResponse(data, requestId) {
|
|
331
|
+
const response = {
|
|
332
|
+
success: true,
|
|
333
|
+
data,
|
|
334
|
+
};
|
|
335
|
+
logger.info('Request succeeded', { requestId });
|
|
336
|
+
return {
|
|
337
|
+
statusCode: 200,
|
|
338
|
+
headers: {
|
|
339
|
+
'Content-Type': 'application/json',
|
|
340
|
+
...CORS_HEADERS,
|
|
341
|
+
},
|
|
342
|
+
body: JSON.stringify(response),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* エラーレスポンスを生成する
|
|
347
|
+
*
|
|
348
|
+
* @param code - エラーコード
|
|
349
|
+
* @param message - エラーメッセージ
|
|
350
|
+
* @param statusCode - HTTPステータスコード
|
|
351
|
+
* @param requestId - リクエストID
|
|
352
|
+
* @param details - 追加詳細情報
|
|
353
|
+
* @returns HTTP レスポンス
|
|
354
|
+
*/
|
|
355
|
+
function createErrorResponse(code, message, statusCode, requestId, details) {
|
|
356
|
+
const response = {
|
|
357
|
+
success: false,
|
|
358
|
+
error: {
|
|
359
|
+
code,
|
|
360
|
+
message,
|
|
361
|
+
statusCode,
|
|
362
|
+
details,
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
logger.error('Request failed', {
|
|
366
|
+
requestId,
|
|
367
|
+
code,
|
|
368
|
+
message,
|
|
369
|
+
statusCode,
|
|
370
|
+
});
|
|
371
|
+
return {
|
|
372
|
+
statusCode,
|
|
373
|
+
headers: {
|
|
374
|
+
'Content-Type': 'application/json',
|
|
375
|
+
...CORS_HEADERS,
|
|
376
|
+
},
|
|
377
|
+
body: JSON.stringify(response),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* CORS レスポンスを生成する
|
|
382
|
+
*
|
|
383
|
+
* @param statusCode - HTTPステータスコード
|
|
384
|
+
* @returns HTTP レスポンス
|
|
385
|
+
*/
|
|
386
|
+
function createCorsResponse(statusCode) {
|
|
387
|
+
return {
|
|
388
|
+
statusCode,
|
|
389
|
+
headers: CORS_HEADERS,
|
|
390
|
+
body: '',
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* エラーをハンドリングしてレスポンスを生成する
|
|
395
|
+
*
|
|
396
|
+
* @param error - エラーオブジェクト
|
|
397
|
+
* @param requestId - リクエストID
|
|
398
|
+
* @returns HTTP レスポンス
|
|
399
|
+
*/
|
|
400
|
+
function handleError(error, requestId) {
|
|
401
|
+
// AppError(アプリケーション定義エラー)の場合
|
|
402
|
+
if (isAppError(error)) {
|
|
403
|
+
return createErrorResponse(error.code, error.message, error.statusCode, requestId, error.details);
|
|
404
|
+
}
|
|
405
|
+
// 標準Errorの場合
|
|
406
|
+
if (error instanceof Error) {
|
|
407
|
+
// スタックトレースをログ出力
|
|
408
|
+
logger.error('Error stack trace', {
|
|
409
|
+
requestId,
|
|
410
|
+
stack: error.stack,
|
|
411
|
+
message: error.message,
|
|
412
|
+
});
|
|
413
|
+
// バリデーションエラーの判定
|
|
414
|
+
if (error.message.includes('Missing required field') ||
|
|
415
|
+
error.message.includes('Invalid JSON') ||
|
|
416
|
+
error.message.includes('Request body is required')) {
|
|
417
|
+
return createErrorResponse('VALIDATION_ERROR', error.message, 400, requestId);
|
|
418
|
+
}
|
|
419
|
+
// 未実装エラーの判定
|
|
420
|
+
if (error.message.includes('not yet implemented')) {
|
|
421
|
+
return createErrorResponse('NOT_IMPLEMENTED', error.message, 501, requestId);
|
|
422
|
+
}
|
|
423
|
+
// 不明な操作エラーの判定
|
|
424
|
+
if (error.message.includes('Unknown operation')) {
|
|
425
|
+
return createErrorResponse('INVALID_OPERATION', error.message, 400, requestId);
|
|
426
|
+
}
|
|
427
|
+
// その他のエラー
|
|
428
|
+
return createErrorResponse('INTERNAL_ERROR', error.message, 500, requestId);
|
|
429
|
+
}
|
|
430
|
+
// 予期しないエラー
|
|
431
|
+
return createErrorResponse('UNKNOWN_ERROR', 'An unexpected error occurred', 500, requestId, {
|
|
432
|
+
error: String(error),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DeleteManyParams, DeleteManyResult } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* deleteMany 操作を実行する
|
|
4
|
+
*
|
|
5
|
+
* 処理フロー:
|
|
6
|
+
* 1. BatchGetItemで既存レコードを取得
|
|
7
|
+
* 2. 各レコードの__shadowKeysからシャドーSKリストを取得
|
|
8
|
+
* 3. アイテム数を計算してチャンク分割(1 + シャドー数)
|
|
9
|
+
* 4. 各チャンクをTransactWriteItemsで順次実行
|
|
10
|
+
* 5. 部分失敗をハンドリング
|
|
11
|
+
*
|
|
12
|
+
* @param resource - リソース名
|
|
13
|
+
* @param params - deleteManyパラメータ
|
|
14
|
+
* @param requestId - リクエストID
|
|
15
|
+
* @returns 削除結果(成功ID、失敗ID、エラー情報)
|
|
16
|
+
*/
|
|
17
|
+
export declare function handleDeleteMany(resource: string, params: DeleteManyParams, requestId: string): Promise<DeleteManyResult>;
|
|
18
|
+
//# sourceMappingURL=deleteMany.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteMany.d.ts","sourceRoot":"","sources":["../../../src/server/operations/deleteMany.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAyBtF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CA4Q3B"}
|