@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.
Files changed (230) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +283 -0
  4. package/dist/client/Collection.d.ts +57 -0
  5. package/dist/client/Collection.d.ts.map +1 -0
  6. package/dist/client/Collection.js +174 -0
  7. package/dist/client/Collection.js.map +1 -0
  8. package/dist/client/Database.d.ts +35 -0
  9. package/dist/client/Database.d.ts.map +1 -0
  10. package/dist/client/Database.js +48 -0
  11. package/dist/client/Database.js.map +1 -0
  12. package/dist/client/DynamoClient.d.ts +43 -0
  13. package/dist/client/DynamoClient.d.ts.map +1 -0
  14. package/dist/client/DynamoClient.js +62 -0
  15. package/dist/client/DynamoClient.js.map +1 -0
  16. package/dist/client/FindCursor.d.ts +174 -0
  17. package/dist/client/FindCursor.d.ts.map +1 -0
  18. package/dist/client/FindCursor.js +256 -0
  19. package/dist/client/FindCursor.js.map +1 -0
  20. package/dist/client/aws-sigv4.d.ts +10 -0
  21. package/dist/client/aws-sigv4.d.ts.map +1 -0
  22. package/dist/client/aws-sigv4.js +54 -0
  23. package/dist/client/aws-sigv4.js.map +1 -0
  24. package/dist/client/index.cognito.d.ts +34 -0
  25. package/dist/client/index.cognito.d.ts.map +1 -0
  26. package/dist/client/index.cognito.js +30 -0
  27. package/dist/client/index.cognito.js.map +1 -0
  28. package/dist/client/index.d.ts +12 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/dist/client/index.iam.d.ts +34 -0
  31. package/dist/client/index.iam.d.ts.map +1 -0
  32. package/dist/client/index.iam.js +28 -0
  33. package/dist/client/index.iam.js.map +1 -0
  34. package/dist/client/index.js +12 -0
  35. package/dist/client/index.js.map +1 -0
  36. package/dist/client/index.token.d.ts +33 -0
  37. package/dist/client/index.token.d.ts.map +1 -0
  38. package/dist/client/index.token.js +28 -0
  39. package/dist/client/index.token.js.map +1 -0
  40. package/dist/dynamodb.d.ts +20 -0
  41. package/dist/dynamodb.d.ts.map +1 -0
  42. package/dist/dynamodb.js +31 -0
  43. package/dist/dynamodb.js.map +1 -0
  44. package/dist/errors.d.ts +100 -0
  45. package/dist/errors.d.ts.map +1 -0
  46. package/dist/errors.js +146 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +7 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
  53. package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
  54. package/dist/integrations/react-admin/dataProvider.js +364 -0
  55. package/dist/integrations/react-admin/dataProvider.js.map +1 -0
  56. package/dist/integrations/react-admin/index.d.ts +24 -0
  57. package/dist/integrations/react-admin/index.d.ts.map +1 -0
  58. package/dist/integrations/react-admin/index.js +23 -0
  59. package/dist/integrations/react-admin/index.js.map +1 -0
  60. package/dist/integrations/react-admin/types.d.ts +47 -0
  61. package/dist/integrations/react-admin/types.d.ts.map +1 -0
  62. package/dist/integrations/react-admin/types.js +5 -0
  63. package/dist/integrations/react-admin/types.js.map +1 -0
  64. package/dist/logger.d.ts +61 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +87 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/scripts/repair-shadows.d.ts +3 -0
  69. package/dist/scripts/repair-shadows.d.ts.map +1 -0
  70. package/dist/scripts/repair-shadows.js +190 -0
  71. package/dist/scripts/repair-shadows.js.map +1 -0
  72. package/dist/server/handler.cjs +31378 -0
  73. package/dist/server/handler.cjs.map +7 -0
  74. package/dist/server/handler.d.ts +18 -0
  75. package/dist/server/handler.d.ts.map +1 -0
  76. package/dist/server/handler.js +435 -0
  77. package/dist/server/handler.js.map +1 -0
  78. package/dist/server/handler.zip +0 -0
  79. package/dist/server/index.d.ts +8 -0
  80. package/dist/server/index.d.ts.map +1 -0
  81. package/dist/server/index.js +8 -0
  82. package/dist/server/index.js.map +1 -0
  83. package/dist/server/operations/deleteMany.d.ts +18 -0
  84. package/dist/server/operations/deleteMany.d.ts.map +1 -0
  85. package/dist/server/operations/deleteMany.js +222 -0
  86. package/dist/server/operations/deleteMany.js.map +1 -0
  87. package/dist/server/operations/deleteOne.d.ts +17 -0
  88. package/dist/server/operations/deleteOne.d.ts.map +1 -0
  89. package/dist/server/operations/deleteOne.js +87 -0
  90. package/dist/server/operations/deleteOne.js.map +1 -0
  91. package/dist/server/operations/find.d.ts +18 -0
  92. package/dist/server/operations/find.d.ts.map +1 -0
  93. package/dist/server/operations/find.js +382 -0
  94. package/dist/server/operations/find.js.map +1 -0
  95. package/dist/server/operations/findMany.d.ts +13 -0
  96. package/dist/server/operations/findMany.d.ts.map +1 -0
  97. package/dist/server/operations/findMany.js +61 -0
  98. package/dist/server/operations/findMany.js.map +1 -0
  99. package/dist/server/operations/findManyReference.d.ts +18 -0
  100. package/dist/server/operations/findManyReference.d.ts.map +1 -0
  101. package/dist/server/operations/findManyReference.js +150 -0
  102. package/dist/server/operations/findManyReference.js.map +1 -0
  103. package/dist/server/operations/findOne.d.ts +14 -0
  104. package/dist/server/operations/findOne.d.ts.map +1 -0
  105. package/dist/server/operations/findOne.js +56 -0
  106. package/dist/server/operations/findOne.js.map +1 -0
  107. package/dist/server/operations/insertMany.d.ts +19 -0
  108. package/dist/server/operations/insertMany.d.ts.map +1 -0
  109. package/dist/server/operations/insertMany.js +243 -0
  110. package/dist/server/operations/insertMany.js.map +1 -0
  111. package/dist/server/operations/insertOne.d.ts +18 -0
  112. package/dist/server/operations/insertOne.d.ts.map +1 -0
  113. package/dist/server/operations/insertOne.js +85 -0
  114. package/dist/server/operations/insertOne.js.map +1 -0
  115. package/dist/server/operations/updateMany.d.ts +20 -0
  116. package/dist/server/operations/updateMany.d.ts.map +1 -0
  117. package/dist/server/operations/updateMany.js +316 -0
  118. package/dist/server/operations/updateMany.js.map +1 -0
  119. package/dist/server/operations/updateOne.d.ts +20 -0
  120. package/dist/server/operations/updateOne.d.ts.map +1 -0
  121. package/dist/server/operations/updateOne.js +159 -0
  122. package/dist/server/operations/updateOne.js.map +1 -0
  123. package/dist/server/query/converter.d.ts +85 -0
  124. package/dist/server/query/converter.d.ts.map +1 -0
  125. package/dist/server/query/converter.js +161 -0
  126. package/dist/server/query/converter.js.map +1 -0
  127. package/dist/server/query/index.d.ts +5 -0
  128. package/dist/server/query/index.d.ts.map +1 -0
  129. package/dist/server/query/index.js +5 -0
  130. package/dist/server/query/index.js.map +1 -0
  131. package/dist/server/shadow/config.d.ts +147 -0
  132. package/dist/server/shadow/config.d.ts.map +1 -0
  133. package/dist/server/shadow/config.js +162 -0
  134. package/dist/server/shadow/config.js.map +1 -0
  135. package/dist/server/shadow/differ.d.ts +42 -0
  136. package/dist/server/shadow/differ.d.ts.map +1 -0
  137. package/dist/server/shadow/differ.js +66 -0
  138. package/dist/server/shadow/differ.js.map +1 -0
  139. package/dist/server/shadow/generator.d.ts +104 -0
  140. package/dist/server/shadow/generator.d.ts.map +1 -0
  141. package/dist/server/shadow/generator.js +148 -0
  142. package/dist/server/shadow/generator.js.map +1 -0
  143. package/dist/server/shadow/index.d.ts +11 -0
  144. package/dist/server/shadow/index.d.ts.map +1 -0
  145. package/dist/server/shadow/index.js +11 -0
  146. package/dist/server/shadow/index.js.map +1 -0
  147. package/dist/server/shadow/types.d.ts +44 -0
  148. package/dist/server/shadow/types.d.ts.map +1 -0
  149. package/dist/server/shadow/types.js +2 -0
  150. package/dist/server/shadow/types.js.map +1 -0
  151. package/dist/server/types.d.ts +295 -0
  152. package/dist/server/types.d.ts.map +1 -0
  153. package/dist/server/types.js +7 -0
  154. package/dist/server/types.js.map +1 -0
  155. package/dist/server/utils/auth.d.ts +43 -0
  156. package/dist/server/utils/auth.d.ts.map +1 -0
  157. package/dist/server/utils/auth.js +123 -0
  158. package/dist/server/utils/auth.js.map +1 -0
  159. package/dist/server/utils/bulkOperations.d.ts +81 -0
  160. package/dist/server/utils/bulkOperations.d.ts.map +1 -0
  161. package/dist/server/utils/bulkOperations.js +147 -0
  162. package/dist/server/utils/bulkOperations.js.map +1 -0
  163. package/dist/server/utils/chunking.d.ts +96 -0
  164. package/dist/server/utils/chunking.d.ts.map +1 -0
  165. package/dist/server/utils/chunking.js +225 -0
  166. package/dist/server/utils/chunking.js.map +1 -0
  167. package/dist/server/utils/dynamodb.d.ts +41 -0
  168. package/dist/server/utils/dynamodb.d.ts.map +1 -0
  169. package/dist/server/utils/dynamodb.js +83 -0
  170. package/dist/server/utils/dynamodb.js.map +1 -0
  171. package/dist/server/utils/filter.d.ts +152 -0
  172. package/dist/server/utils/filter.d.ts.map +1 -0
  173. package/dist/server/utils/filter.js +270 -0
  174. package/dist/server/utils/filter.js.map +1 -0
  175. package/dist/server/utils/pagination.d.ts +27 -0
  176. package/dist/server/utils/pagination.d.ts.map +1 -0
  177. package/dist/server/utils/pagination.js +56 -0
  178. package/dist/server/utils/pagination.js.map +1 -0
  179. package/dist/server/utils/timestamps.d.ts +31 -0
  180. package/dist/server/utils/timestamps.d.ts.map +1 -0
  181. package/dist/server/utils/timestamps.js +84 -0
  182. package/dist/server/utils/timestamps.js.map +1 -0
  183. package/dist/server/utils/ttl.d.ts +17 -0
  184. package/dist/server/utils/ttl.d.ts.map +1 -0
  185. package/dist/server/utils/ttl.js +62 -0
  186. package/dist/server/utils/ttl.js.map +1 -0
  187. package/dist/server/utils/validation.d.ts +40 -0
  188. package/dist/server/utils/validation.d.ts.map +1 -0
  189. package/dist/server/utils/validation.js +54 -0
  190. package/dist/server/utils/validation.js.map +1 -0
  191. package/dist/shadows/config.d.ts +54 -0
  192. package/dist/shadows/config.d.ts.map +1 -0
  193. package/dist/shadows/config.js +95 -0
  194. package/dist/shadows/config.js.map +1 -0
  195. package/dist/shadows/differ.d.ts +42 -0
  196. package/dist/shadows/differ.d.ts.map +1 -0
  197. package/dist/shadows/differ.js +66 -0
  198. package/dist/shadows/differ.js.map +1 -0
  199. package/dist/shadows/generator.d.ts +63 -0
  200. package/dist/shadows/generator.d.ts.map +1 -0
  201. package/dist/shadows/generator.js +107 -0
  202. package/dist/shadows/generator.js.map +1 -0
  203. package/dist/shadows/index.d.ts +15 -0
  204. package/dist/shadows/index.d.ts.map +1 -0
  205. package/dist/shadows/index.js +17 -0
  206. package/dist/shadows/index.js.map +1 -0
  207. package/dist/shadows/types.d.ts +44 -0
  208. package/dist/shadows/types.d.ts.map +1 -0
  209. package/dist/shadows/types.js +2 -0
  210. package/dist/shadows/types.js.map +1 -0
  211. package/dist/types.d.ts +165 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +2 -0
  214. package/dist/types.js.map +1 -0
  215. package/dist/ulid.d.ts +46 -0
  216. package/dist/ulid.d.ts.map +1 -0
  217. package/dist/ulid.js +66 -0
  218. package/dist/ulid.js.map +1 -0
  219. package/package.json +136 -0
  220. package/terraform/README.md +222 -0
  221. package/terraform/examples/advanced/README.md +129 -0
  222. package/terraform/examples/advanced/main.tf +158 -0
  223. package/terraform/examples/advanced/shadow.config.json +35 -0
  224. package/terraform/examples/advanced/variables.tf +28 -0
  225. package/terraform/examples/basic/README.md +53 -0
  226. package/terraform/examples/basic/main.tf +99 -0
  227. package/terraform/examples/basic/variables.tf +17 -0
  228. package/terraform/main.tf +159 -0
  229. package/terraform/outputs.tf +56 -0
  230. 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,8 @@
1
+ /**
2
+ * サーバーサイドモジュール
3
+ *
4
+ * Lambda関数などのサーバーサイドで使用するユーティリティを提供します。
5
+ */
6
+ export * from './query/index.js';
7
+ export * from './shadow/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * サーバーサイドモジュール
3
+ *
4
+ * Lambda関数などのサーバーサイドで使用するユーティリティを提供します。
5
+ */
6
+ export * from './query/index.js';
7
+ export * from './shadow/index.js';
8
+ //# sourceMappingURL=index.js.map
@@ -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"}