Skip to content

vitaliy-grusha/nestjs-papr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

498168b · Jan 24, 2024

History

19 Commits
Jul 30, 2023
May 23, 2023
May 22, 2023
Jul 30, 2023
May 22, 2023
May 22, 2023
Jun 19, 2023
May 22, 2023
May 22, 2023
Jul 31, 2023
Jan 24, 2024
Jan 24, 2024
May 22, 2023
May 22, 2023

Repository files navigation

nestjs-papr

Description

nestjs-papr is a module that integrates the Papr library with the Nest Framework.

It provides a way to define Papr models and use them in your Nest modules through dependency injection. This integration allows you to easily work with Papr models in your Nest application.

Supports:

  • single MongoDB connection
  • multiple MongoDD connections
  • passing custom mongo client options
  • passing custom database options
  • passing custom collection options
  • sync and async configuration
  • automatic indexes creation

Getting started

Instalation

# npm
npm install nestjs-papr

# pnpm
pnpm add nestjs-papr

# yarn
yarn install nestjs-papr

Usage

  1. Import ParpModule for root
@Module({
  imports: [
    PaprModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => {
        const { MONGODB_URI, MONGODB_DATABASE_NAME } =
          configService.getConfig();
        return {
          uri: MONGODB_URI,
          databaseName: MONGODB_DATABASE_NAME,
          autoIndex: true, // Create indexes automatically
          autoSchema: true, // Create schema validation automatically
        };
      },
      inject: [ConfigService],
    }),
  ]
})
  1. Define your model
// user.model.ts

import { model, schema, types } from 'nestjs-papr';

export const UserSchema = schema(
  {
    _id: types.objectId({ required: true }),
    firstName: types.string({ required: true }),
  },
  {
    timestamps: true,
  },
);
export type UserDoc = (typeof UserSchema)[0];
export type UserProps = Omit<UserDoc, '_id' | 'createdAt' | 'updatedAt'>;
export type UserCollection = 'users'
export const UserModelDef = model(UserCollection, UserSchema, { 
  indexes: [
    // Optional indexes here (IndexDescription[] type in mongodb);
  ],
  collectionOptions: {
    // Optional collectionOptions here (CollectionOptions type in mongodb);
  }
});
  1. Provide your model for feature
@Module({
  imports: [
    PaprModule.forFeature([
      UserModelDef,
    ]),
  ]
})
  1. Inject model into service and use it's power
// module.service.ts

import { Injectable } from '@nestjs/common';
import { InjectModel } from 'nestjs-papr';
import { UserModelDef, UserDoc, UserProps } from './models/user.model';

@Injectable()
export class ModuleService {
  constructor(
    @InjectModel(UserModelDef)
    private readonly userModel: typeof UserModelDef.model,
  ) {}
  
  async createUser(userProps: UserProps): Promise<UserDoc> {
    return await this.userModel.insertOne({ ...userProps });
  }
}

Decorators

InjectModel = (modelDef: ModelDef, connectionName?: string) - inject model

InjectPapr = (connectionName: string) - inject Papr instance

InjectConnection = (name: string) - inject MongoClient instance

Configuration

export interface PaprModuleOptions {

  // MongoDB connection uri
  uri?: string;
  
  // Connection name 
  connectionName?: string;
  
  // MongoDB database name
  databaseName?: string;
  
  // Custom MongoClient options
  mongoClientOptions?: MongoClientOptions;
  
  // Custom database options
  databaseOptions?: DbOptions;
  
  // Custom options for papr instance
  paprOptions?: ModelOptions;
  
  // Number of attempts to connect to database
  retryAttempts?: number;
  
  // Number of delay between attempts
  retryDelay?: number;
  
  // Whether to create indexes automatically (default: false)
  autoIndex?: boolean;
  
  // Whether to schema validation automatically  (default: false)
  autoSchema?: boolean;
  
  connectionFactory?: (connection: any, name: string) => any;
  connectionErrorFactory?: (error: Error) => Error;
}

License

nestjs-papr is MIT licensed.