GithubHelp home page GithubHelp logo

wooodhead / ack-nestjs-boilerplate Goto Github PK

View Code? Open in Web Editor NEW

This project forked from andrechristikan/ack-nestjs-boilerplate

0.0 1.0 0.0 5.26 MB

NestJs v9.x Boilerplate. Repository Design Pattern. MongoDB (Mongoose). Containerization.

License: MIT License

Shell 0.18% TypeScript 99.82%

ack-nestjs-boilerplate's Introduction

Contributors Forks Stargazers Issues MIT License

NestJs NodeJs Typescript MongoDB JWT Jest Yarn Docker

ACK NestJs Boilerplate πŸ”₯ πŸš€

Amazon web service will be the cloud provider. This is why this project is focused on AWS features.

ACK NestJs is a Http NestJs v9.x boilerplate. Best uses for backend service.

You can request feature or report bug with following this link

Other Repo

Table of contents

Important

If you want to implementΒ database transactions, you must run MongoDB as aΒ replication set.

If you change the environment value of APP_ENV to production, that will trigger.

  1. CorsMiddleware will implement src/configs/middleware.config.ts.Otherwise is *.
  2. Documentation will disable.

Next Todo

Next development

  • Implement Repository Design Pattern / Data Access Object Design Pattern
  • Swagger for API Documentation
  • Mongo Repository soft delete
  • Make it simple
  • Encrypt jwt payload
  • Optimize Unit Testing
  • Make serverless separate repo
  • Optimize Swagger
  • Remove enum endpoint
  • Permission group fixed
  • Reduce the payload of access token
  • Update authorization mechanism, permission token on x-permission-token
  • Update package, cors setting, check all interfaces, husky trigger switch to on and check test
  • AuthApiKey mechanism
  • AuthApi Controller
    • AuthApi Get, Active, Inactive Endpoint
    • AuthApi Create (Random Key), and Reset Secret Endpoint
    • AuthApi Controller Test E2E
  • Fix automation testing
  • Pagination move from decorator to service pagination -> make pipe transformer -> wrap into group decorator ResponsePaging
  • Check Swagger for pagination
  • ApiKey add startDate and endDate
  • Make docker port expose be difference with port app
  • SSO
    • Google
    • Apple
    • Microsoft
    • Facebook
    • Twitter
  • Update Documentation, include an diagram for easier comprehension

Build with

Describes which version.

Name Version
NestJs v9.2.x
NodeJs v18.12.x
Typescript v4.9.x
Mongoose v6.8.x
MongoDB v6.0.x
Yarn v1.22.x
NPM v8.19.x
Docker v20.10.x
Docker Compose v2.6.x
Swagger v6.1.x

Objective

  • Easy to maintenance
  • NestJs Habit
  • Component based folder structure
  • Repository Design Pattern or Data Access Layer Design Pattern
  • Support Microservice Architecture, Serverless Architecture, Clean Architecture, and/or Hexagonal Architecture
  • Follow The Twelve-Factor App
  • Adopt SOLID and KISS principle

Features

  • NestJs v9.x πŸ₯³
  • Typescript πŸš€
  • Production ready πŸ”₯
  • Repository Design Pattern
  • Swagger included
  • Authentication and authorization (JWT, API Key) πŸ’ͺ
  • Role management system
  • Storage integration with AwsS3
  • Upload file single and multipart to AwsS3
  • Support multi-language i18n πŸ—£
  • Request validation with class-validation
  • Serialization with class-transformer
  • Url Versioning
  • Server Side Pagination, there have 3 of types
  • Import and export data with excel by using decorator

Database

  • MongoDB integrate by using mongoose πŸŽ‰
  • Multi Database
  • Database Transaction
  • Database Soft Delete
  • Database Migration

Logger and Debugger

  • Logger with Morgan
  • Debugger with Winston πŸ“

Security

  • Apply helmet, cors, and rate-limit
  • Timeout awareness and can override βŒ›οΈ
  • User agent awareness, and can whitelist user agent

Setting

  • Support environment file
  • Centralize configuration πŸ€–
  • Centralize response
  • Centralize exception filter
  • Setting from database πŸ—Ώ
  • Maintenance mode on / off from database 🐀

Others

  • Support Docker Installation
  • Support CI/CD with Github Action or Jenkins
  • Husky GitHook For Check Source Code, and Run Test Before Commit 🐢
  • Linter with EsLint for Typescript

Structure

Folder Structure

  1. /app The final wrapper module
  2. /common The common module
  3. /configs The configurations for this project
  4. /health health check module for every service integrated
  5. /jobs cron job or schedule task
  6. /language json languages
  7. /migration migrate all init data for test the project
  8. /modules other modules based on service/project
  9. /router endpoint router. Controller will put in this

Module structure

Full structure of module

.
└── module1
    β”œβ”€β”€ abstracts
    β”œβ”€β”€ constants // constant like enum, static value, status code, etc
    β”œβ”€β”€ controllers // business logic for rest api
    β”œβ”€β”€ decorators // warper decorator, custom decorator, etc
    β”œβ”€β”€ dtos // request validation
    β”œβ”€β”€ docs // swagger
    β”œβ”€β”€ errors // custom error
    β”œβ”€β”€ filters // custom filter 
    β”œβ”€β”€ guards // validate related with database
    β”œβ”€β”€ indicators // custom health check indicator
    β”œβ”€β”€ interceptors // custom interceptors
    β”œβ”€β”€ interfaces
    β”œβ”€β”€ middleware
    β”œβ”€β”€ pipes
    β”œβ”€β”€ repository
        β”œβ”€β”€ entities // database entities
        └── repositories // database repositories
    β”œβ”€β”€ serializations // response serialization
    β”œβ”€β”€ services
    β”œβ”€β”€ tasks // task for cron job
    └── module1.module.ts

