package
0.0.10
Repository: https://github.com/kingstonduy/go-core.git
Documentation: pkg.go.dev

# README

Usage


// USECASE
type CheckBalanceRequest struct {
	Account string `json:"account"`
}

type CheckBalanceResponse struct {
	Balance  int64  `json:"balance"`
	Currency string `json:"currency"`
}

type CheckBalanceHandler interface {
	Handle(ctx context.Context, request *CheckBalanceRequest) (*CheckBalanceResponse, error)
}

// Register handlers
func RegisterPipelineHandlers(
	checkBalanceHandler account.CheckBalanceHandler,
	// other handers
) {
	pipeline.RegisterRequestHandler(checkBalanceHandler)
	// register other handlers
}

// Register behaviours
func RegisterPipelineBehaviors(
	requestLoggingBehavior *RequestLoggingBehavior,
	requestTracingBehavior *RequestTracingBehavior,
	requestMetricBehavior *RequestMetricBehavior,
	errorHandlingBehavior *ErrorHandlingBehavior,
) {
	pipeline.RegisterRequestPipelineBehaviors(
		requestTracingBehavior,
		requestLoggingBehavior,
		requestMetricBehavior,
		errorHandlingBehavior,
	)
}

// ERROR HANDLING FOR RECOVERING FROM PANIC
type ErrorHandlingBehavior struct {
	logger logger.Logger
}

func NewErrorHandlingBehavior(logger logger.Logger) *ErrorHandlingBehavior {
	return &ErrorHandlingBehavior{
		logger: logger,
	}
}

func (b *ErrorHandlingBehavior) Handle(ctx context.Context, request interface{}, next pipeline.RequestHandlerFunc) (res interface{}, err error) {
	response, err := next(ctx)
	return response, err
}

// TRACING
type RequestTracingBehavior struct {
	logger logger.Logger
	tracer trace.Tracer
}

func NewTracingBehavior(logger logger.Logger, tracer trace.Tracer) *RequestTracingBehavior {
	return &RequestTracingBehavior{
		logger: logger,
		tracer: tracer,
	}
}

func (b *RequestTracingBehavior) Handle(ctx context.Context, request interface{}, next pipeline.RequestHandlerFunc) (interface{}, error) {
	res, err := next(ctx)
	return res, err
}

// METRICS
type RequestMetricBehavior struct {
	logger   logger.Logger
	metricer *prome.PrometheusMetricer
	cfg      *ServerConfig
}

func NewMetricBehavior(logger logger.Logger, metricer *prome.PrometheusMetricer, cfg *ServerConfig) *RequestMetricBehavior {
	return &RequestMetricBehavior{
		logger:   logger,
		metricer: metricer,
		cfg:      cfg,
	}
}

func (b *RequestMetricBehavior) Handle(ctx context.Context, request interface{}, next pipeline.RequestHandlerFunc) (response interface{}, err error) {
	response, err = next(ctx)
	return response, err
}

// LOGGING
type RequestLoggingBehavior struct {
	logger logger.Logger
}

func NewRequestLoggingBehavior(logger logger.Logger) *RequestLoggingBehavior {
	return &RequestLoggingBehavior{
		logger: logger,
	}
}

func (b *RequestLoggingBehavior) Handle(ctx context.Context, request interface{}, next pipeline.RequestHandlerFunc) (response interface{}, err error) {
	response, err = next(ctx)
	return response, err
}