--- name: kratos-biz-layer description: Generates business logic layer components (use cases, repository interfaces, business models, validators) for go-kratos microservices following Clean Architecture. Use when implementing domain logic, creating entity CRUD operations, adding validation rules, or orchestrating data access in kratos services. --- ## How Kratos Business Layer Works ### Clean Architecture Dependency Rule The business layer (biz) is the core of Clean Architecture in Kratos microservices: **Dependency Flow**: Service → Biz → Data - **Biz defines interfaces** that data layer implements - **Biz contains business logic** independent of frameworks - **Biz uses domain models** not ORM entities ### Domain-Driven Structure (Current Pattern) The biz layer follows domain-driven design with these subdirectories: **1. Domain Layer** (`internal/biz/domain/`) - `models.go` - Domain entities with validation tags - `interfaces.go` - Repository, use case, and event publisher interfaces - `errors.go` - Domain errors (ErrSymbolNotFound) and data layer errors (ErrDataNotFound) **2. Use Case Layer** (`internal/biz/{entity}/`) - `usecase.go` - Use case implementation - `usecase_test.go` - Use case tests with event assertions - `validator.go` - Validation logic factory **3. Event Layer** (`internal/biz/event/`) - Optional - `mapper.go` - Event payload transformations - `topics.go` - Event topic constants **4. Provider** (`internal/biz/provider.go`) - Wire ProviderSet for dependency injection ### Error Separation Pattern **Data Layer Errors** (returned by repositories): - `domain.ErrDataNotFound` - Record not found - `domain.ErrDataDuplicateEntry` - Unique constraint violation - `domain.ErrDataDatabase` - Generic database error **Domain Errors** (returned by use cases): - `domain.ErrSymbolNotFound` - Symbol not found (business error) - `domain.ErrDuplicateSymbol` - Duplicate symbol (business error) - `domain.ErrDatabaseOperation` - Database operation failed **Pattern**: Repositories return data errors, use cases map to domain errors via `toDomainError()` helper. ### Event Publishing Pattern Use cases integrate event publishing for domain events: - Accept `domain.{Entity}EventPublisher` interface - Publish events within transactions - Transaction rolls back if publishing fails **Example**: ```go err := uc.tm.InTx(ctx, func(ctx context.Context) error { symbol, err = uc.repo.Create(ctx, s) if err != nil { return err } return uc.pub.PublishSymbolCreated(ctx, symbol) }) ``` ### Wire Dependency Injection All constructors must be added to `ProviderSet` in `internal/biz/provider.go`: ```go var ProviderSet = wire.NewSet(symbol.NewValidator, symbol.NewUseCase) ``` After changes, run `make generate` to regenerate Wire code. What would you like to do? 1. Create a new entity (use case + interface + model + validator) 2. Add methods to existing use case 3. Create standalone validator 4. View examples and patterns **Wait for response before proceeding.** | Response | Workflow | |----------|----------| | 1, "create", "new entity", "new" | `workflows/create-entity.md` | | 2, "add method", "add", "extend" | `workflows/add-methods.md` | | 3, "validator", "validation" | `workflows/create-validator.md` | | 4, "examples", "patterns", "help" | `workflows/view-examples.md` | **After reading the workflow, follow it exactly.** All domain knowledge in `references/`: **Core Patterns**: use-case-pattern.md, interface-pattern.md, model-pattern.md **Code Style**: naming-conventions.md Additional patterns (error handling, logging, transactions, testing) are covered within use-case-pattern.md. | Workflow | Purpose | |----------|---------| | create-entity.md | Generate complete biz layer for new entity | | add-methods.md | Add CRUD methods to existing use case | | create-validator.md | Create standalone validator | | view-examples.md | Show patterns and examples | Business layer code is correct when: **Structure**: - Domain models in `internal/biz/domain/models.go` - Interfaces in `internal/biz/domain/interfaces.go` - Errors in `internal/biz/domain/errors.go` - Use case in `internal/biz/{entity}/usecase.go` - Validator in `internal/biz/{entity}/validator.go` - Tests in `internal/biz/{entity}/usecase_test.go` **Use Case Implementation**: - Struct has repo, pub, log, validator, tm fields - Constructor returns interface type (domain.{Entity}UseCase) - Methods accept context.Context as first parameter - Validation happens before repository calls - Data errors mapped to domain errors via `toDomainError()` - Events published within transactions - All errors logged with context **Domain Layer**: - Repository interface in `domain/interfaces.go` - Event publisher interface in `domain/interfaces.go` (if events) - Business model in `domain/models.go` with validation tags - Domain errors (ErrSymbolNotFound) separated from data errors (ErrDataNotFound) **Wire Integration**: - Constructor added to ProviderSet in `internal/biz/provider.go` - User reminded to run `make generate`