# Clean Architecture Golang

> Expert implementation guide for custom Clean Architecture pattern in Golang projects. Use when implementing features with domain-driven design, creating API endpoints, or working with this specific 4-layer architecture (Domain, Application, Integration, Infrastructure). NOT Uncle Bob's standard Clean Architecture - this is a specialized adaptation with strict dependency rules and specific conventions.

- Skill: `majiayu000/clean-architecture-golang` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/clean-architecture-golang`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/clean-architecture-golang/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/clean-architecture-golang

---


# Custom Clean Architecture Implementation Guide

Expert guidance for implementing features using this project's custom Clean Architecture pattern with Golang. This is NOT Uncle Bob's standard Clean Architecture - it's a specialized adaptation.

## Architecture Overview

Four layers with strict dependency rules:

```
Integration → Application → Domain ← Infrastructure
```

**Dependency Rule**: Inner layers NEVER depend on outer layers.

## 🚨 Critical Rules

### MUST DO
- **START with BDD feature file** - Never skip test-first development
- **Integration adapters MUST implement usecase interfaces** - Enable type casting
- **Use context.Context as first parameter** - Always
- **Convert at boundaries** - DTO↔Entity↔Model
- **Follow error code format** - PREFIX-XXYYYY
- **Type cast repositories to usecases** - In dependency injection

### NEVER DO
- **Skip BDD test creation** - Tests come first
- **Create adapters without usecase interfaces** - Will break dependency injection
- **Put business logic in controllers/repositories** - Only in services
- **Use DTOs in domain/application** - Only in integration layer
- **Access database from services** - Only through usecases
- **Create circular dependencies** - Dependencies flow inward only

## Implementation Workflow

### Step 1: Create BDD Test (MANDATORY)

Start here ALWAYS. Location: `/test/integration/features/`

```gherkin
Feature: Create entity functionality
  Scenario: Create entity success
    When I call "POST" "/v1/entities" with payload
    Then status should be 201
    And db should contain entity
```

### Step 2: Domain Layer

1. **Entity** (`/internal/domain/entity/`)
   - Simple structs, NO logic
   - Audit fields (CreatedAt, UpdatedAt)

2. **Errors** (`/internal/domain/error/`)
   - Format: `PREFIX-XXYYYY`
   - One error per file

3. **Enums** (`/internal/domain/enums/`)
   - String types
   - SCREAMING_SNAKE_CASE values

### Step 3: Application Layer

1. **Adapter Interface** (`/internal/application/adapter/`)
   - Service contracts
   - Use domain entities

2. **UseCase Interfaces** (`/internal/application/usecase/`)
   - Atomic operations
   - FindX, SaveX, UpdateX, DeleteX

3. **Service Implementation** (`/internal/application/service/`)
   - Business logic HERE
   - Orchestrate usecases

### Step 4: Integration Layer

1. **Adapter Interfaces** (`/internal/integration/adapter/`)
   ```go
   type Repository interface {
       usecase.Find    // MUST embed
       usecase.Save    // MUST embed
   }
   ```

2. **DTOs** (`/internal/integration/entrypoint/dto/`)
   - Request/Response structs
   - ToEntity() methods
   - Validation tags

3. **Controller** (`/internal/integration/entrypoint/controller/`)
   - Handle HTTP
   - DTO↔Entity conversion

4. **Model** (`/internal/integration/persistence/model/`)
   - GORM annotations
   - ToEntity() methods

5. **Repository** (`/internal/integration/persistence/`)
   - Implements usecase interfaces
   - Entity↔Model conversion

### Step 5: Infrastructure Layer

1. **Dependency Injection** (`/internal/infra/dependency/injector.go`)
   ```go
   // Type cast repository to usecase
   usecase.Find(i.GetRepository())
   ```

2. **Router** (`/internal/infra/server/router/router.go`)
   - Add routes
   - Validation middleware

### Step 6: Run Tests

```bash
make test-integration
```

## Quick Patterns

### Integration Adapter Pattern (CRITICAL)

```go
// Application defines need
type FindProduct interface {
    FindById(ctx, id) (*entity, error)
}

// Integration MUST implement
type ProductRepository interface {
    usecase.FindProduct  // EMBED!
}

// Type cast in DI
usecase.FindProduct(repository)
```

### Error Codes

- `CLI-01409` = Client conflict (409)
- `USR-01404` = User not found (404)
- `PRD-02500` = Product server error (500)

### Conversion Flow

```
Request → DTO → Entity → Model → DB
Response ← DTO ← Entity ← Model ← DB
```

## Reference Documentation

Detailed guides in references/:
- [Layer Implementation](references/layer-implementation.md) - Complete layer examples
- [Critical Patterns](references/critical-patterns.md) - Must-know patterns
- [Implementation Workflow](references/implementation-workflow.md) - Step-by-step guide

## Templates

Ready-to-use templates in assets/:
- `entity-template.go` - Domain entity template
- `service-template.go` - Application service template
- `repository-template.go` - Repository template

## Implementation Checklist

Before starting any feature:

- [ ] BDD feature file exists
- [ ] Domain entity defined
- [ ] Domain errors created
- [ ] Application adapter interface defined
- [ ] Application usecases created
- [ ] Application service implemented
- [ ] Integration adapters created WITH usecase interfaces
- [ ] DTOs with ToEntity() methods
- [ ] Controller handling HTTP
- [ ] Model with ToEntity() method
- [ ] Repository implementing usecases
- [ ] Dependencies wired in injector
- [ ] Routes added to router
- [ ] Tests passing

## Common Mistakes to Avoid

1. **Forgetting usecase interfaces on adapters** - Breaks type casting
2. **Business logic in wrong layer** - Only in services
3. **Wrong dependency direction** - Check imports
4. **Missing BDD test** - Always start with test
5. **Wrong error code format** - Use PREFIX-XXYYYY
6. **Not converting at boundaries** - DTO↔Entity↔Model

## Example Implementations

Study these existing implementations:
- Client: `/internal/{domain,application,integration}/*/client*.go`
- User: `/internal/{domain,application,integration}/*/user*.go`
- Forest: `/internal/{domain,application,integration}/*/forest*.go`

