Claude Skill

nestjs-patterns

NestJS best practices, module architecture, DTOs, Guards, Interceptors, and common patterns. Use when building or reviewing NestJS backend services.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download sabahattink-antigravity-fullstack-hq-skills_nestjs-patterns-1acbfa7.zip · 1 KB
Part of sabahattink/antigravity-fullstack-hq — 27 skills

Install

skills CLI npx skills add https://github.com/sabahattink/antigravity-fullstack-hq/tree/main/skills/nestjs-patterns
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install sabahattink-antigravity-fullstack-hq@llmmart
Git git clone https://github.com/sabahattink/antigravity-fullstack-hq.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole sabahattink/antigravity-fullstack-hq collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

NestJS Patterns

Module Structure

src/modules/users/
├── users.module.ts
├── users.controller.ts
├── users.service.ts
├── dto/
│   ├── create-user.dto.ts
│   └── update-user.dto.ts
├── entities/
│   └── user.entity.ts
└── guards/
    └── user-owner.guard.ts

Key Patterns

Module Definition

@Module({
  imports: [PrismaModule],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

DTOs with Validation

import { IsEmail, IsString, MinLength } from 'class-validator'

export class CreateUserDto {
  @IsEmail()
  email: string

  @IsString()
  @MinLength(8)
  password: string
}

Service Pattern

@Injectable()
export class UsersService {
  constructor(private readonly prisma: PrismaService) {}

  async create(dto: CreateUserDto) {
    return this.prisma.user.create({ data: dto })
  }

  async findOne(id: string) {
    const user = await this.prisma.user.findUnique({ where: { id } })
    if (!user) throw new NotFoundException()
    return user
  }
}

Controller Pattern

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  @HttpCode(HttpStatus.CREATED)
  create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto)
  }

  @Get(':id')
  @UseGuards(JwtAuthGuard)
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(id)
  }
}

Guards

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

@Injectable()
export class ResourceOwnerGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest()
    return request.user.id === request.params.id
  }
}

Custom Decorators

export const CurrentUser = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest()
    return data ? request.user?.[data] : request.user
  },
)

// Usage: @CurrentUser() user or @CurrentUser('id') id

Forbidden Patterns

  • Business logic in controllers
  • Returning sensitive data (passwords)
  • No validation on inputs
  • Hardcoded secrets
  • Skipping error handling
Files (antigravity-fullstack-hq)
  • SKILL.md 2.5 KB
    ---
    name: nestjs-patterns
    description: NestJS best practices, module architecture, DTOs, Guards, Interceptors, and common patterns. Use when building or reviewing NestJS backend services.
    ---
    
    # NestJS Patterns
    
    ## Module Structure
    
    ```
    src/modules/users/
    ├── users.module.ts
    ├── users.controller.ts
    ├── users.service.ts
    ├── dto/
    │   ├── create-user.dto.ts
    │   └── update-user.dto.ts
    ├── entities/
    │   └── user.entity.ts
    └── guards/
        └── user-owner.guard.ts
    ```
    
    ## Key Patterns
    
    ### Module Definition
    
    ```typescript
    @Module({
      imports: [PrismaModule],
      controllers: [UsersController],
      providers: [UsersService],
      exports: [UsersService],
    })
    export class UsersModule {}
    ```
    
    ### DTOs with Validation
    
    ```typescript
    import { IsEmail, IsString, MinLength } from 'class-validator'
    
    export class CreateUserDto {
      @IsEmail()
      email: string
    
      @IsString()
      @MinLength(8)
      password: string
    }
    ```
    
    ### Service Pattern
    
    ```typescript
    @Injectable()
    export class UsersService {
      constructor(private readonly prisma: PrismaService) {}
    
      async create(dto: CreateUserDto) {
        return this.prisma.user.create({ data: dto })
      }
    
      async findOne(id: string) {
        const user = await this.prisma.user.findUnique({ where: { id } })
        if (!user) throw new NotFoundException()
        return user
      }
    }
    ```
    
    ### Controller Pattern
    
    ```typescript
    @Controller('users')
    export class UsersController {
      constructor(private readonly usersService: UsersService) {}
    
      @Post()
      @HttpCode(HttpStatus.CREATED)
      create(@Body() dto: CreateUserDto) {
        return this.usersService.create(dto)
      }
    
      @Get(':id')
      @UseGuards(JwtAuthGuard)
      findOne(@Param('id') id: string) {
        return this.usersService.findOne(id)
      }
    }
    ```
    
    ### Guards
    
    ```typescript
    @Injectable()
    export class JwtAuthGuard extends AuthGuard('jwt') {}
    
    @Injectable()
    export class ResourceOwnerGuard implements CanActivate {
      canActivate(context: ExecutionContext): boolean {
        const request = context.switchToHttp().getRequest()
        return request.user.id === request.params.id
      }
    }
    ```
    
    ### Custom Decorators
    
    ```typescript
    export const CurrentUser = createParamDecorator(
      (data: string, ctx: ExecutionContext) => {
        const request = ctx.switchToHttp().getRequest()
        return data ? request.user?.[data] : request.user
      },
    )
    
    // Usage: @CurrentUser() user or @CurrentUser('id') id
    ```
    
    ## Forbidden Patterns
    
    - Business logic in controllers
    - Returning sensitive data (passwords)
    - No validation on inputs
    - Hardcoded secrets
    - Skipping error handling
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related