API Endpoint Pattern Skill
Use this skill when adding or modifying HTTP endpoints in the API.
Scope
- •Creating new API endpoints
- •Adding new domain routers
- •Modifying handler logic
Router Structure
Main Router (internal/router/router.go)
Initializes Echo, sets up middleware, and groups routes by domain.
Sub-Routers (internal/router/[domain]/router.go)
Each domain has its own sub-router with a Bind function that receives an *echo.Group and dependencies.
go
func Bind(e *echo.Group, db *sql.DB) *echo.Group {
e.GET("/list", func(c echo.Context) error {
// handler logic
})
return e
}
Adding a New Endpoint
- •If introducing a new domain, create
internal/router/[domain]/router.go. - •Implement a
Bind(e *echo.Group, db *sql.DB) *echo.Groupfunction. - •Register the sub-router in
internal/router/router.go:godomainrouter.Bind(api.Group("/domain"), config.DB.Conn) - •Implement data access logic in
internal/models/if needed.
Handler Guidelines
- •Parameter Parsing: Use helper functions for complex query params (e.g., trader levels).
- •Dependency Injection: Pass
*sql.DBintoBind, then into handlers. Avoid globals. - •Response Handling:
- •Success:
c.JSON(200, data)orc.String(200, "OK") - •Error:
c.String(code, err.Error())— log significant errors with zerolog.
- •Success:
- •Business Logic: Keep handlers thin. Move complex logic to
internal/models/or other internal packages.
Conventions
- •Use
e.Group()for logical route separation. - •Use plural names for collections (
/items,/weapons). - •Use query parameters for filtering and optional configuration.
- •Prefer HTTP status constants for consistency, but be consistent either way.