Response Structure

This section will describe the structure of the response.

Response Metadata

This is useful when we need to give the frontend some information that is not related to the endpoint.

export interface IResponseMetadata {
    languages: ENUM_MESSAGE_LANGUAGE[];
    timestamp: number;
    timezone: string;
    requestId: string;
    path: string;
    version: string;
    repoVersion: string;
    nextPage?: string;
    previousPage?: string;
    firstPage?: string;
    lastPage?: string;
    [key: string]: any;
}

Response Default

Default response for the response

export interface IResponse {
    metadata?: IResponseMetadata;
    [key: string]: any;
}

Response Paging

Default response for pagination.

export interface IResponsePaging {
    totalData: number;
    totalPage?: number;
    currentPage?: number;
    perPage?: number;
    availableSearch?: string[];
    availableSort?: string[];
    metadata?: IResponseMetadata;
    data: Record<string, any>[];
}

Prerequisites

We assume that everyone who comes here is programmer with intermediate knowledge and we also need to understand more before we begin in order to reduce the knowledge gap.

  1. Understand NestJs Fundamental, Main Framework. NodeJs Framework with support fully TypeScript.
  2. UnderstandTypescript Fundamental, Programming Language. It will help us to write and read the code.
  3. Understand ExpressJs Fundamental, NodeJs Base Framework. It will help us in understanding how the NestJs Framework works.
  4. Understand what NoSql is and how it works as a database, especially MongoDB.
  5. Understand Repository Design Pattern or Data Access Object Design Pattern. It will help to read, and write the source code
  6. Understand The SOLID Principle and KISS Principle for better write the code.
  7. Optional. Understand Microservice Architecture, Clean Architecture, and/or Hexagonal Architecture. It can help to serve the project.
  8. Optional. Understanding The Twelve Factor Apps. It can help to serve the project.
  9. Optional. Understanding Docker. It can help to run the project.

Getting Started

Before start, we need to install some packages and tools. The recommended version is the LTS version for every tool and package.

Make sure to check that the tools have been installed successfully.

  1. NodeJs
  2. MongoDB
  3. Yarn
  4. Git
  5. Docker
  6. Docker-Compose

Clone Repo

Clone the project with git.

git clone https://github.com/andrechristikan/ack-nestjs-boilerplate.git

Install Dependencies

This project needs some dependencies. Let's go install it.

yarn install

Create environment

Make your own environment file with a copy of env.example and adjust values to suit your own environment.

cp .env.example .env

To know the details, you can read the documentation. Jump to document section

Database Migration

The migration will do data seeding to MongoDB. Make sure to check the value of the DATABASE_ prefix in your.env file.

The Database migration used NestJs-Command

For seeding

yarn seed

For remove all data do

yarn rollback

Test

The test is still not good net. I'm still lazy too do that.

The project provide 3 automation testing unit testing, integration testing, and e2e testing.

yarn test

For specific test do this

  • Unit testing

    yarn test:unit
  • Integration testing

    yarn test:integration
  • E2E testing

    yarn test:e2e

Run Project

Finally, Cheers 🍻🍻 !!! you passed all steps.

Now you can run the project.

yarn start:dev

Run Project with Docker

docker-compose up -d

API Reference

You can check The Api Spec in here

Documentation

Read documentation here.

Adjust Mongoose Setting

Optional, if your mongodb version is < 5

Go to file src/common/database/services/database.options.service.ts and add useMongoClient to mongooseOptions then set value to true.

const mongooseOptions: MongooseModuleOptions = {
    uri,
    useNewUrlParser: true,
    useUnifiedTopology: true,
    serverSelectionTimeoutMS: 5000,
    useMongoClient: true
};

License

Distributed under MIT licensed.

Contribute

How to contribute in this repo

  1. Fork the project with click Fork button of this repo.

  2. Clone the fork project

    git clone "url you just copied"
  3. Make necessary changes and commit those changes

  4. Commit the changes

    git commit -m "your message"
  5. Push changes to fork project

    git push origin -u main
  6. Back to browser, goto your fork repo github. Then, click Compare & pull request

If your code behind commit with the original, please update your code and resolve the conflict. Then, repeat from number 6.

Rule

  • Avoid Circular Dependency
  • Consume component folder structure, and repository design pattern
  • Always make service for every module is independently.
  • Do not put controller into service modules, cause this will break the dependency. Only put the controller into router and then inject the dependency.
  • Put the config in /configs folder, and for dynamic config put as environment variable
  • CommonModule only for main package, and put the module that related of service/project into /src/modules. So, if we want to clear the unnecessary module, we just need to delete the src/modules/**
  • If there a new service in CommonModule. Make sure to create the unit test in /test/unit.
  • If there a new controller, make sure to create the e2e testing in test/e2e

Contact

Andre Christi kan

Github LinkedIn

ack-nestjs-boilerplate's People

Contributors

aallithioo avatar andrechristikan avatar bipinparajuli avatar dependabot[bot] avatar psheon avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.