clean-architecture-golang

Custom Clean Architecture Implementation Guide

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "clean-architecture-golang" with this command: npx skills add gabihert/finance-tracker-e2e/gabihert-finance-tracker-e2e-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/

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

Entity (/internal/domain/entity/ )

  • Simple structs, NO logic

  • Audit fields (CreatedAt, UpdatedAt)

Errors (/internal/domain/error/ )

  • Format: PREFIX-XXYYYY

  • One error per file

Enums (/internal/domain/enums/ )

  • String types

  • SCREAMING_SNAKE_CASE values

Step 3: Application Layer

Adapter Interface (/internal/application/adapter/ )

  • Service contracts

  • Use domain entities

UseCase Interfaces (/internal/application/usecase/ )

  • Atomic operations

  • FindX, SaveX, UpdateX, DeleteX

Service Implementation (/internal/application/service/ )

  • Business logic HERE

  • Orchestrate usecases

Step 4: Integration Layer

Adapter Interfaces (/internal/integration/adapter/ )

type Repository interface { usecase.Find // MUST embed usecase.Save // MUST embed }

DTOs (/internal/integration/entrypoint/dto/ )

  • Request/Response structs

  • ToEntity() methods

  • Validation tags

Controller (/internal/integration/entrypoint/controller/ )

  • Handle HTTP

  • DTO↔Entity conversion

Model (/internal/integration/persistence/model/ )

  • GORM annotations

  • ToEntity() methods

Repository (/internal/integration/persistence/ )

  • Implements usecase interfaces

  • Entity↔Model conversion

Step 5: Infrastructure Layer

Dependency Injection (/internal/infra/dependency/injector.go )

// Type cast repository to usecase usecase.Find(i.GetRepository())

Router (/internal/infra/server/router/router.go )

  • Add routes

  • Validation middleware

Step 6: Run Tests

make test-integration

Quick Patterns

Integration Adapter Pattern (CRITICAL)

// 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 - Complete layer examples

  • Critical Patterns - Must-know patterns

  • Implementation Workflow - 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

  • Forgetting usecase interfaces on adapters - Breaks type casting

  • Business logic in wrong layer - Only in services

  • Wrong dependency direction - Check imports

  • Missing BDD test - Always start with test

  • Wrong error code format - Use PREFIX-XXYYYY

  • 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

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

bdd-feature-generator

No summary provided by upstream source.

Repository SourceNeeds Review
General

neo

Browse websites, read web pages, interact with web apps, call website APIs, and automate web tasks. Use Neo when: user asks to check a website, read a web page, post on social media (Twitter/X), interact with any web app, look up information on a specific site, scrape data from websites, automate browser tasks, or when you need to call any website's API. Keywords: website, web page, browse, URL, http, API, twitter, tweet, post, scrape, web app, open site, check site, read page, social media, online service.

Archived SourceRecently Updated
General

image-gen

Generate AI images from text prompts. Triggers on: "生成图片", "画一张", "AI图", "generate image", "配图", "create picture", "draw", "visualize", "generate an image".

Archived SourceRecently Updated
General

explainer

Create explainer videos with narration and AI-generated visuals. Triggers on: "解说视频", "explainer video", "explain this as a video", "tutorial video", "introduce X (video)", "解释一下XX(视频形式)".

Archived SourceRecently Updated