Giter VIP home page Giter VIP logo

securo-faucet-api'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.

Http NestJs v9.x boilerplate. Best uses for backend service.

You can request feature or report bug with following this link

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
  • Export to excel and Import from excel add options to background process
  • SSO Google
  • AuthApi Controller
  • Update Documentation, include an diagram for easier comprehension
  • OAuth2 Client Credentials
  • Maybe will adopt CQRS

Build with

Describes which version.

Name Version
NestJs v9.1.x
NodeJs v18.4.x
Typescript v4.8.x
Mongoose v6.6.x
MongoDB v6.0.x
Yarn v1.22.x
NPM v8.12.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
    β”œβ”€β”€ 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

Jump to details

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

We have already provided the API reference. To visit, click here.

Environment

Detail information about the environment

APP Environment

Key Type Description
APP_NAME string Application name
APP_ENV string
  • production
  • development
APP_LANGUAGE string Enum languages, separator ,

HTTP Environment

Key Type Description
HTTP_HTTP_ENABLE boolean Application Http on/off
HTTP_HOST string Application host serve
HTTP_PORT number Application port serve
HTTP_VERSIONING_ENABLE boolean Application url versioning on/off
HTTP_VERSION number Application url version number. When HTTP_VERSIONING_ENABLE is enabled, the application version number is used.

Debugger Environment

Key Type Description
DEBUGGER_HTTP_WRITE_INTO_FILE boolean Http debugger write into file
DEBUGGER_HTTP_WRITE_INTO_CONSOL boolean Http debugger write into console
DEBUGGER_SYSTEM_WRITE_INTO_FILE boolean System debugger write into file
DEBUGGER_SYSTEM_WRITE_INTO_CONSOLE boolean System debugger write into console

Middleware Environment

Key Type Description
MIDDLEWARE_TIMESTAMP_TOLERANCE string Tolerance timestamp and used for validate the ApiKey. ms package value
MIDDLEWARE_TIMEOUT string Request timeout. ms package value

Documentation Environment

Key Type Description
DOC_NAME string Documentation tittle
DOC_VERSION number Documentation version

Job Environment

Key Type Description
JOB_ENABLE boolean Application Job or Schedule turn on/off

Database Environment

Key Type Description
DATABASE_TYPE string Enum of database Type MONGODB or POSTGRES
DATABASE_HOST string Mongodb URL. Support standard url, replication, or srv
DATABASE_NAME string Database name
DATABASE_USER string Database user
DATABASE_PASSWORD string Database user password
DATABASE_DEBUG boolean Trigger database DEBUG
DATABASE_OPTIONS string Mongodb connect options

Auth JWT Environment

Key Type Description
AUTH_JWT_PAYLOAD_ENCRYPTION boolean Jwt payload encrypt
AUTH_JWT_SUBJECT string Jwt subject
AUTH_JWT_SUBJECT string Jwt subject
AUTH_JWT_AUDIENCE string Jwt audience
AUTH_JWT_ISSUER string JWT issuer

Auth JWT Access Token Environment

Key Type Description
AUTH_JWT_ACCESS_TOKEN_SECRET_KEY string Secret access token, free text.
AUTH_JWT_ACCESS_TOKEN_EXPIRED string Expiration time for access token. ms package value
AUTH_JWT_ACCESS_TOKEN_ENCRYPT_KEY string Encrypt key for access token payload
AUTH_JWT_ACCESS_TOKEN_ENCRYPT_IV string Encrypt IV for access token payload

Auth JWT Refresh Token Environment

Key Type Description
AUTH_JWT_REFRESH_TOKEN_SECRET_KEY string Secret refresh token, free text.
AUTH_JWT_REFRESH_TOKEN_EXPIRED string Expiration time for refresh token. ms package value
AUTH_JWT_REFRESH_TOKEN_REMEMBER_ME_EXPIRED string Expiration time for refresh token when remember me is checked. ms package value
AUTH_JWT_REFRESH_TOKEN_NOT_BEFORE_EXPIRATION string Token active for refresh token before x time. ms package value
AUTH_JWT_REFRESH_TOKEN_ENCRYPT_KEY string Encrypt key for refresh token payload
AUTH_JWT_REFRESH_TOKEN_ENCRYPT_IV string Encrypt IV for refresh token payload

AWS Environment

Key Type Description
AWS_CREDENTIAL_KEY string AWS account credential key
AWS_CREDENTIAL_SECRET string AWS account credential secret
AWS_S3_REGION string AWS S3 Region
AWS_S3_BUCKET string AWS S3 Name of Bucket

Api Key Encryption

Please keep theΒ secret and passphraseΒ private.

ApiKeyHashed uses sha256 encryption, dataObject encryption is AES256.

Here ApiKey data from seeding

{
    "name": "Api Key Migration",
    "description": "From migration",
    "key": "qwertyuiop12345zxcvbnmkjh",
    "secret": "5124512412412asdasdasdasdasdASDASDASD",
    "passphrase": "cuwakimacojulawu",
    "encryptionKey": "opbUwdiS1FBsrDUoPgZdx"
}

To do the encryption.

The encryption process must be on client-side.

  1. Make sure to have value of

    • key: You can find the key for apiKey in the database.
    • secret: This value is only generated when the apiKey is created. After that, if you lose the secret, you need to recreate the apiKey.
    • encryptionKey: You can find the key for encryption in the database.
    • passphrase: This is IV for encrypt AES 256. This is need to be private too. Same with secret.
  2. Concat the key and secret.

    const concatApiKey = `${key}:${secret}`;
  3. Encryption concatApiKey with sha256

    const apiKeyHashed = this.helperHashService.sha256(concatApiKey);
  4. Then create dataObject and put the apiKeyHashed into it

    const timestamp: number = this.helperDateService.timestamp();
    const dataObject: IAuthApiRequestHashedData = {
        key, // from 1.key
        timestamp, // ms timestamp
        hash: apiKeyHashed, // from 3
    }
  5. Encryption the dataObject with AES 256

    These data encryptionKey, and passphrase can be find in database.

    const passphrase = 'cuwakimacojulawu'; // <--- IV for encrypt AES 256
    const encryptionKey = 'opbUwdiS1FBsrDUoPgZdx';
    const apiKeyEncryption = await authApiService.encryptApiKey(
        data,
        encryptionKey,
        passphrase
    );
  6. Last, combine the key and apiKeyEncryption

    const xApiKey = `${key}:${apiEncryption}`;
  7. Send into request. Put the xApiKey, timestamp, and passphrase in the request headers

    {
        "headers": {
            "x-api-key": "${xApiKey}", // from 6.xApiKey
            "x-timestamp": "${timestamp}" // from 4.timestamp
            ...
            ...
            ...
        }
    }

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 Instagram

securo-faucet-api's People

Contributors

mlyk1234 avatar

Stargazers

Bima Putra Lamanda 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.