aboutsummaryrefslogtreecommitdiff
path: root/http/handler/json_response.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net> 2018-01-02 22:04:48 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net> 2018-01-02 22:04:48 -0800
commit320d1b016747ba4501da9417d9ce5f99368a5768 (patch)
tree1054d96afde6022951b76cc4a09b78e1e3f05058 /http/handler/json_response.go
parentc39f2e1a8d2de6d412bcc673d29eb0f7a2d1f5f7 (diff)
downloadv2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.gz
v2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.zst
v2-320d1b016747ba4501da9417d9ce5f99368a5768.zip
Refactor packages to have more idiomatic code base
Diffstat (limited to 'http/handler/json_response.go')
-rw-r--r--http/handler/json_response.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/http/handler/json_response.go b/http/handler/json_response.go
new file mode 100644
index 00000000..a79268c9
--- /dev/null
+++ b/http/handler/json_response.go
@@ -0,0 +1,111 @@
+// Copyright 2017 Frédéric Guillot. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+package handler
+
+import (
+ "encoding/json"
+ "errors"
+ "net/http"
+
+ "github.com/miniflux/miniflux/logger"
+)
+
+// JSONResponse handles JSON responses.
+type JSONResponse struct {
+ writer http.ResponseWriter
+ request *http.Request
+}
+
+// Standard sends a JSON response with the status code 200.
+func (j *JSONResponse) Standard(v interface{}) {
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusOK)
+ j.writer.Write(j.toJSON(v))
+}
+
+// Created sends a JSON response with the status code 201.
+func (j *JSONResponse) Created(v interface{}) {
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusCreated)
+ j.writer.Write(j.toJSON(v))
+}
+
+// NoContent sends a JSON response with the status code 204.
+func (j *JSONResponse) NoContent() {
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusNoContent)
+}
+
+// BadRequest sends a JSON response with the status code 400.
+func (j *JSONResponse) BadRequest(err error) {
+ logger.Error("[Bad Request] %v", err)
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusBadRequest)
+
+ if err != nil {
+ j.writer.Write(j.encodeError(err))
+ }
+}
+
+// NotFound sends a JSON response with the status code 404.
+func (j *JSONResponse) NotFound(err error) {
+ logger.Error("[Not Found] %v", err)
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusNotFound)
+ j.writer.Write(j.encodeError(err))
+}
+
+// ServerError sends a JSON response with the status code 500.
+func (j *JSONResponse) ServerError(err error) {
+ logger.Error("[Internal Server Error] %v", err)
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusInternalServerError)
+
+ if err != nil {
+ j.writer.Write(j.encodeError(err))
+ }
+}
+
+// Forbidden sends a JSON response with the status code 403.
+func (j *JSONResponse) Forbidden() {
+ logger.Info("[API:Forbidden]")
+ j.commonHeaders()
+ j.writer.WriteHeader(http.StatusForbidden)
+ j.writer.Write(j.encodeError(errors.New("Access Forbidden")))
+}
+
+func (j *JSONResponse) commonHeaders() {
+ j.writer.Header().Set("Accept", "application/json")
+ j.writer.Header().Set("Content-Type", "application/json; charset=utf-8")
+}
+
+func (j *JSONResponse) encodeError(err error) []byte {
+ type errorMsg struct {
+ ErrorMessage string `json:"error_message"`
+ }
+
+ tmp := errorMsg{ErrorMessage: err.Error()}
+ data, err := json.Marshal(tmp)
+ if err != nil {
+ logger.Error("encoding error: %v", err)
+ }
+
+ return data
+}
+
+func (j *JSONResponse) toJSON(v interface{}) []byte {
+ b, err := json.Marshal(v)
+ if err != nil {
+ logger.Error("encoding error: %v", err)
+ return []byte("")
+ }
+
+ return b
+}
+
+// NewJSONResponse returns a new JSONResponse.
+func NewJSONResponse(w http.ResponseWriter, r *http.Request) *JSONResponse {
+ return &JSONResponse{request: r, writer: w}
+}