diff options
author | 2018-01-02 22:04:48 -0800 | |
---|---|---|
committer | 2018-01-02 22:04:48 -0800 | |
commit | 320d1b016747ba4501da9417d9ce5f99368a5768 (patch) | |
tree | 1054d96afde6022951b76cc4a09b78e1e3f05058 /http/handler/json_response.go | |
parent | c39f2e1a8d2de6d412bcc673d29eb0f7a2d1f5f7 (diff) | |
download | v2-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.go | 111 |
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} +} |