Loading...
Loading...
Generate Go use cases following GO modular architechture conventions (Fx DI, ports/usecase architecture). Use for any business logic operation in internal/modules/<module>/usecase/ - entity operations (create, update, list, delete), infrastructure operations (upload file, send notification), or any domain action requiring metrics, tracing, and validation.
npx skill4agent add cristiano-pacheco/ai-rules go-create-usecase// ❌ WRONG - concrete implementation
type MyUseCase struct {
repo *repository.PostgresRepository
}
// ✅ CORRECT - interface (port)
type MyUseCase struct {
repo ports.MyRepository
}package usecase
// 1. Input (skip if no params needed)
type <Name>Input struct {
Field string `validate:"required,max=255"`
}
// 2. Output
type <Name>Output struct {
Result string
}
// 3. UseCase struct
type <Name>UseCase struct {
// Dependencies (repos, ports, services)
// Always required:
logger logger.Logger
useCaseMetrics metrics.UseCaseMetrics
// Optional:
validator validator.Validator // if input validation
}
// 4. Constructor
func New<Name>UseCase(
logger logger.Logger,
useCaseMetrics metrics.UseCaseMetrics,
) *<Name>UseCase {
return &<Name>UseCase{
logger: logger,
useCaseMetrics: useCaseMetrics,
}
}
// 5. Public Execute (metrics wrapper)
func (uc *<Name>UseCase) Execute(ctx context.Context, input <Name>Input) (<Name>Output, error) {
start := time.Now()
output, err := uc.execute(ctx, input)
uc.useCaseMetrics.ObserveDuration("metric_name", time.Since(start))
if err != nil {
uc.useCaseMetrics.IncError("metric_name")
return output, err
}
uc.useCaseMetrics.IncSuccess("metric_name")
return output, nil
}
// 6. Private execute (business logic)
func (uc *<Name>UseCase) execute(ctx context.Context, input <Name>Input) (<Name>Output, error) {
ctx, span := trace.Span(ctx, "<Name>UseCase.Execute")
defer span.End()
output := <Name>Output{}
// Validate if needed
if err := uc.validator.Validate(input); err != nil {
return output, err
}
// Business logic here
return output, nil
}package usecase
type ContactCreateInput struct {
Name string `validate:"required,min=3,max=255"`
ContactType string `validate:"required,oneof=email webhook"`
ContactData string `validate:"required,max=500"`
}
type ContactCreateOutput struct {
ContactID uint64
Name string
ContactType string
}
type ContactCreateUseCase struct {
contactValidator ports.ContactValidator
contactRepository ports.ContactRepository
validator validator.Validator
logger logger.Logger
useCaseMetrics metrics.UseCaseMetrics
}contact_create_usecase.gocontact_createpackage usecase
type FileUploadInput struct {
FileName string `validate:"required,max=255"`
ContentType string `validate:"required"`
Data []byte `validate:"required"`
}
type FileUploadOutput struct {
URL string
FileSize int64
UploadedAt time.Time
}
type FileUploadUseCase struct {
s3Client ports.S3Client
logger logger.Logger
useCaseMetrics metrics.UseCaseMetrics
}file_upload_usecase.gofile_uploadpackage usecase
type ContactListOutput struct {
Contacts []ContactListItem
}
type ContactListItem struct {
ContactID uint64
Name string
}
type ContactListUseCase struct {
contactRepository ports.ContactRepository
logger logger.Logger
useCaseMetrics metrics.UseCaseMetrics
}
func (uc *ContactListUseCase) Execute(ctx context.Context) (ContactListOutput, error) {
// No input parameter
}contact_list_usecase.gocontact_listrecord, err := uc.repo.FindByX(ctx, value)
if err != nil && !errors.Is(err, shared_errs.ErrRecordNotFound) {
uc.logger.Error("error finding", logger.Error(err))
return output, err
}
if record.ID != 0 {
return output, errs.ErrAlreadyExists
}enumVal, err := enum.NewTypeEnum(input.Type)
if err != nil {
return output, err
}
model.Type = enumVal.String()items, err := uc.repo.FindAll(ctx)
if err != nil {
uc.logger.Error("error listing", logger.Error(err))
return output, err
}
output.Items = make([]Item, len(items))
for i, item := range items {
output.Items[i] = Item{ID: item.ID, Name: item.Name}
}usecase<operation>_usecase.gocontact_create_usecase.gofile_upload_usecase.go<Operation>UseCaseContactCreateUseCaseFileUploadUseCase<operation>contact_createfile_upload<StructName>.Executepackage usecase
import (
"context"
"time"
"github.com/cristiano-pacheco/bricks/pkg/logger"
"github.com/cristiano-pacheco/bricks/pkg/otel/trace"
"github.com/cristiano-pacheco/pingo/internal/shared/metrics"
// Add as needed:
"github.com/cristiano-pacheco/bricks/pkg/validator"
"github.com/cristiano-pacheco/pingo/internal/modules/<module>/ports"
"github.com/cristiano-pacheco/pingo/internal/modules/<module>/model"
"github.com/cristiano-pacheco/pingo/internal/modules/<module>/errs"
)internal/modules/<module>/usecase/fx.gomake testmake lintmake nilaway