basic common app packages
This commit is contained in:
91
response/reply.go
Normal file
91
response/reply.go
Normal file
@@ -0,0 +1,91 @@
|
||||
// Copyright 2024 Patial Tech (Ankit Patial).
|
||||
// All rights reserved.
|
||||
|
||||
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()))
|
||||
}
|
Reference in New Issue
Block a user