diff options
author | 2023-08-10 19:46:45 -0700 | |
---|---|---|
committer | 2023-08-10 20:29:34 -0700 | |
commit | 168a870c025bfef6efdeb46e166e79a16093c157 (patch) | |
tree | 4d8ab69c7e3ef03a7ade06e7b5e5053429a64c3b /internal/http/response/json/json.go | |
parent | c2349032552891745cbbc3d2a9e772845a0239f4 (diff) | |
download | v2-168a870c025bfef6efdeb46e166e79a16093c157.tar.gz v2-168a870c025bfef6efdeb46e166e79a16093c157.tar.zst v2-168a870c025bfef6efdeb46e166e79a16093c157.zip |
Move internal packages to an internal folder
For reference: https://go.dev/doc/go1.4#internalpackages
Diffstat (limited to 'internal/http/response/json/json.go')
-rw-r--r-- | internal/http/response/json/json.go | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/internal/http/response/json/json.go b/internal/http/response/json/json.go new file mode 100644 index 00000000..5e6024ea --- /dev/null +++ b/internal/http/response/json/json.go @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package json // import "miniflux.app/v2/internal/http/response/json" + +import ( + "encoding/json" + "errors" + "net/http" + + "miniflux.app/v2/internal/http/response" + "miniflux.app/v2/internal/logger" +) + +const contentTypeHeader = `application/json` + +// OK creates a new JSON response with a 200 status code. +func OK(w http.ResponseWriter, r *http.Request, body interface{}) { + builder := response.New(w, r) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSON(body)) + builder.Write() +} + +// Created sends a created response to the client. +func Created(w http.ResponseWriter, r *http.Request, body interface{}) { + builder := response.New(w, r) + builder.WithStatus(http.StatusCreated) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSON(body)) + builder.Write() +} + +// NoContent sends a no content response to the client. +func NoContent(w http.ResponseWriter, r *http.Request) { + builder := response.New(w, r) + builder.WithStatus(http.StatusNoContent) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.Write() +} + +func Accepted(w http.ResponseWriter, r *http.Request) { + builder := response.New(w, r) + builder.WithStatus(http.StatusAccepted) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.Write() +} + +// ServerError sends an internal error to the client. +func ServerError(w http.ResponseWriter, r *http.Request, err error) { + logger.Error("[HTTP:Internal Server Error] %s => %v", r.URL, err) + + builder := response.New(w, r) + builder.WithStatus(http.StatusInternalServerError) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSONError(err)) + builder.Write() +} + +// BadRequest sends a bad request error to the client. +func BadRequest(w http.ResponseWriter, r *http.Request, err error) { + logger.Error("[HTTP:Bad Request] %s => %v", r.URL, err) + + builder := response.New(w, r) + builder.WithStatus(http.StatusBadRequest) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSONError(err)) + builder.Write() +} + +// Unauthorized sends a not authorized error to the client. +func Unauthorized(w http.ResponseWriter, r *http.Request) { + logger.Error("[HTTP:Unauthorized] %s", r.URL) + + builder := response.New(w, r) + builder.WithStatus(http.StatusUnauthorized) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSONError(errors.New("access unauthorized"))) + builder.Write() +} + +// Forbidden sends a forbidden error to the client. +func Forbidden(w http.ResponseWriter, r *http.Request) { + logger.Error("[HTTP:Forbidden] %s", r.URL) + + builder := response.New(w, r) + builder.WithStatus(http.StatusForbidden) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSONError(errors.New("access forbidden"))) + builder.Write() +} + +// NotFound sends a page not found error to the client. +func NotFound(w http.ResponseWriter, r *http.Request) { + logger.Error("[HTTP:Not Found] %s", r.URL) + + builder := response.New(w, r) + builder.WithStatus(http.StatusNotFound) + builder.WithHeader("Content-Type", contentTypeHeader) + builder.WithBody(toJSONError(errors.New("resource not found"))) + builder.Write() +} + +func toJSONError(err error) []byte { + type errorMsg struct { + ErrorMessage string `json:"error_message"` + } + + return toJSON(errorMsg{ErrorMessage: err.Error()}) +} + +func toJSON(v interface{}) []byte { + b, err := json.Marshal(v) + if err != nil { + logger.Error("[HTTP:JSON] %v", err) + return []byte("") + } + + return b +} |