errors.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package handlers
  2. import (
  3. "encoding/json"
  4. "log/slog"
  5. "net/http"
  6. "sync/atomic"
  7. )
  8. const maxRequestBodySize = 1 << 20 // 1 MB
  9. var isProd atomic.Bool
  10. func InitAppEnv(env string) {
  11. isProd.Store(env == "production")
  12. }
  13. func ResetAppEnv() {
  14. isProd.Store(false)
  15. }
  16. func writeJSON(w http.ResponseWriter, status int, v interface{}) {
  17. w.Header().Set("Content-Type", "application/json")
  18. w.WriteHeader(status)
  19. json.NewEncoder(w).Encode(v)
  20. }
  21. func writeError(w http.ResponseWriter, status int, msg string, err error) {
  22. if err != nil {
  23. slog.Error("handler error", "status", status, "error", err)
  24. }
  25. if status == http.StatusInternalServerError && isProd.Load() {
  26. msg = "internal server error"
  27. }
  28. writeJSON(w, status, map[string]string{"error": msg})
  29. }
  30. func writeValidationError(w http.ResponseWriter, err error) {
  31. details := err.Error()
  32. if isProd.Load() {
  33. slog.Error("validation error", "error", details)
  34. details = "validation failed"
  35. }
  36. writeJSON(w, http.StatusUnprocessableEntity, map[string]interface{}{
  37. "error": "validation failed",
  38. "details": details,
  39. })
  40. }