48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
// Package handler holds HTTP handlers. Handlers parse the request, call into
|
|
// service, and translate the result (or error) into an HTTP response.
|
|
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/dbiz/cdp/data-layer/api/internal/apperr"
|
|
)
|
|
|
|
type errorResponse struct {
|
|
Error string `json:"error"`
|
|
Field string `json:"field,omitempty"`
|
|
}
|
|
|
|
func writeJSON(w http.ResponseWriter, status int, body any) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(status)
|
|
_ = json.NewEncoder(w).Encode(body)
|
|
}
|
|
|
|
func writeError(w http.ResponseWriter, err error) {
|
|
if ae, ok := apperr.As(err); ok {
|
|
if ae.RetryAfter > 0 {
|
|
w.Header().Set("Retry-After", itoa(ae.RetryAfter))
|
|
}
|
|
writeJSON(w, ae.Code, errorResponse{Error: ae.Message, Field: ae.Field})
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusInternalServerError, errorResponse{Error: "internal server error"})
|
|
}
|
|
|
|
func itoa(i int) string {
|
|
const digits = "0123456789"
|
|
if i == 0 {
|
|
return "0"
|
|
}
|
|
var buf [20]byte
|
|
pos := len(buf)
|
|
for i > 0 {
|
|
pos--
|
|
buf[pos] = digits[i%10]
|
|
i /= 10
|
|
}
|
|
return string(buf[pos:])
|
|
}
|