AgentSkillsCN

Use Case Generator

用例生成器

SKILL.md

USE CASE GENERATOR


name: create-use-case description: Aplicar quando criar um novo use case, baseado nas regras de injeção de dependência do DDD

O QUE ESSA SKILL FAZ

  • Use Cases: Uma classe com princípio da responsabilidade única, com um método execute()

QUANDO USAR ESSA SKILL

Use quando quando você precisar:

  • Adicionar uma nova operação de negócio a um contexto existente
  • Implementar event-driven
  • Adicionar operações de CRUD em uma entidade

Exemplos:

  • "Crie o ListUser use case para retornar todos os usuários cadastrados"
  • "Crie o CriarProduto com validações de requisição"

USE CASE PATTERN

typescript
import { MyEntity } from "src/contexts/context.entity";
import { IEntityRepository } from "src/contexts/context/domain.repository";
import { Injectable } from "@nestjs/common";

@Injectable()
export default class ActionEntityUseCase {
    constructor(private readonly entityRepo: IEntityRepository) {}

    async execute(input: Input): Promise<Output> {
        const output = new MyEntity(input.field1, input.field2);

        await this.entityRepo.create(output);

        return {
            id: output.id,
        }
    }
}

type Input = {
    field1: string;
    field2: string;
}

type Output = {
    id: string;
}

Regras de Injeção de Dependência

Use Cases e Repositories: Injetado na declaração do módulo src/{domain}/{domain}.module.ts

typescript
import { Module } from '@nestjs/common';
import ActionEntityUseCase from './application/use-cases/ActionEntityUseCase.use-case';
import { IEntityRepository } from "src/contexts/context/domain.repository";
import { DomainController } from './interfaces/http/domain.controller';
import { DomainPrismaRepository } from './infra/repositories/domain-prisma.repository';
import { PrismaService } from '../prisma/prisma.service';

@Module({
  controllers: [DomainController],
  providers: [
    ActionEntityUseCase,
    PrismaService,
    {
      provide: IEntityRepository,
      useClass: DomainPrismaRepository,
    }
  ],
})

export class DomainModule {}

Regras Críticas

VOCÊ DEVE:

  • Adicionar Injectable() decorator
  • Única função execte() pública
  • Defina Input/Output interfaces
  • Retorne objetos puros, não entidades

VOCÊ NÃO DEVE:

  • Esquecer Injectable() decorator
  • Inserir regras de negócios no use case (pertence às entidades)
  • Retornar entidades do domínio diretamente

Arquivos a serem gerados

code
/src/{Domain}/application/
├── usecases/
│   ├── create-{entity}.usecase.ts
│   ├── find-{entity}.usecase.ts
│   ├── find-all-{entity}.usecase.ts
│   ├── update-{entity}.usecase.ts
│   └── delete-{entity}.usecase.ts
└── index.ts

Checklist de validação

After generation, verify:

  • Todos os use case tem @injectable()
  • Use cases injected by class
  • Único método de execute()
  • Input/output interfaces definidos
  • Returns plain objects