// Copyright 2024 Patial Tech (Ankit Patial). // // This file is part of code.patial.tech/go/appcore, which is MIT licensed. // See http://opensource.org/licenses/MIT package response import ( "encoding/json" "fmt" "net/http" "code.patial.tech/go/appcore/request" ) // Detail of api response type Detail struct { // Data of api response // // it will nil in case of error Data any `json:"data"` // Error if any occurred during api call Error *string `json:"error,omitempty"` // Pager is used for paged data response Pager *request.Pager `json:"pager,omitempty"` } // Done data response func Ok(w http.ResponseWriter, data any) { reply(w, data, nil) } // Paged data response func Paged(w http.ResponseWriter, data any, p request.Pager) { reply(w, data, &p) } func reply(w http.ResponseWriter, data any, p *request.Pager) { w.Header().Set("Content-Type", "application/json") // Requires the client to validate the response with the server before using the cached version, // ensuring data freshness. w.Header().Set("Cache-Control", "no-cache") // older HTTP header used for controlling caching behavior in HTTP/1.0, // primarily for backwards compatibility with older browsers and caches w.Header().Set("Pragma", "no-cache") // if data is nil, let's pass it on as null if data == nil { w.WriteHeader(http.StatusOK) w.Write([]byte("{\"data\":null}")) return } // json data... w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(Detail{ Data: data, Pager: p, }) } func BadRequest(w http.ResponseWriter, err error) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) w.Write(fmt.Appendf(nil, "{\"error\": %q}", err.Error())) } func InternalServerError(w http.ResponseWriter, err error) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError) w.Write(fmt.Appendf(nil, "{\"error\": %q}", err.Error())) } func SessionExpired(w http.ResponseWriter) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("{\"error\": \"Session is expired, please login again\"}")) } func NotAutorized(w http.ResponseWriter) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) w.Write([]byte("{\"error\": \"You are not authorized to perform this action\"}")) } // Forbidden response error func Forbidden(w http.ResponseWriter, err error) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusForbidden) w.Write(fmt.Appendf(nil, "{\"error\": %q}", err.Error())) }