# Custom Resource Schematic

This package provides custom schematics for generating NestJS resources with a hexagonal architecture and vertical slices, as well as setting up a shared folder structure with base configuration for Prisma and global error handlers.

## Features

- Generates a NestJS resource with a predefined hexagonal architecture.
- Creates vertical slices for each resource.
- Automatically imports the generated module into `app.module.ts`.
- Sets up a shared folder structure with predefined files for exceptions, helpers, pipes, services, and types.
- Installs necessary dependencies and initializes Prisma with a sample schema.
- Adds `PrismaService` and `GlobalErrorExceptionFilter` to the `app.module.ts` providers and exports arrays.

## Installation

First, install the package:

```bash
yarn add custom-resource@latest

## add to package.json
"scripts": {
  "generate:resources": "schematics custom-resource:custom-resource",
  "setup:shared": "schematics custom-resource:shared-setup"
}
```
## Usage 

## Setup Shared Folder 

To set up the shared folder structure, use the following command:

```bash
schematics custom-resource:shared-setup
```

If you have included the command in your package.json scripts, you can also use:

```bash
npm run setup:shared
```

## AppModule Configuration

After running yarn setup:shared, the app.module.ts file should be updated to include the following providers and exports:

```bash
import { Global, Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_FILTER, APP_GUARD } from '@nestjs/core';
import { AppController } from './app.controller';
import { PrismaService } from './shared/services/prisma.service';
import { GlobalErrorExceptionFilter } from './shared/exceptions/global-error.exception';
import { AppService } from './app.service';

@Global()
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
  controllers: [AppController],
  providers: [
    AppService,
    PrismaService,
    {
      provide: APP_FILTER,
      useClass: GlobalErrorExceptionFilter,
    },
  ],
  exports: [PrismaService],
})
export class AppModule {}
```

And the main.ts file should look like this:

```bash
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { CustomValidationPipe } from './shared/pipes/validation.pipes';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new CustomValidationPipe());
  await app.listen(3000);
}
bootstrap();
```

`CHECK THESE TWO FILES MENTIONED BEFORE CONTINUING !`


## Prisma Initialization

After running the shared-setup schematic, you can initialize Prisma with the following command and schema:

```bash
RUN: npx prisma init
```
```bash
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}
```
```bash
RUN: npx prisma generate
```

## Shared folder structure

The shared folder structure will include the following files:

```bash
src/
  └── shared/
      ├── exceptions/
      │   ├── global-error.exception.ts
      │   └── global-request.exception.ts
      ├── helpers/
      │   └── prisma-error.handler.ts
      ├── pipes/
      │   └── validation.pipes.ts
      ├── services/
      │   └── prisma.service.ts
      └── types/
          └── prisma-error-handler.type.ts
```

## Generate a Resource

You can generate a new resource using the following command:

```bash
schematics custom-resource:custom-resource --name=your-resource-name
```

If you have included the command in your package.json scripts, you can also use:

```bash
npm run generate:resources -- --name=your-resource-name
```

## Example
To generate a resource named report:
```bash
schematics custom-resource:custom-resource --name=report
or
npm run generate:resources -- --name=report

```

## Generated Resource folder structure

The generated resource will follow this hexagonal architecture and vertical slices structure:

```bash
src/
  └── your-resource-name/
      ├── application/
      │   ├── your-resource-name.module.ts
      │   ├── your-resource-name.service.spec.ts
      │   └── your-resource-name.service.ts
      ├── domain/
      │   ├── constants/
      │   │   └── your-resource-name.constants.ts
      │   ├── dto/
      │   │   ├── create-your-resource-name.dto.ts
      │   │   ├── param-findAll-your-resource-name.dto.ts
      │   │   └── update-your-resource-name.dto.ts
      │   ├── entities/
      │   │   └── your-resource-name.entity.ts
      │   └── interfaces/
      │       └── your-resource-name-repository.interface.ts
      └── infrastructure/
          ├── controller/
          │   ├── your-resource-name.controller.spec.ts
          │   └── your-resource-name.controller.ts
          └── repository/
              └── your-resource-name-prisma.repository.ts

```

## Licence
This project is licensed under the MIT License.
