Create and manage DynamoDB tables in TypeScript with declarative configuration
npm install @lafken/dynamoThis package simplifies the creation and management of DynamoDB tables. It provides decorators that allow you to define the table’s configuration declaratively, as well as to enable a direct service that can be consumed within Lambda functions for performing DynamoDB operations.
``bash`
npm install @lafken/dynamo
To get started, you must add the DynamoResolver to your application. Import the resolver and instantiate it, passing the classes that will define the DynamoDB tables. Each class must be decorated with the @Model decorator, which receives the configuration applied to the table, along with the properties that compose the data model.
`typescript
import { ApiResolver } from '@lafken/bucket/resolver';
//...
@Model({
name: 'clients',
indexes: [
{
type: 'local',
name: 'email_age_index',
sortKey: 'age',
},
],
ttl: 'expireAt',
})
export class Client {
@PartitionKey(String)
email: PrimaryPartition
@SortKey(String)
name: PrimaryPartition
@Field()
age: number;
@Field()
expireAt: number;
}
// ...
createApp({
name: 'awesome-app',
resolvers: [
new DynamoResolver([Client]),
],
...
});
`
`typescript`
@Model({
name: 'clients',
})
class Client {
@PartitionKey(String)
email: PrimaryPartition
}
To consume and process these events, use the @alicanto/event package, which provides decorators for defining EventBridge listeners and handling DynamoDB stream payloads.
`typescript`
@Model({
name: 'clients',
ttl: 'expireAt',
stream: {
enabled: true,
type: 'NEW_IMAGE',
filters: {
keys: {
email: [{ suffix: 'lafken.com' }],
},
newImage: {
name: ['foo'],
},
},
},
})
export class Client {
// ...
}$3
Once a bucket is defined, you can create a repository for it. A repository provides direct access to common S3 SDK operations such as uploading, moving, or deleting objects.
`typescript`
export const clientRepository = createRepository(Client);
// ...
await clientRepository
.create({
name: 'lafken',
age: 1,
email: 'awesome@lafken.com',
expireAt: 1000000000,
})
.exec();
// ...
await clientRepository.findAll({
keyCondition: {
partition: {
email: 'awesome@lafken.com'
}
}
}).exec();
`typescript``
await transaction([
clientRepository.create({
name: 'lafken',
age: 1,
email: 'awesome@lafken.com',
expireAt: 1000000000,
}),
documentRepository.create({
// ...
}),
]);