Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/innovix-matrix-systems/ims-nest-api-starter

ims-nest-api-starter is a backend API starter template using NestJS and MikroORM designed for scalable applications. This starter includes authentication, authorization, user management, role management, and role/permission-based access.
https://github.com/innovix-matrix-systems/ims-nest-api-starter

api-rest mikro-orm nestjs nestjs-backend postgresql redis

Last synced: 10 days ago
JSON representation

ims-nest-api-starter is a backend API starter template using NestJS and MikroORM designed for scalable applications. This starter includes authentication, authorization, user management, role management, and role/permission-based access.

Awesome Lists containing this project

README

        



Nest Logo

## About this project

`ims-nest-api-starter` is a backend API starter template using [NestJS](https://nestjs.com/), [PostgreSQL](https://www.postgresql.org/), [Redis](https://redis.io/) and [MikroORM](https://mikro-orm.io/) designed for scalable applications.

### Key Features

- **Authentication**: JWT-based token authentication for secure access.
- **Authorization**: Role- and permission-based access control to manage user privileges.
- **Caching Support**: Integrated Redis caching for enhanced performance.
- **Database Management**: MikroORM setup with PostgreSQL for efficient data handling.
- **XSECURITY**: An added security layer that safeguards APIs against unauthorized access, ensuring data protection and integrity.

## Getting Started Guide Without Docker

1. **Choose Your Local Development Tool:**

Select your preferred local development tool, such as [Dbngin](https://dbngin.com/)(comes with postgresql and redis) or any other tool that suits your needs.

### Version Requirements

- Node.js version 18+
- PostgreSQL 16+
- Redis 7+

2. **Configure Your Environment:**

Update your `.env` file with the correct database credentials and environment variables.

_Copy `.env.example` to `.env`:_

```bash
cp .env.example .env
```

Configure the following variables:

- `APP_PORT`
- `APP_ENV`
- `JWT_SECRET`
- `JWT_EXPIRATION`

For JWT Secret generation, you can use this command:

```bash
openssl rand -base64 64
```

You also need to set up your PostgreSQL user and database:

```bash
DB_DRIVER=postgres
DB_HOST=localhost
DB_PORT=5432
DB_NAME=ims-nest
DB_USERNAME=postgres
DB_PASSWORD=
```

You can ignore this if you are using Docker (see the Docker section).

You also need to set up your Redis server:

```bash
REDIS_HOST=localhost
REDIS_PORT=6379
```

You can ignore this if you are using Docker (see the Docker section).

3. **Install Dependencies:**

To install all necessary packages, run the following commands:

```bash
npm install
```

You can use Husky to manage git hooks:

```bash
npx husky install
```

4. **Migrate and Seed the Database:**

Initialize and seed the database with default data using MikroORM's migration tool:

```bash
npm run migration:up
npm run seeder:run
```

Now, your project is ready for use. You can start exploring the API and customizing your app as needed.

5. **Run the Application:**

Start the NestJS server locally:

```bash
npm run start:dev
```

The API will run on the port specified in your `.env` file (`APP_PORT`).

## Getting Started Guide With Docker

1. **Build the Docker Image**

To build the Docker image for the application, run the following command:

```bash
docker-compose build
```

2. **Start the Application**

After building the image, start the application using:

```bash
docker-compose up
```

the Api should be running at `.env.docker` file (`APP_PORT`)(8000) by default.

You can also use `docker-compose up -d` to start the application in the background.

You can also use `docker-compose logs -f` to follow the logs of the application.

you can also use `docker-compose up --build` to build the image and start the application.

3. **Run Migrations and Seed Data**

If you need to run database migrations and seed initial data, you can enter the application container with the following command:

```bash
docker-compose exec app bash
```

Once inside the container, execute the following commands:

```bash
npm run migration:up
npm run seeder:run
```

This will apply any pending migrations and populate the database with seed data.

4. **Git hook for Check**
You can use Husky to manage git hooks:
go to root directory of your project, then run the following command:

```bash
npx husky install
```

## Health Check

To ensure the health of your application, we have integrated [Terminus](https://docs.nestjs.com/recipes/terminus) for health checks.

You can visit `http://localhost:/health` to verify the status.

If everything is set up correctly, you should see a response like this:

```json
{
"status": "ok",
"info": {
"ims-nest": {
"status": "up"
},
"database": {
"status": "up"
},
"memory_heap": {
"status": "up"
},
"memory_rss": {
"status": "up"
},
"redis": {
"status": "up"
}
},
"error": {},
"details": {
"ims-nest": {
"status": "up"
},
"database": {
"status": "up"
},
"memory_heap": {
"status": "up"
},
"memory_rss": {
"status": "up"
},
"redis": {
"status": "up"
}
}
}
```

## Testing

Run tests using Jest:

```bash
npm run test
```

## Xsecurity Setup

IMS introduces an additional layer of security, enhancing the API's reliability and resilience. With this system, only applications possessing a shared XSECURITY_TOKEN can send API requests to the server; others will be blocked. To get started, follow the guide below.

Getting Started
By default, XSecure is disabled! To enable it, set the XSECURITY_ENABLED value to true in your .env file:

```bash
XSECURITY_ENABLED=true
```

Other wise it will be disabled.

Installation
Execute the following command to set up XSECURITY:

```bash
npm run xsecurity:install
```

This command generates a secret for your application and updates your .env file with the `XSECURITY_SECRET` field.

After running the command, you will receive output similar to this:

```bash
Generated secret: N+6WQq7RjqvE+KhMRFDtk1n09M98lBAb/P/8j/I3w/7ibNzgbJeg2a+gBjNpPbMgyXSgq0sebXzYwPwnFSmleg==
XSECURITY_SECRET key has been updated in the .env file.
```

Use this secret in your frontend or mobile app to generate a short-lived XSecure token, which will be verified by the backend server.

For more information on how to use XSECURITY, refer to the [XSECURITY Guide](https://github.com/Innovix-Matrix-Systems/ims-laravel-api-starter/wiki/XSECURE-setup).

## Extra CLI Commands

### Generate MikroORM Entities:

Generate entities to help improve your development flow with:

```bash
npx mikro-orm schema:generate
```

### Run Migrations:

To manage database schema changes, use:

```bash
npm run migration:create
# or
npx mikro-orm migration:create
npm run migration:up
# or
npx mikro-orm migration:up
```

If you want to drop all migrations and run them again with seed data, use:

```bash
npm run migration:fresh
# or
npx mikro-orm migration:fresh --seed
```

### Nest Cli Commands:

You can follow the Nest CLI command to create your required module, service, controller, and others. Visit: [Nest CLI Overview](https://docs.nestjs.com/cli/overview)

You can also run this command to see all the CLI commands available in your project:

```bash
nest generate --help
```

You can create custom CLI commands tailored to your specific needs using the [nestjs-command](https://www.npmjs.com/package/nestjs-command) package.
This project already includes integration with [nestjs-command](https://www.npmjs.com/package/nestjs-command) package.
For reference, check out the `xsecurity` command implemented in [src/commands/xsecurity.command.ts](https://github.com/Innovix-Matrix-Systems/ims-nest-api-starter/blob/main/src/commands/xsecurity.command.ts).

### Custom Module Creation Command

This project includes a custom command to generate a new NestJS module with a well-organized folder structure.

### What this command does:

- Creates a new module using the NestJS CLI.
- Generates the associated controller and service.
- Adds additional folders (`dto`, `repositories`,) inside the module folder for organizing your code.
- Creates a `types.d.ts` file for type definitions.

### How to Use:

1. Open your terminal and navigate to the project root.
2. Run the following command, replacing `yourModuleName` with the name of the module you want to create:

```bash
npm run create:module
```

For example, to create a module named `product`, you would run:

```bash
npm run create:module product
```

## Authors

- [@AHS12](https://www.github.com/AHS12)

## Contributors





AHS12


Azizul Hakim




ajshovon


shovon




amanullah7649


MD: AMAN ULLAH



## License

This project is brought to you by [Innovix Matrix System](https://innovixmatrixsystem.com/) and is released as open-source software under the [MIT license](https://opensource.org/licenses/MIT).

Feel free to use, modify, and distribute this starter project under the MIT license terms. Contributions are welcome to improve this template!