@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
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2024-11-29
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Initial release of @exabugs/dynamodb-client
|
|
15
|
+
- MongoDB-like API for DynamoDB Single-Table Design
|
|
16
|
+
- Shadow Records for efficient sorting and querying
|
|
17
|
+
- Multiple authentication methods:
|
|
18
|
+
- IAM authentication for server-side
|
|
19
|
+
- Cognito authentication for web applications
|
|
20
|
+
- Token authentication for custom scenarios
|
|
21
|
+
- Lambda function implementation with Function URL support
|
|
22
|
+
- react-admin integration for admin UIs
|
|
23
|
+
- Terraform modules for infrastructure deployment
|
|
24
|
+
- Comprehensive TypeScript support
|
|
25
|
+
- Full test coverage with Vitest
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
- **Client SDK**: DynamoDB operations with MongoDB-like API
|
|
30
|
+
- `insertOne`, `insertMany`
|
|
31
|
+
- `findOne`, `find` with cursor support
|
|
32
|
+
- `updateOne`, `updateMany`
|
|
33
|
+
- `deleteOne`, `deleteMany`
|
|
34
|
+
- **Server Implementation**: Lambda handler for serverless deployments
|
|
35
|
+
- **Shadow Records**: Automatic generation and management for sorting
|
|
36
|
+
- **Advanced Filtering**: 7 operators (eq, lt, lte, gt, gte, starts, ends)
|
|
37
|
+
- **Bulk Operations**: Automatic chunking for large datasets
|
|
38
|
+
- **TTL Support**: Automatic data expiration
|
|
39
|
+
|
|
40
|
+
[Unreleased]: https://github.com/exabugs/dynamodb-client/compare/v0.1.0...HEAD
|
|
41
|
+
[0.1.0]: https://github.com/exabugs/dynamodb-client/releases/tag/v0.1.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 exabugs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# DynamoDB Client SDK
|
|
2
|
+
|
|
3
|
+
[](https://github.com/exabugs/dynamodb-client/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@exabugs/dynamodb-client)
|
|
5
|
+
|
|
6
|
+
DynamoDB Single-Table Client SDK with MongoDB-like API, Shadow Records, and Lambda implementation for serverless applications.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- 🚀 MongoDB-like API for DynamoDB
|
|
11
|
+
- 📦 Single-Table Design with Shadow Records
|
|
12
|
+
- 🔐 Multiple authentication methods (IAM, Cognito, Token)
|
|
13
|
+
- ⚡ Lambda function implementation included
|
|
14
|
+
- 🎨 react-admin integration
|
|
15
|
+
- 📝 TypeScript support
|
|
16
|
+
- 🏗️ Terraform modules for deployment
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
### From GitHub Packages (Private Repository)
|
|
21
|
+
|
|
22
|
+
1. Create a Personal Access Token with `read:packages` scope
|
|
23
|
+
2. Configure `.npmrc`:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
@exabugs:registry=https://npm.pkg.github.com
|
|
27
|
+
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
3. Install the package:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @exabugs/dynamodb-client
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
For detailed instructions, see [Private Package Usage Guide](docs/PRIVATE_PACKAGE_USAGE.md).
|
|
37
|
+
|
|
38
|
+
### From npm (Public - Coming Soon)
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm install @exabugs/dynamodb-client
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Quick Start
|
|
45
|
+
|
|
46
|
+
### Client Usage (IAM Authentication)
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { DynamoClient } from '@exabugs/dynamodb-client/client/iam';
|
|
50
|
+
|
|
51
|
+
const client = new DynamoClient(FUNCTION_URL, {
|
|
52
|
+
region: 'ap-northeast-1',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const db = client.db();
|
|
56
|
+
const collection = db.collection('articles');
|
|
57
|
+
|
|
58
|
+
// Create
|
|
59
|
+
await collection.insertOne({ title: 'Hello World', content: '...' });
|
|
60
|
+
|
|
61
|
+
// Read
|
|
62
|
+
const article = await collection.findOne({ title: 'Hello World' });
|
|
63
|
+
|
|
64
|
+
// Update
|
|
65
|
+
await collection.updateOne({ id: article.id }, { $set: { status: 'published' } });
|
|
66
|
+
|
|
67
|
+
// Delete
|
|
68
|
+
await collection.deleteOne({ id: article.id });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Server Usage (Lambda Function)
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { createHandler } from '@exabugs/dynamodb-client/server/handler';
|
|
75
|
+
|
|
76
|
+
export const handler = createHandler({
|
|
77
|
+
tableName: process.env.TABLE_NAME!,
|
|
78
|
+
region: process.env.AWS_REGION!,
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Requirements
|
|
83
|
+
|
|
84
|
+
- Node.js >= 18.0.0
|
|
85
|
+
- AWS Account (for DynamoDB and Lambda)
|
|
86
|
+
|
|
87
|
+
## Development
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Install dependencies
|
|
91
|
+
npm install
|
|
92
|
+
|
|
93
|
+
# Run tests
|
|
94
|
+
npm test
|
|
95
|
+
|
|
96
|
+
# Run tests with coverage
|
|
97
|
+
npm run test:coverage
|
|
98
|
+
|
|
99
|
+
# Build
|
|
100
|
+
npm run build
|
|
101
|
+
|
|
102
|
+
# Lint
|
|
103
|
+
npm run lint
|
|
104
|
+
|
|
105
|
+
# Format
|
|
106
|
+
npm run format
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 主要コマンド
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# ヘルプを表示
|
|
113
|
+
make help
|
|
114
|
+
|
|
115
|
+
# 開発
|
|
116
|
+
make install # 依存関係のインストール
|
|
117
|
+
make build # 全パッケージとLambda関数のビルド
|
|
118
|
+
make test # 全パッケージのテスト実行
|
|
119
|
+
make lint # Lint実行
|
|
120
|
+
make format # フォーマット実行
|
|
121
|
+
make clean # ビルド成果物の削除
|
|
122
|
+
|
|
123
|
+
# デプロイ
|
|
124
|
+
make deploy-dev # dev環境にデプロイ
|
|
125
|
+
make deploy-stg # stg環境にデプロイ
|
|
126
|
+
make deploy-prd # prd環境にデプロイ
|
|
127
|
+
|
|
128
|
+
# インフラ操作
|
|
129
|
+
make infra-plan ENV=dev # Terraformプランを表示
|
|
130
|
+
make infra-apply ENV=dev # Terraformを適用
|
|
131
|
+
make infra-status # Terraform状態を表示
|
|
132
|
+
|
|
133
|
+
# Lambda操作
|
|
134
|
+
make invoke-fetch ENV=dev # Fetch Lambdaを実行
|
|
135
|
+
make logs-fetch ENV=dev # Fetch Lambdaのログを表示
|
|
136
|
+
make logs-records ENV=dev # Records Lambdaのログを表示
|
|
137
|
+
|
|
138
|
+
# その他
|
|
139
|
+
make shadow-config # shadow.config.jsonを再生成
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 個別Makefileの使用
|
|
143
|
+
|
|
144
|
+
各Lambda関数には個別のMakefileも用意されています:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Fetch Lambda
|
|
148
|
+
cd functions/fetch
|
|
149
|
+
make help
|
|
150
|
+
make build
|
|
151
|
+
make deploy ENV=dev
|
|
152
|
+
make invoke
|
|
153
|
+
make logs
|
|
154
|
+
|
|
155
|
+
# Terraform
|
|
156
|
+
cd infra
|
|
157
|
+
make help
|
|
158
|
+
make plan ENV=dev
|
|
159
|
+
make apply ENV=dev
|
|
160
|
+
make status
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
詳細は[Makefile運用ガイドライン](.kiro/steering/makefile-operations.md)を参照してください。
|
|
164
|
+
|
|
165
|
+
## Records Lambda
|
|
166
|
+
|
|
167
|
+
Records Lambdaは`@exabugs/dynamodb-client`ライブラリに統合されています。
|
|
168
|
+
|
|
169
|
+
詳細は[packages/core/README.md](packages/core/README.md)を参照してください。
|
|
170
|
+
|
|
171
|
+
## ワークスペース構成
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
.
|
|
175
|
+
├── apps/ # アプリケーション (Admin UI, Mobile App)
|
|
176
|
+
├── functions/ # Lambda関数 (Fetch, Pipeline, Maintenance)
|
|
177
|
+
├── packages/ # 共有ライブラリ (core, shadows, graphql-types)
|
|
178
|
+
│ └── core/ # Records Lambda(サーバー実装)を含む
|
|
179
|
+
└── infra/ # Terraform設定
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**注**: Records Lambdaは`packages/core/`に統合されています。
|
|
183
|
+
|
|
184
|
+
## Admin UI 開発・デプロイ
|
|
185
|
+
|
|
186
|
+
### ローカル開発
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 開発サーバー起動
|
|
190
|
+
pnpm --filter @ainews/admin dev
|
|
191
|
+
|
|
192
|
+
# ブラウザで http://localhost:3000 にアクセス
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 環境変数設定
|
|
196
|
+
|
|
197
|
+
`apps/admin/.env`ファイルを作成:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Records Lambda Function URL
|
|
201
|
+
VITE_RECORDS_API_URL=https://xxxxx.lambda-url.us-east-1.on.aws/
|
|
202
|
+
|
|
203
|
+
# Cognito User Pool設定
|
|
204
|
+
VITE_COGNITO_USER_POOL_ID=us-east-1_xxxxxxxxx
|
|
205
|
+
VITE_COGNITO_USER_POOL_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
206
|
+
VITE_COGNITO_DOMAIN=ainews-dev-auth.auth.us-east-1.amazoncognito.com
|
|
207
|
+
VITE_COGNITO_REGION=us-east-1
|
|
208
|
+
|
|
209
|
+
# 開発環境で認証を無効化する場合のみ(本番環境では必ずfalse)
|
|
210
|
+
VITE_DISABLE_AUTH=false
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 重要な設定
|
|
214
|
+
|
|
215
|
+
**必須**: Admin UIは**BrowserRouter**を使用します。HashRouterは使用しないでください。
|
|
216
|
+
|
|
217
|
+
理由:
|
|
218
|
+
|
|
219
|
+
- Cognito Hosted UIの認証コールバックがクエリパラメータ(`?code=xxx`)を使用
|
|
220
|
+
- HashRouter(`#/`)ではクエリパラメータが正しく処理されない
|
|
221
|
+
|
|
222
|
+
### 本番デプロイ(CloudFront)
|
|
223
|
+
|
|
224
|
+
CloudFront経由で配信する場合、以下の設定が必要です:
|
|
225
|
+
|
|
226
|
+
1. **エラーページ設定**: 404/403エラーを`/index.html`にリダイレクト(SPA対応)
|
|
227
|
+
2. **キャッシュ設定**:
|
|
228
|
+
- `index.html`: キャッシュしない(TTL=0)
|
|
229
|
+
- 静的アセット(JS/CSS/画像): 長期キャッシュ(TTL=7日〜1年)
|
|
230
|
+
3. **Cognitoコールバック URL**: 本番ドメインを追加
|
|
231
|
+
|
|
232
|
+
詳細は[設計書](.kiro/specs/ainews-pipeline/design.md)の「Admin UI 重要な設定」セクションを参照してください。
|
|
233
|
+
|
|
234
|
+
### トラブルシューティング
|
|
235
|
+
|
|
236
|
+
#### CORSエラーが発生する場合
|
|
237
|
+
|
|
238
|
+
1. **Lambda関数を最新版にデプロイ**:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
cd functions/records
|
|
242
|
+
pnpm build
|
|
243
|
+
cd ../../infra
|
|
244
|
+
terraform apply -var-file=envs/dev.tfvars
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
2. **ブラウザのキャッシュをクリア**: Cmd+Shift+R (Mac) または Ctrl+Shift+R (Windows/Linux)
|
|
248
|
+
|
|
249
|
+
3. **Lambda Function URLのCORS設定を確認**: `infra/modules/api/lambda-records/main.tf`
|
|
250
|
+
|
|
251
|
+
**重要**: Lambda Function URLのCORS設定を使用するため、Lambda関数のハンドラーではCORSヘッダーを設定しません。
|
|
252
|
+
|
|
253
|
+
#### Cognito Hosted UIでログインできない場合
|
|
254
|
+
|
|
255
|
+
1. **開発サーバーのポートを確認**: `http://localhost:3000` で起動していることを確認
|
|
256
|
+
- Vite設定で `strictPort: true` が設定されているため、ポート3000が使用中の場合はエラーになります
|
|
257
|
+
- 他のプロセスがポート3000を使用していないか確認してください
|
|
258
|
+
|
|
259
|
+
2. **Cognitoのコールバック/ログアウトURLを確認**: `infra/envs/dev.tfvars`
|
|
260
|
+
|
|
261
|
+
```hcl
|
|
262
|
+
admin_callback_urls = [
|
|
263
|
+
"http://localhost:3000",
|
|
264
|
+
"http://localhost:3000/callback",
|
|
265
|
+
...
|
|
266
|
+
]
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
3. **ブラウザのローカルストレージをクリア**: 古いセッション情報が残っている可能性があります
|
|
270
|
+
|
|
271
|
+
## ドキュメント
|
|
272
|
+
|
|
273
|
+
詳細な設計・要件については以下を参照してください:
|
|
274
|
+
|
|
275
|
+
- [要件定義書](.kiro/specs/ainews-pipeline/requirements.md)
|
|
276
|
+
- [設計書](.kiro/specs/ainews-pipeline/design.md)
|
|
277
|
+
- [実装タスクリスト](.kiro/specs/ainews-pipeline/tasks.md)
|
|
278
|
+
|
|
279
|
+
## ライセンス
|
|
280
|
+
|
|
281
|
+
MIT License - 詳細は [LICENSE](LICENSE) ファイルを参照してください。
|
|
282
|
+
|
|
283
|
+
Copyright (c) 2024 exabugs
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collection(共通実装)
|
|
3
|
+
*
|
|
4
|
+
* 認証ハンドラーは外部から注入されます。
|
|
5
|
+
*/
|
|
6
|
+
import type { DeleteResult, Filter, FindOptions, InsertManyResult, InsertOneResult, UpdateOperators, UpdateResult } from '../types.js';
|
|
7
|
+
import type { ClientOptions } from './DynamoClient.js';
|
|
8
|
+
import { FindCursor } from './FindCursor.js';
|
|
9
|
+
/**
|
|
10
|
+
* 認証ハンドラー関数の型
|
|
11
|
+
*/
|
|
12
|
+
export type AuthHeadersGetter<TAuthOptions = unknown> = (endpoint: string, body: string, authOptions?: TAuthOptions) => Promise<Record<string, string>>;
|
|
13
|
+
/**
|
|
14
|
+
* コレクションのドキュメント型の基本インターフェース
|
|
15
|
+
*/
|
|
16
|
+
export interface DocumentBase {
|
|
17
|
+
id: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* コレクション
|
|
22
|
+
*
|
|
23
|
+
* MongoDB風のCRUD操作を提供します。
|
|
24
|
+
* 型安全なフィルタとクエリAPIでDynamoDBを操作できます。
|
|
25
|
+
*
|
|
26
|
+
* @template TSchema - コレクションのドキュメント型
|
|
27
|
+
* @template TAuthOptions - 認証オプションの型
|
|
28
|
+
*/
|
|
29
|
+
export declare class Collection<TSchema extends DocumentBase = DocumentBase, TAuthOptions = unknown> {
|
|
30
|
+
private endpoint;
|
|
31
|
+
private databaseName;
|
|
32
|
+
private collectionName;
|
|
33
|
+
private authToken;
|
|
34
|
+
private authOptions;
|
|
35
|
+
private clientOptions;
|
|
36
|
+
private getAuthHeaders;
|
|
37
|
+
constructor(endpoint: string, databaseName: string, collectionName: string, authToken: string | undefined, authOptions: TAuthOptions | undefined, clientOptions: ClientOptions | undefined, getAuthHeaders: AuthHeadersGetter<TAuthOptions>);
|
|
38
|
+
getName(): string;
|
|
39
|
+
getEndpoint(): string;
|
|
40
|
+
getDatabaseName(): string;
|
|
41
|
+
getAuthToken(): string | undefined;
|
|
42
|
+
getAuthOptions(): TAuthOptions | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* HTTPリクエストを送信(内部使用)
|
|
45
|
+
*/
|
|
46
|
+
private request;
|
|
47
|
+
find(filter?: Filter<TSchema>, options?: FindOptions): FindCursor<TSchema, TAuthOptions>;
|
|
48
|
+
findOne(filter: Filter<TSchema>): Promise<TSchema | null>;
|
|
49
|
+
findMany(ids: string[]): Promise<TSchema[]>;
|
|
50
|
+
insertOne(document: TSchema): Promise<InsertOneResult>;
|
|
51
|
+
insertMany(documents: TSchema[]): Promise<InsertManyResult>;
|
|
52
|
+
updateOne(filter: Filter<TSchema>, update: UpdateOperators<TSchema>): Promise<UpdateResult>;
|
|
53
|
+
updateMany(filter: Filter<TSchema>, update: UpdateOperators<TSchema>): Promise<UpdateResult>;
|
|
54
|
+
deleteOne(filter: Filter<TSchema>): Promise<DeleteResult>;
|
|
55
|
+
deleteMany(filter: Filter<TSchema>): Promise<DeleteResult>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=Collection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../../src/client/Collection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,YAAY,GAAG,OAAO,IAAI,CACtD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,YAAY,KACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU,CAAC,OAAO,SAAS,YAAY,GAAG,YAAY,EAAE,YAAY,GAAG,OAAO;IAEvF,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;gBANd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,YAAY,GAAG,SAAS,EACrC,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAGzD,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,cAAc,IAAI,YAAY,GAAG,SAAS;IAI1C;;OAEG;YACW,OAAO;IAwDrB,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAO,CAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;IActF,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAUzD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAU3C,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAStD,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmB3D,SAAS,CACb,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC;IAelB,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC;IAkBlB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IASzD,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;CAUjE"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { FindCursor } from './FindCursor.js';
|
|
2
|
+
/**
|
|
3
|
+
* コレクション
|
|
4
|
+
*
|
|
5
|
+
* MongoDB風のCRUD操作を提供します。
|
|
6
|
+
* 型安全なフィルタとクエリAPIでDynamoDBを操作できます。
|
|
7
|
+
*
|
|
8
|
+
* @template TSchema - コレクションのドキュメント型
|
|
9
|
+
* @template TAuthOptions - 認証オプションの型
|
|
10
|
+
*/
|
|
11
|
+
export class Collection {
|
|
12
|
+
endpoint;
|
|
13
|
+
databaseName;
|
|
14
|
+
collectionName;
|
|
15
|
+
authToken;
|
|
16
|
+
authOptions;
|
|
17
|
+
clientOptions;
|
|
18
|
+
getAuthHeaders;
|
|
19
|
+
constructor(endpoint, databaseName, collectionName, authToken, authOptions, clientOptions, getAuthHeaders) {
|
|
20
|
+
this.endpoint = endpoint;
|
|
21
|
+
this.databaseName = databaseName;
|
|
22
|
+
this.collectionName = collectionName;
|
|
23
|
+
this.authToken = authToken;
|
|
24
|
+
this.authOptions = authOptions;
|
|
25
|
+
this.clientOptions = clientOptions;
|
|
26
|
+
this.getAuthHeaders = getAuthHeaders;
|
|
27
|
+
}
|
|
28
|
+
getName() {
|
|
29
|
+
return this.collectionName;
|
|
30
|
+
}
|
|
31
|
+
getEndpoint() {
|
|
32
|
+
return this.endpoint;
|
|
33
|
+
}
|
|
34
|
+
getDatabaseName() {
|
|
35
|
+
return this.databaseName;
|
|
36
|
+
}
|
|
37
|
+
getAuthToken() {
|
|
38
|
+
return this.authToken;
|
|
39
|
+
}
|
|
40
|
+
getAuthOptions() {
|
|
41
|
+
return this.authOptions;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* HTTPリクエストを送信(内部使用)
|
|
45
|
+
*/
|
|
46
|
+
async request(operation, params) {
|
|
47
|
+
const requestBody = JSON.stringify({
|
|
48
|
+
operation,
|
|
49
|
+
database: this.databaseName,
|
|
50
|
+
collection: this.collectionName,
|
|
51
|
+
params,
|
|
52
|
+
});
|
|
53
|
+
let headers = {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
};
|
|
56
|
+
// 認証ヘッダーを追加(注入された関数を使用)
|
|
57
|
+
const authHeaders = await this.getAuthHeaders(this.endpoint, requestBody, this.authOptions);
|
|
58
|
+
headers = { ...headers, ...authHeaders };
|
|
59
|
+
// 後方互換性: authTokenが直接指定されている場合(非推奨)
|
|
60
|
+
if (this.authToken && !this.authOptions) {
|
|
61
|
+
headers['Authorization'] = `Bearer ${this.authToken}`;
|
|
62
|
+
}
|
|
63
|
+
// タイムアウト設定
|
|
64
|
+
const controller = new AbortController();
|
|
65
|
+
const timeout = this.clientOptions?.timeout || 30000;
|
|
66
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(this.endpoint, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers,
|
|
71
|
+
body: requestBody,
|
|
72
|
+
signal: controller.signal,
|
|
73
|
+
});
|
|
74
|
+
clearTimeout(timeoutId);
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
const error = (await response.json().catch(() => ({ message: response.statusText })));
|
|
77
|
+
throw new Error(`Request failed: ${error.message || response.statusText}`);
|
|
78
|
+
}
|
|
79
|
+
const result = (await response.json());
|
|
80
|
+
return result.data;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
clearTimeout(timeoutId);
|
|
84
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
85
|
+
throw new Error(`Request timeout after ${timeout}ms`);
|
|
86
|
+
}
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
find(filter = {}, options) {
|
|
91
|
+
return new FindCursor(this.endpoint, this.databaseName, this.collectionName, filter, options, this.authToken, this.authOptions, this.clientOptions, this.getAuthHeaders);
|
|
92
|
+
}
|
|
93
|
+
async findOne(filter) {
|
|
94
|
+
const response = await this.request('findOne', { filter });
|
|
95
|
+
// Records Lambda は直接レコードを返す({ document: ... } ではない)
|
|
96
|
+
// 空オブジェクトの場合はnullを返す
|
|
97
|
+
if (!response || (typeof response === 'object' && Object.keys(response).length === 0)) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
return response;
|
|
101
|
+
}
|
|
102
|
+
async findMany(ids) {
|
|
103
|
+
const response = await this.request('findMany', { filter: { id: { in: ids } } });
|
|
104
|
+
// Records Lambdaは配列を直接返す
|
|
105
|
+
if (Array.isArray(response)) {
|
|
106
|
+
return response;
|
|
107
|
+
}
|
|
108
|
+
const responseObj = response;
|
|
109
|
+
return responseObj.items || [];
|
|
110
|
+
}
|
|
111
|
+
async insertOne(document) {
|
|
112
|
+
const response = await this.request('insertOne', { document });
|
|
113
|
+
const result = response;
|
|
114
|
+
return {
|
|
115
|
+
acknowledged: true,
|
|
116
|
+
insertedId: result.insertedId,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async insertMany(documents) {
|
|
120
|
+
const response = await this.request('insertMany', { documents });
|
|
121
|
+
// Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
|
|
122
|
+
// MongoDB互換形式に変換
|
|
123
|
+
const result = response;
|
|
124
|
+
return {
|
|
125
|
+
acknowledged: true,
|
|
126
|
+
insertedCount: result.count || 0,
|
|
127
|
+
insertedIds: result.successIds || {},
|
|
128
|
+
failedIds: result.failedIds,
|
|
129
|
+
errors: result.errors,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async updateOne(filter, update) {
|
|
133
|
+
const response = await this.request('updateOne', { filter, update });
|
|
134
|
+
const result = response;
|
|
135
|
+
return {
|
|
136
|
+
acknowledged: true,
|
|
137
|
+
matchedCount: result.matchedCount,
|
|
138
|
+
modifiedCount: result.modifiedCount,
|
|
139
|
+
upsertedId: result.upsertedId,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async updateMany(filter, update) {
|
|
143
|
+
const response = await this.request('updateMany', { filter, update });
|
|
144
|
+
// Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
|
|
145
|
+
// MongoDB互換形式に変換
|
|
146
|
+
const result = response;
|
|
147
|
+
const successCount = Object.keys(result.successIds || {}).length;
|
|
148
|
+
const failedCount = Object.keys(result.failedIds || {}).length;
|
|
149
|
+
return {
|
|
150
|
+
acknowledged: true,
|
|
151
|
+
matchedCount: successCount + failedCount, // 成功 + 失敗の合計
|
|
152
|
+
modifiedCount: result.count || 0, // 実際に更新された件数
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async deleteOne(filter) {
|
|
156
|
+
const response = await this.request('deleteOne', { filter });
|
|
157
|
+
const result = response;
|
|
158
|
+
return {
|
|
159
|
+
acknowledged: true,
|
|
160
|
+
deletedCount: result.deletedCount,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async deleteMany(filter) {
|
|
164
|
+
const response = await this.request('deleteMany', { filter });
|
|
165
|
+
// Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
|
|
166
|
+
// MongoDB互換形式に変換
|
|
167
|
+
const result = response;
|
|
168
|
+
return {
|
|
169
|
+
acknowledged: true,
|
|
170
|
+
deletedCount: result.count || 0, // 実際に削除された件数
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=Collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collection.js","sourceRoot":"","sources":["../../src/client/Collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* データベース(共通実装)
|
|
3
|
+
*
|
|
4
|
+
* 認証ハンドラーは外部から注入されます。
|
|
5
|
+
*/
|
|
6
|
+
import { type AuthHeadersGetter, Collection } from './Collection.js';
|
|
7
|
+
import type { ClientOptions } from './DynamoClient.js';
|
|
8
|
+
/**
|
|
9
|
+
* データベース
|
|
10
|
+
*
|
|
11
|
+
* コレクションへのアクセスを提供します。
|
|
12
|
+
*
|
|
13
|
+
* @template TAuthOptions - 認証オプションの型
|
|
14
|
+
*/
|
|
15
|
+
export declare class Database<TAuthOptions = unknown> {
|
|
16
|
+
private _endpoint;
|
|
17
|
+
private _databaseName;
|
|
18
|
+
private _authToken;
|
|
19
|
+
private _authOptions;
|
|
20
|
+
private _clientOptions;
|
|
21
|
+
private _getAuthHeaders;
|
|
22
|
+
constructor(_endpoint: string, _databaseName: string, _authToken: string | undefined, _authOptions: TAuthOptions | undefined, _clientOptions: ClientOptions | undefined, _getAuthHeaders: AuthHeadersGetter<TAuthOptions>);
|
|
23
|
+
getEndpoint(): string;
|
|
24
|
+
getDatabaseName(): string;
|
|
25
|
+
getAuthToken(): string | undefined;
|
|
26
|
+
getAuthOptions(): TAuthOptions | undefined;
|
|
27
|
+
collection<TSchema extends {
|
|
28
|
+
id: string;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
} = {
|
|
31
|
+
id: string;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}>(name: string): Collection<TSchema, TAuthOptions>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=Database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../src/client/Database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,QAAQ,CAAC,YAAY,GAAG,OAAO;IAExC,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;gBALf,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,eAAe,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAG1D,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,cAAc,IAAI,YAAY,GAAG,SAAS;IAI1C,UAAU,CACR,OAAO,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAC/F,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;CAenD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* データベース(共通実装)
|
|
3
|
+
*
|
|
4
|
+
* 認証ハンドラーは外部から注入されます。
|
|
5
|
+
*/
|
|
6
|
+
import { Collection } from './Collection.js';
|
|
7
|
+
/**
|
|
8
|
+
* データベース
|
|
9
|
+
*
|
|
10
|
+
* コレクションへのアクセスを提供します。
|
|
11
|
+
*
|
|
12
|
+
* @template TAuthOptions - 認証オプションの型
|
|
13
|
+
*/
|
|
14
|
+
export class Database {
|
|
15
|
+
_endpoint;
|
|
16
|
+
_databaseName;
|
|
17
|
+
_authToken;
|
|
18
|
+
_authOptions;
|
|
19
|
+
_clientOptions;
|
|
20
|
+
_getAuthHeaders;
|
|
21
|
+
constructor(_endpoint, _databaseName, _authToken, _authOptions, _clientOptions, _getAuthHeaders) {
|
|
22
|
+
this._endpoint = _endpoint;
|
|
23
|
+
this._databaseName = _databaseName;
|
|
24
|
+
this._authToken = _authToken;
|
|
25
|
+
this._authOptions = _authOptions;
|
|
26
|
+
this._clientOptions = _clientOptions;
|
|
27
|
+
this._getAuthHeaders = _getAuthHeaders;
|
|
28
|
+
}
|
|
29
|
+
getEndpoint() {
|
|
30
|
+
return this._endpoint;
|
|
31
|
+
}
|
|
32
|
+
getDatabaseName() {
|
|
33
|
+
return this._databaseName;
|
|
34
|
+
}
|
|
35
|
+
getAuthToken() {
|
|
36
|
+
return this._authToken;
|
|
37
|
+
}
|
|
38
|
+
getAuthOptions() {
|
|
39
|
+
return this._authOptions;
|
|
40
|
+
}
|
|
41
|
+
collection(name) {
|
|
42
|
+
if (!name || name.trim() === '') {
|
|
43
|
+
throw new Error('Collection name cannot be empty');
|
|
44
|
+
}
|
|
45
|
+
return new Collection(this._endpoint, this._databaseName, name, this._authToken, this._authOptions, this._clientOptions, this._getAuthHeaders);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=Database.js.map
|