Create API layer components for a new entity. Includes usecase interactors (internal/usecase/), proto definitions (schema/proto/), gRPC handlers (internal/infrastructure/grpc/), and DI registration...
Create complete API layer: usecase interactors, proto definitions, gRPC handlers, and DI registration.
make migrate.up)Detailed patterns live in .claude/rules/ (path-scoped, loaded automatically). Before writing each file, Read an existing sibling file of the same category (e.g. internal/usecase/admin_tenant_impl.go). This loads the matching rule and shows the current real-world pattern. Follow the rule, not memory.
1. Usecase Input/Output --> internal/usecase/input/, output/
2. Interactor Interface --> internal/usecase/{actor}_{entity}.go
3. Interactor Impl --> internal/usecase/{actor}_{entity}_impl.go
4. Proto Definition --> schema/proto/rapid/{actor}_api/v1/
5. Generate Proto --> make generate.buf
6. Handler Marshaller --> handler/{actor}/marshaller/{entity}.go
7. Handler Methods --> handler/{actor}/{entity}.go
8. Update Handler Struct --> handler/{actor}/handler.go
9. Register in DI --> dependency/dependency.go
10. Generate & Test --> make generate.mock && make test
Location: internal/usecase/input/{actor}_{entity}.go
Create input structs for each operation (Create, Get, List, Update, Delete).
Each struct needs a Validate() method.
Location: internal/usecase/output/{actor}_{entity}.go
Create output struct only for List operations (returns slice + count).
Rule: .claude/rules/usecase-interactor.md (Input Structs, Output Structs)
Location: internal/usecase/{actor}_{entity}.go
Define interface with //go:generate directive for mock generation.
Rule: .claude/rules/usecase-interactor.md (Interface Definition, Method Ordering)
Location: internal/usecase/{actor}_{entity}_impl.go
Implement CRUD methods following transaction patterns:
Rule: .claude/rules/usecase-interactor.md (Implementation Structure, Method Patterns, Transaction Rules). Every interactor needs a unit test โ see .claude/rules/testing.md.
Create two files:
schema/proto/rapid/{actor}_api/v1/model_{entity}.protoschema/proto/rapid/{actor}_api/v1/api_{entity}.protoThen add RPCs to: schema/proto/rapid/{actor}_api/v1/api.proto
Rule: .claude/rules/proto-definition.md
make generate.buf
Location: internal/infrastructure/grpc/internal/handler/{actor}/marshaller/{entity}.go
Convert between domain models and proto messages.
Rule: .claude/rules/grpc-handler.md (Marshaller)
Location: internal/infrastructure/grpc/internal/handler/{actor}/{entity}.go
Implement gRPC handler methods that delegate to interactors.
Rule: .claude/rules/grpc-handler.md (Handler Method Pattern, Handling Optional Proto Fields)
Location: internal/infrastructure/grpc/internal/handler/{actor}/handler.go
Add new interactor field and constructor parameter.
Rule: .claude/rules/grpc-handler.md (Handler Structure)
Location: internal/infrastructure/dependency/dependency.go
Dependency structInject() methodgrpc/run.go to pass interactor to handler constructorRule: .claude/rules/dependency-injection.md
make generate.mock
make test
Validate() method//go:generateopenapiv2_schemamake generate.buf)make generate.mock)make test)| Error | Solution |
|---|---|
undefined: pb.Example |
Run make generate.buf |
undefined: mock_usecase.MockAdminExampleInteractor |
Run make generate.mock |
| Handler method not found | Check handler struct field name and interface registration |