Abstraction 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!
- Provides Abstractions for your
NestJS
RESTfulAPI. - Includes:
AbstractModule
,AbstractService
, andAbstractControllerFactory
along withAbstractModel
(mongoose
) andAbstractEntity
(typeorm
). - Supports
@nestjs/swagger
I 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-abstract
-
Import
AbstractModule
in yourAppModule
import { Module } from '@nestjs/common'; import { AbstractModule } from 'nest-abstract'; @Module({ imports: [AbstractModule.forRoot()], }) export class AppModule {}
By default,
AbstractModule
will useMongoose
. You can pass a value ofObjectMapping
to theforRoot()
method.import { Module } from '@nestjs/common'; import { AbstractModule, ObjectMapping } from 'nest-abstract'; @Module({ imports: [AbstractModule.forRoot(ObjectMapping.TypeOrm)], }) export class AppModule {}
Note:
ObjectMapping.Mongoose
will require you to installmongoose
and@nestjs/mongoose
whileObjectMapping.TypeOrm
will require you to installtypeorm
and@nestjs/typeorm
.Note: I will list the usage for Mongoose from step 2 on.
-
Create your
MongooseSchema
and create an interface that will extendAbstractModel
.AbstractModel
is an interface that has:createdAt
,updatedAt
andid
.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 yourModel
with@nestjs/mongoose
. -
Create your
Service
withAbstractMongooseService
.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<Todo> { constructor(@InjectModel('todo') private readonly _todoModel: Model<Todo>) { super(_todoModel); } }
Use
@InjectModel()
from@nestjs/mongoose
to inject your MongooseModel and pass that to the abstract constructor. -
Create your
Controller
withabstractControllerFactory
import { Controller } from '@nestjs/common'; import { abstractControllerFactory } from 'nest-abstract'; import { Todo } from './todo.model'; import { TodoService } from './todo.service'; const BaseController = abstractControllerFactory<Todo>({model: TodoService.model}); @Controller('todo') export class TodoController extends BaseController { constructor(private readonly _todoService: TodoService) { super(_todoService); } }
-
Make sure you put your
Service
inproviders
array inModule
and yourController
incontrollers
array inModule
.Now your
TodoController
should have 5 pre-defined route handlers:find
,findById
,create
,update
anddelete
To enable Authenticate
on your Controllers
with Passport
, abstractControllerWithAuth
.
You need to install
passport
and@nestjs/passport
if you want to enableAuthentication
.
import { abstractControllerWithAuth } from 'nest-abstract';
const BaseController = abstractControllerWithAuth<Todo>({model: TodoService.model});
By default,
auth
is enabled by on all 5 CRUDs operations.
To enable Swagger
on your Controller
, use abstractControllerWithSwagger
.
Authentication
is "mandatory" withSwagger
so you will have to have:passport
,@nestjs/passport
and@nestjs/swagger
installed. By default,auth
is enabled by on all 5 CRUDs operations. If you wish to useabstractControllerWithSwagger
withoutauth
, please pass in an object of typeDefaultAuthObj
and set all the properties tofalse
.
- Might break
abstractControllerFactory
out to 3 separate factories: normal, swagger and withAuth - Supports
Serialization
(https://docs.nestjs.com/techniques/serialization)? - anything?
- @rcanessa89 and his/her repository: https://github.com/rcanessa89/nest-js-starter. rcanessa89 first raised an issue regarding a
BaseController
on mynest-mean
repository and came up with his/herBaseController
.