1.0.1 • Published 6 months ago

@sixaphone/nestjs-drizzle v1.0.1

Weekly downloads
-
License
ISC
Repository
-
Last release
6 months ago

Description

A module for using drizzle-orm in NestJS

Project setup

$ npm i @sixaphone/nestjs-drizzle

Register connections

import { Module } from '@nestjs/common';
import { DrizzleModule } from '@sixaphone/nestjs-drizzle';
import { schema } from './database/schema';
import tursoConfig, { TursoConfig } from './config/turso.config';
import { DBS } from './constants';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    // local with custom name
    DrizzleModule.forRoot({
      type: 'sqlite',
      name: DBS.LOCAL,
      url: 'file:project.db',
      schema,
    }),
    // local with default name
    DrizzleModule.forRoot({
      type: 'sqlite',
      url: 'file:defaukt_db.db',
      schema,
    }),
    // remote turso with custom name
    DrizzleModule.forRootAsync({
      name: DBS.TURSO,
      useFactory: (tursoConfig: TursoConfig) => {
        return {
          type: 'sqlite',
          url: tursoConfig.databaseUrl!,
          authToken: tursoConfig.authToken!,
          schema,
        };
      },
      imports: [ConfigModule.forFeature(tursoConfig)],
      inject: [tursoConfig.KEY],
    }),
    ConfigModule.forRoot({}),
  ],
})
export class AppModule {}

Add Entities for feature

@Module({
  imports: [
    // for local named
    DrizzleModule.forFeature({
      entities: [users],
      name: DBS.LOCAL,
    }),
    // for local default
    DrizzleModule.forFeature({
      entities: [users],
    }),
    // for remote named
    DrizzleModule.forFeature({
      entities: [users],
      name: DBS.TURSO,
    }),
  ],
  providers: [MyService],
  controllers: [MyController],
})
export class MyModule {}

Usage

You can choose to either use the client or a entity repository. Using the client will give full access to the underlying drizzle client connection, while the repository will limit the functionality.

Using Client

import { Injectable } from '@nestjs/common';
import { DrizzleDatabase, InjectClient } from '@sixaphone/nestjs-drizzle';

@Injectable()
export class UserService {
  constructor(
    // inject the name here or leave empty for default
    @InjectClient('local')
    private readonly drizzleLocal: DrizzleDatabase<'sqlite', Schema>,
  ) {}

  public async createUser(name: string) {
    const user = await this.drizzleLocal.transaction((tx) => {
      return tx
        .insert(urls)
        .values({
          name,
        })
        .returning();
    });

    return user;
  }
}

Using repository

import { Injectable } from '@nestjs/common';
import { DrizzleRepository, InjectRepository } from '@sixaphone/nestjs-drizzle';
import { eq } from 'drizzle-orm';
import { users } from 'src/database/user.entity';

@Injectable()
export class UserService {
  constructor(
    // inject the name here or leave empty for default
    @InjectRepository(users, 'local')
    private readonly userRepository: DrizzleRepository<
      Schema,
      'users',
      'sqlite'
    >,
  ) {}

  public async createUser(name: string) {
    const [user] = await this.userRepository.insert({
      name
    });

    return user;
  }

  public async getByName(name: string) {
    // select user by name and only take name field 
    // select name from users where name = $1
    const [user] = await this.userRepository.selectWhere(eq(users.name, name), {name: users.name});

    // or
    const [user] = await this.userRepository.select({name: users.name}).where(eq(users.name, name));

    return user;
  }
}

Example

Check out the example url-redirect app in example/ directory

Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.