Understanding Error Handling

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	

Implementation

Step 1 : Decide Response Shape

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"`
}

Step 2 : Understand domain errors

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")
)

Step 3 : Integrate domain errors into Repository

What repository already does ?

What we add ?

internal/repository/website_repository_pg.go