From 168a870c025bfef6efdeb46e166e79a16093c157 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Thu, 10 Aug 2023 19:46:45 -0700 Subject: Move internal packages to an internal folder For reference: https://go.dev/doc/go1.4#internalpackages --- internal/http/response/json/json.go | 120 ++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 internal/http/response/json/json.go (limited to 'internal/http/response/json/json.go') 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 +} -- cgit v1.2.3