@vlxdisluv/cassandra-driver-adapter
Version:
Nest - wrapper over cassandra-driver
197 lines (155 loc) • 6.67 kB
Markdown
<p align="center">
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo_text.svg" width="320" alt="Nest Logo" /></a>
</p>
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
<p align="center">
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
</p>
<!--[](https://opencollective.com/nest#backer)
[](https://opencollective.com/nest#sponsor)-->
## Description
Cassandra Driver Adapter utilities module for [NestJS](https://github.com/nestjs/nest) based on the [cassandra-driver](https://github.com/datastax/nodejs-driver) package.
## Installation
```bash
$ npm i --save @vlxdisluv/cassandra-driver-adapter
```
```bash
$ yarn add @vlxdisluv/cassandra-driver-adapter
```
## Usage
Import `CassandraDriverAdapterModule`:
```typescript
@Module({
imports: [
CassandraDriverAdapterModule.forRootAsync({...})
],
providers: [...]
})
export class AppModule {}
```
## Async options
Quite often you might want to asynchronously pass your module options instead of passing them beforehand. In such case, use registerAsync() method, that provides a couple of various ways to deal with async data.
**1. Use factory**
```typescript
CassandraDriverAdapterModule.forRootAsync({
useFactory: () => ({...}),
})
```
Obviously, our factory behaves like every other one (might be `async` and is able to inject dependencies through `inject`).
```typescript
CassandraDriverAdapterModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => configService.getDbConfig(),
inject: [ConfigService],
});
```
**2. Use class**
```typescript
CassandraDriverAdapterModule.forRootAsync({
useClass: ConfigService,
});
```
Above construction will instantiate `ConfigService` inside `CassandraDriverAdapterModule` and will leverage it to create options object.
```typescript
class ConfigService implements CassandraDriverAdapterOptionsFactory {
createCassandraDriverAdapterOptions(): CassandraDriverAdapterModuleOptions {
return {...};
}
}
```
**3. Use existing**
```typescript
CassandraDriverAdapterModule.forRootAsync({
imports: [ConfigModule],
useExisting: ConfigService,
});
```
It works the same as `useClass` with one critical difference - `CassandraDriverAdapterModule` will lookup imported modules to reuse already created ConfigService, instead of instantiating it on its own.
## ORM Options
```typescript
import { Entity } from '@vlxdisluv/cassandra-driver-adapter/lib/orm';
@Entity({
tableName: 'messages',
})
export class Message {
id: any;
text: string;
}
```
Let's have a look at the `MessagesModule`
```typescript
import { Module } from '@nestjs/common';
import { CassandraDriverAdapterModule } from '@vlxdisluv/cassandra-driver-adapter';
import { MessagesService } from './messages.service';
import { MessagesController } from './messages.controller';
import { Message } from './message.entity';
@Module({
imports: [CassandraDriverAdapterModule.forFeature([Message])],
providers: [MessagesService],
controllers: [MessagesController],
})
export class MessagesModule {}
```
## Using Repository
```typescript
import { Module } from '@nestjs/common';
import { CassandraDriverAdapterModule } from '@vlxdisluv/cassandra-driver-adapter';
import { MessagesService } from './messages.service';
import { MessagesController } from './messages.controller';
import { Message } from './message.entity';
@Module({
imports: [CassandraDriverAdapterModule.forFeature([Message])],
providers: [MessagesService],
controllers: [MessagesController],
})
export class MessagesModule {}
```
```typescript
import { Injectable } from '@nestjs/common';
import {
InjectRepository,
Repository,
} from '@vlxdisluv/cassandra-driver-adapter';
import { Message } from './message.entity';
import { Observable } from 'rxjs';
@Injectable()
export class PersonService {
constructor(
@InjectRepository(Message)
private readonly messagesRepository: Repository<Message>,
) {}
getById(id: id): Promise<PhotoEntity> {
return this.messagesRepository.findOne({ id });
}
}
```
## Using Custom Repository
Let's create a repository:
```typescript
import {
Repository,
EntityRepository,
} from '@vlxdisluv/cassandra-driver-adapter';
import { Message } from './message.entity';
import { Observable } from 'rxjs';
@EntityRepository(Message)
export class MessagesRepository extends Repository<Message> {
findById(id: any): Message {
return this.findOne({ id: id });
}
}
```
## Stay in touch
- Author - [Vladislav Severin](https://github.com/vlxdisluv)