Files
Andrew S Erwin b9721ff13f
release gate / check (push) Failing after 8m35s
initial commit on Federted servers
2026-10-19 16:23:55 -05:00

75 lines
1.8 KiB
Go

package handlers
import (
"encoding/json"
"net/http"
)
// Common helpers shared by all handlers. Porting guide section 4.
//
// Every data endpoint follows the same pattern: resolve the effective user,
// return 401 if none, check ownership with a filtered lookup, return 404 if
// the record is not theirs, then act.
//
// All routes return JSON unless marked .md. Errors are {error: string}.
// OK is the success response shape for mutations.
type OK struct {
OK bool `json:"ok"`
}
// Error is the error response shape.
type Error struct {
Error string `json:"error"`
}
// NotFound returns a 404 {error} response.
func NotFound(message string) Error {
if message == "" {
message = "not found"
}
return Error{Error: message}
}
// Unauthorized returns a 401 {error} response.
func Unauthorized(message string) Error {
if message == "" {
message = "unauthorized"
}
return Error{Error: message}
}
// Forbidden returns a 403 {error} response.
func Forbidden(message string) Error {
if message == "" {
message = "forbidden"
}
return Error{Error: message}
}
// BadRequest returns a 400 {error} response.
func BadRequest(message string) Error {
if message == "" {
message = "bad request"
}
return Error{Error: message}
}
// Conflict returns a 409 {error} response.
func Conflict(message string) Error {
return Error{Error: message}
}
// WriteJSON writes v as JSON with the given status.
func WriteJSON(w http.ResponseWriter, status int, v interface{}) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Cache-Control", "no-store")
w.WriteHeader(status)
_ = json.NewEncoder(w).Encode(v)
}
// writeJSON is the lowercase alias used by the stub handlers.
func writeJSON(w http.ResponseWriter, status int, v interface{}) {
WriteJSON(w, status, v)
}