https://github.com/mits87/nestjs-dynamodb
Opinionated way to use DynamoDB with NestJS and typescript
https://github.com/mits87/nestjs-dynamodb
Last synced: about 1 month ago
JSON representation
Opinionated way to use DynamoDB with NestJS and typescript
- Host: GitHub
- URL: https://github.com/mits87/nestjs-dynamodb
- Owner: mits87
- License: mit
- Created: 2021-12-11T22:11:11.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2021-12-12T00:50:06.000Z (over 4 years ago)
- Last Synced: 2025-10-09T14:20:00.152Z (8 months ago)
- Language: TypeScript
- Size: 12.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# NestJS DynamoDB Mapper
## Description
Opinionated way to use DynamoDB with NestJS and typescript, heavily inspired by [nestjs-typed-dynamodb](https://www.npmjs.com/package/nestjs-typed-dynamodb)
## Getting Started
First install this module
`npm install nestjs-dynamodb`
Notice that it will install as a dependency:
- [dynamodb-data-mapper-annotations](https://github.com/awslabs/dynamodb-data-mapper-js/tree/master/packages/dynamodb-data-mapper-annotations)
- [dynamodb-data-mapper](https://github.com/awslabs/dynamodb-data-mapper-js/tree/master/packages/dynamodb-data-mapper)
## Usage
In order to create a DynamoDB connection
**app.module.ts**
```typescript
import { Module } from '@nestjs/common';
import { DynamoDBModule } from 'nestjs-dynamodb';
import { CatsModule } from './cat.module.ts';
@Module({
imports: [
DynamoDBModule.forRoot({
AWSConfig: {},
dynamoDBOptions: {},
}),
CatsModule,
],
})
export class AppModule {}
```
**cats.module.ts**
```typescript
import { Module } from '@nestjs/common';
import { DynamoDBModule } from 'nestjs-dynamodb';
import { CatEntity } from './cat.entity';
import { CatsService } from './cats.service';
@Module({
imports: [DynamoDBModule.forFeature([CatEntity])],
providers: [CatsService],
})
export class CatsModule {}
```
To insert records to DynamoDB, you first need to create your table, for this we use [dynamodb-data-mapper-annotations](https://github.com/awslabs/dynamodb-data-mapper-js/tree/master/packages/dynamodb-data-mapper-annotations) (under the hood). Every decorator in that package is exposed in this package as well **BUT CAPITALIZED** .
**cat.entity.ts**
```typescript
import { Attribute, ReturnModel, Table } from 'nestjs-dynamodb';
import * as nanoid from 'nanoid';
@Table('cat')
class CatEntity {
@HashKey({ defaultProvider: nanoid })
pk: string;
@RangeKey()
sk: string;
@HashKey()
pk2: string;
@RangeKey()
sk2: string;
@Attribute()
age: number;
@Attribute()
alive?: boolean;
@Attribute()
createdAt: Date;
@Attribute({ defaultProvider: () => new Date() })
updatedAt: Date;
// This property will not be saved to DynamoDB.
notPersistedToDynamoDb: string;
}
export const Cat = ReturnModel();
```
Note: nanoid is only used a way to assign a random id, feel free to use whatever you want
**cats.service.ts**
```typescript
import { Injectable } from '@nestjs/common';
import { ReturnModel, InjectModel } from 'nestjs-dynamodb';
import { Cat } from './cat.entity';
import { CatInput } from './cat.input';
@Injectable()
export class CatsService {
constructor(@InjectModel(CatEntity) private readonly catModel: typeof Cat) {}
async all(input: Partial): Promise {
return this.catModel.query(input);
}
async find(id: string): Promise {
return this.catModel.find(id);
}
async create(input: CatInput): Promise {
return this.catModel.create(input);
}
async delete(input: string): Promise {
return this.catModel.delete(input);
}
async update(id: string, item: CatInput): Promise {
return this.catModel.update(id, item);
}
}
```
Now you can use your service as you wish!
## Async configuration
**app.module.ts**
```typescript
import { Module } from '@nestjs/common';
import { DynamoDBModule } from 'nestjs-dynamodb';
@Module({
imports: [
DynamoDBModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (config: ConfigService) => ({
AWSConfig: {
region: 'local',
accessKeyId: 'null',
secretAccessKey: 'null',
},
dynamoDBOptions: {
endpoint: config.get('DYNAMODB_URL', 'localhost:8000'),
sslEnabled: false,
region: 'local-env',
},
}),
inject: [ConfigService],
}),
],
})
export class AppModule {}
```