api-go
|
|-------> internal
| |------> db
| | |-----> postgres.go
| |
| |------> domain
| | |-----> website.go
| |
| |------> dto
| | |-----> websites.go
| |
| |------> handlers
| | |-----> websites.go
| |
| |------> http
| | |-----> apperror
| | | |-----------> mapper.go
| | |-----> response
| | |-----------> response.go
| |
| |
| |------> repository
| | |-----> website_repository_pg.go
| | |-----> website_repository.go
| |
| |
| |------> routes
| | |-----> websites.go
| |
| |------> service
| |-----> websites.go
|
|------> migrations
| |------> 20251226095007_create_websites_table.down.sql
| |------> 20251226095007_create_websites_table.up.sql
|
|------> .env
Without this every handler returns a different JSON
internal/http/response/response.go
package response
// All API Response will look like this
type APIResponse struct {
Success bool `json:"success"`
Data interface{} `json:"data,omitempty"` // omitempty : avoids clutter
Message string `json:"message,omitempty"`
Error string `json:"error,omitempty"`
}
Create meaningful errors in the domain layer. These errors say what went wrong, not how to respond it.
internal/domain/errors.go
package domain
import "errors"
// Plain Go Errors
var (
ErrInvalidURL = errors.New("invalid url")
ErrURLAlreadyExists = errors.New("URL already exists")
ErrNotFound = errors.New("website not found")
ErrInternal = errors.New("internal error")
)
What repository already does ?
SQLWhat we add ?
DB errors → Domain Errors cause only repository should know DB details.internal/repository/website_repository_pg.go