Files
cdp/data-layer/api/internal/handler/render.go
2026-05-25 08:38:26 +07:00

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:])
}