From d51ccd359eff73edb037ff962ad2e1879bee8192 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Tue, 9 Sep 2025 13:41:31 +0100 Subject: [PATCH] knotserver: simplify json response boilerplate Change-Id: yqnqquktxqpxsnwmznwynuvlmtoppxnz Signed-off-by: oppiliappan --- knotserver/xrpc/list_keys.go | 11 +---------- knotserver/xrpc/owner.go | 11 +---------- knotserver/xrpc/repo_blob.go | 11 +---------- knotserver/xrpc/repo_branch.go | 11 +---------- knotserver/xrpc/repo_branches.go | 12 +----------- knotserver/xrpc/repo_compare.go | 13 ++----------- knotserver/xrpc/repo_diff.go | 13 ++----------- knotserver/xrpc/repo_get_default_branch.go | 11 +---------- knotserver/xrpc/repo_languages.go | 11 +---------- knotserver/xrpc/repo_log.go | 12 +----------- knotserver/xrpc/repo_tags.go | 12 +----------- knotserver/xrpc/repo_tree.go | 11 +---------- knotserver/xrpc/version.go | 12 +----------- knotserver/xrpc/xrpc.go | 8 ++++++++ 14 files changed, 23 insertions(+), 136 deletions(-) diff --git a/knotserver/xrpc/list_keys.go b/knotserver/xrpc/list_keys.go index f4312d29..531f3cc7 100644 --- a/knotserver/xrpc/list_keys.go +++ b/knotserver/xrpc/list_keys.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -46,13 +45,5 @@ func (x *Xrpc) ListKeys(w http.ResponseWriter, r *http.Request) { response.Cursor = &nextCursor } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/owner.go b/knotserver/xrpc/owner.go index 02730e00..5d34cb85 100644 --- a/knotserver/xrpc/owner.go +++ b/knotserver/xrpc/owner.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "tangled.sh/tangled.sh/core/api/tangled" @@ -19,13 +18,5 @@ func (x *Xrpc) Owner(w http.ResponseWriter, r *http.Request) { Owner: owner, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_blob.go b/knotserver/xrpc/repo_blob.go index d4cb6e27..14aa8966 100644 --- a/knotserver/xrpc/repo_blob.go +++ b/knotserver/xrpc/repo_blob.go @@ -3,7 +3,6 @@ package xrpc import ( "crypto/sha256" "encoding/base64" - "encoding/json" "fmt" "net/http" "path/filepath" @@ -124,15 +123,7 @@ func (x *Xrpc) RepoBlob(w http.ResponseWriter, r *http.Request) { response.MimeType = &mimeType } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } // isTextualMimeType returns true if the MIME type represents textual content diff --git a/knotserver/xrpc/repo_branch.go b/knotserver/xrpc/repo_branch.go index c85b40bb..13009ac3 100644 --- a/knotserver/xrpc/repo_branch.go +++ b/knotserver/xrpc/repo_branch.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "net/url" "time" @@ -82,13 +81,5 @@ func (x *Xrpc) RepoBranch(w http.ResponseWriter, r *http.Request) { When: commit.Author.When.Format(time.RFC3339), } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_branches.go b/knotserver/xrpc/repo_branches.go index f8c82487..a845a54a 100644 --- a/knotserver/xrpc/repo_branches.go +++ b/knotserver/xrpc/repo_branches.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -53,14 +52,5 @@ func (x *Xrpc) RepoBranches(w http.ResponseWriter, r *http.Request) { Branches: paginatedBranches, } - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_compare.go b/knotserver/xrpc/repo_compare.go index 6444b5f9..129de4a9 100644 --- a/knotserver/xrpc/repo_compare.go +++ b/knotserver/xrpc/repo_compare.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "fmt" "net/http" @@ -72,20 +71,12 @@ func (x *Xrpc) RepoCompare(w http.ResponseWriter, r *http.Request) { return } - resp := types.RepoFormatPatchResponse{ + response := types.RepoFormatPatchResponse{ Rev1: commit1.Hash.String(), Rev2: commit2.Hash.String(), FormatPatch: formatPatch, Patch: rawPatch, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(resp); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_diff.go b/knotserver/xrpc/repo_diff.go index 9dc49a18..c5ed8ce1 100644 --- a/knotserver/xrpc/repo_diff.go +++ b/knotserver/xrpc/repo_diff.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "tangled.sh/tangled.sh/core/knotserver/git" @@ -33,18 +32,10 @@ func (x *Xrpc) RepoDiff(w http.ResponseWriter, r *http.Request) { return } - resp := types.RepoCommitResponse{ + response := types.RepoCommitResponse{ Ref: ref, Diff: diff, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(resp); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_get_default_branch.go b/knotserver/xrpc/repo_get_default_branch.go index 4ae67aa3..cbe5e8af 100644 --- a/knotserver/xrpc/repo_get_default_branch.go +++ b/knotserver/xrpc/repo_get_default_branch.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "time" @@ -36,13 +35,5 @@ func (x *Xrpc) RepoGetDefaultBranch(w http.ResponseWriter, r *http.Request) { When: time.UnixMicro(0).Format(time.RFC3339), } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_languages.go b/knotserver/xrpc/repo_languages.go index f6c426a5..2028d365 100644 --- a/knotserver/xrpc/repo_languages.go +++ b/knotserver/xrpc/repo_languages.go @@ -2,7 +2,6 @@ package xrpc import ( "context" - "encoding/json" "math" "net/http" "time" @@ -73,13 +72,5 @@ func (x *Xrpc) RepoLanguages(w http.ResponseWriter, r *http.Request) { response.TotalFiles = &totalFiles } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_log.go b/knotserver/xrpc/repo_log.go index e7ee7d56..9e9492be 100644 --- a/knotserver/xrpc/repo_log.go +++ b/knotserver/xrpc/repo_log.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -78,14 +77,5 @@ func (x *Xrpc) RepoLog(w http.ResponseWriter, r *http.Request) { response.Log = true - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_tags.go b/knotserver/xrpc/repo_tags.go index 3da65499..3bedb5fe 100644 --- a/knotserver/xrpc/repo_tags.go +++ b/knotserver/xrpc/repo_tags.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -83,14 +82,5 @@ func (x *Xrpc) RepoTags(w http.ResponseWriter, r *http.Request) { Tags: paginatedTags, } - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_tree.go b/knotserver/xrpc/repo_tree.go index 4e68026e..1c301711 100644 --- a/knotserver/xrpc/repo_tree.go +++ b/knotserver/xrpc/repo_tree.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "path/filepath" "time" @@ -86,13 +85,5 @@ func (x *Xrpc) RepoTree(w http.ResponseWriter, r *http.Request) { Files: treeEntries, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/version.go b/knotserver/xrpc/version.go index 5c91105d..f9b3fd7c 100644 --- a/knotserver/xrpc/version.go +++ b/knotserver/xrpc/version.go @@ -1,13 +1,11 @@ package xrpc import ( - "encoding/json" "fmt" "net/http" "runtime/debug" "tangled.sh/tangled.sh/core/api/tangled" - xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors" ) // version is set during build time. @@ -58,13 +56,5 @@ func (x *Xrpc) Version(w http.ResponseWriter, r *http.Request) { Version: version, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/xrpc.go b/knotserver/xrpc/xrpc.go index a6e4192a..78bb9a9d 100644 --- a/knotserver/xrpc/xrpc.go +++ b/knotserver/xrpc/xrpc.go @@ -117,3 +117,11 @@ func writeError(w http.ResponseWriter, e xrpcerr.XrpcError, status int) { w.WriteHeader(status) json.NewEncoder(w).Encode(e) } + +func writeJson(w http.ResponseWriter, response any) { + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(response); err != nil { + writeError(w, xrpcerr.GenericError(err), http.StatusInternalServerError) + return + } +} -- 2.43.0