NestJS Abstraction Helper
npm install nest-abstractAbstraction component for NestJs.
Fair warning: This package is still in early development stage. Please give me any feedbacks if you decide to try it out and find any problems/area-for-improvements. Thank you!
NestJS RESTfulAPI.AbstractModule, AbstractService, and AbstractControllerFactory along with AbstractModel (mongoose) and AbstractEntity (typeorm).@nestjs/swaggerI am a big fan of TypeScript and abstraction overall. One of the biggest motivations is to create a BaseController to work with Swagger's decorators that @nestjs/swagger provides which is on the todo list. Main reason is I want to roll out a version of the package that will make it work with non-swagger applications first as this is my first attempt at an npm package.
npm i nest-abstract1. Import AbstractModule in your AppModule
``typescript
import { Module } from '@nestjs/common';
import { AbstractModule } from 'nest-abstract';
@Module({
imports: [AbstractModule.forRoot()],
})
export class AppModule {}
`
> By default, AbstractModule will use Mongoose. You can pass a value of ObjectMapping to the forRoot() method.
`typescript
import { Module } from '@nestjs/common';
import { AbstractModule, ObjectMapping } from 'nest-abstract';
@Module({
imports: [AbstractModule.forRoot(ObjectMapping.TypeOrm)],
})
export class AppModule {}
`ObjectMapping.Mongoose
> Note: will require you to install mongoose and @nestjs/mongoose while ObjectMapping.TypeOrm will require you to install typeorm and @nestjs/typeorm.
Note: I will list the usage for Mongoose from step 2 on.
2. Create your MongooseSchema and create an interface that will extend AbstractModel. AbstractModel is an interface that has: createdAt, updatedAt and id.`
typescript
import { Schema } from 'mongoose';
import { AbstractModel } from 'nest-abstract';
const todoSchema = new Schema({
content: {
type: String
}
}, { timestamps: true });
interface Todo extends AbstractModel {
content: string;
}
`
> Use your schema to initialize your Model with @nestjs/mongoose.
3. Create your Service with AbstractMongooseService.`
typescript
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { AbstractMongooseService } from 'nest-abstract';
import { Model } from 'mongoose';
@Injectable()
export class TodoService extends AbstractMongooseService
constructor(@InjectModel('todo') private readonly _todoModel: Model
super(_todoModel);
}
}
`@InjectModel()
> Use from @nestjs/mongoose to inject your MongooseModel and pass that to the abstract constructor.
4. Create your Controller with abstractControllerFactory`
typescript
import { Controller } from '@nestjs/common';
import { abstractControllerFactory } from 'nest-abstract';
import { Todo } from './todo.model';
import { TodoService } from './todo.service';
const BaseController = abstractControllerFactory
@Controller('todo')
export class TodoController extends BaseController {
constructor(private readonly _todoService: TodoService) {
super(_todoService);
}
}
`
5. Make sure you put your Service in providers array in Module and your Controller in controllers array in Module.TodoController
> Now your should have 5 pre-defined route handlers: find, findById, create, update and delete
To enable Authenticate on your Controllers with Passport, abstractControllerWithAuth.passport
> You need to install and @nestjs/passport if you want to enable Authentication.`
typescript
import { abstractControllerWithAuth } from 'nest-abstract';
const BaseController = abstractControllerWithAuth
`auth
> By default, is enabled by on all 5 CRUDs operations.
With Swagger
To enable Swagger on your Controller, use abstractControllerWithSwagger.Authentication
> is "mandatory" with Swagger so you will have to have: passport, @nestjs/passport and @nestjs/swagger installed.auth
> By default, is enabled by on all 5 CRUDs operations. If you wish to use abstractControllerWithSwagger without auth, please pass in an object of type DefaultAuthObj and set all the properties to false.
- [x] Might break abstractControllerFactory out to 3 separate factories: normal, swagger and withAuthSerialization
- Supports (https://docs.nestjs.com/techniques/serialization)?
- anything?
on my nest-mean repository and came up with his/her BaseController`.