This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
make generateRegenerate type-safe Go code from SQL queries and add required DB() method. Use this instead of sqlc generate directly.
Alternative manual approach:
sqlc generate
./scripts/post-sqlc-generate.shmake test # Run all tests
go test ./internal/repository/ # Run specific package tests
go test -v ./... # Verbose test output with detailsmake build # Build all packages
make clean # Clean and tidy dependencies
go mod download # Download dependencies
go vet ./... # Static analysis
go fmt ./... # Format codeThis project follows hexagonal architecture with clear separation of concerns:
internal/domain/- Business entities and logic (Order, Money, OrderStatus, OrderFilter)internal/port/- Interface definitions (repository contracts)internal/repository/- Data persistence implementations using SQLCinternal/db/- SQLC-generated code and query definitionsinternal/migrations/- Database schema evolution
- Domain-Driven Design: Rich domain models with value objects (
Money) and type-safe enums (OrderStatus) - Repository Pattern: Interface segregation with dependency injection supporting both connection pools and transactions
- SQLC Integration: Type-safe SQL queries generated from
.sqlfiles ininternal/db/queries/ - Transaction Support: Repository constructors accept both
*pgxpool.Poolandpgx.Txfor flexible transaction handling
- Uses PostgreSQL with pgx/v5 driver
- SQLC configuration in
sqlc.yamlwith custom type mappings:- UUID fields use
github.com/google/uuid - Decimal fields use
github.com/shopspring/decimal - Timestamps use
time.Time
- UUID fields use
- Testcontainers for integration testing with real PostgreSQL instances
- Modify domain models in
internal/domain/ - Update SQL schema in
internal/migrations/ - Add/modify queries in
internal/db/queries/ - Run
make generateto update generated code - Implement repository methods in
internal/repository/ - Write integration tests using Testcontainers
- Run
go test ./...to validate changes
- Integration tests use real PostgreSQL via Testcontainers
- Test setup automatically applies migrations
- Repository tests cover CRUD operations, filtering, and transaction handling
- Use
setupTestDB(t, ctx)helper for test database initialization