aboutsummaryrefslogtreecommitdiff
path: root/internal/http/response/json/json.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 19:46:45 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 20:29:34 -0700
commit168a870c025bfef6efdeb46e166e79a16093c157 (patch)
tree4d8ab69c7e3ef03a7ade06e7b5e5053429a64c3b /internal/http/response/json/json.go
parentc2349032552891745cbbc3d2a9e772845a0239f4 (diff)
downloadv2-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.go120
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
+}