From 65326b0ff5aacc90210db28e295626aa1d0c98dd Mon Sep 17 00:00:00 2001 From: Vicente Ferrari Smith Date: Wed, 20 May 2026 07:22:08 +0200 Subject: [PATCH] better logging --- .DS_Store | Bin 14340 -> 0 bytes cmd/party/api/api.go | 4 ++-- cmd/party/api/device_tokens.go | 6 +++--- cmd/party/api/errors.go | 25 ++++++++++--------------- cmd/party/api/healthcheck.go | 2 +- cmd/party/api/issues.go | 22 +++++++++++----------- cmd/party/api/middleware.go | 6 +++--- cmd/party/api/mps.go | 4 ++-- cmd/party/api/parlvotedetail.go | 4 ++-- cmd/party/api/parlvotes.go | 4 ++-- cmd/party/api/tokens.go | 8 ++++---- cmd/party/api/users.go | 18 +++++++++--------- cmd/party/api/votes.go | 4 ++-- 13 files changed, 51 insertions(+), 56 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e52579c3183a1d61241a37f16aa6c9102e4cc41a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14340 zcmeHNeQX@X6@PD?IJ>d0S;uxrNON3$Z3*Cnvm=u?1;+`Fa_8jie7JkJV`rPa zU3YiyE^dfwRFzhxAVfd@sOTpG@kd2lP^BUSrBbO7&{jfG#g_oJe^eE!1XY1n{iA)e zv+LY#l8QbK zL5kfJDXjyP$85J!w%zgtvKM10#N_(RD7HZZSc^VY2M<&H?!Ur7sR~rV{I6OdB^e|F z5&?;TL_i`S5okex&%G4X4ngHpA|Mfv2rMDM$A=6>PV*666f_(<=)r&Cc{%@u4+Ew7 zk2~jOBASorqM%el0fj12p^DKG1BE*AGm%_AqKkqGb-=J?swZk0qZJBu=w8T(p2a4 z(bVw-(5+A$sknBn>i9EySH-X^HQNZ-9^2;MoOtgA_o*f$Nq&-P-}M4A1!`eN*K0mI z#HazQ&PJ&jf62_U`D;ZNwTD)%&3xjT&0DtZ+Vkmsw;VdhO*Yk=y5dOP@~yJXCL5L+ zoSZWJ3Uf^Qdeh`rPGHSi%+tECUn@FBm7VJ*+y3Z=bUG;=*HWsLt0Nzpr-p;@f10~ zP#sEbRdrLF49!unwx@Qg`nYzaF05EEdsBH;D^=WTl{(`K-bi|{sz0rs;0^CL{9t09 zIq@rvq{mcs+COP{Y@$I!Ppol3RYPMZK3CamT7m0@XiW5_(^I^vJ*LS_>h$_`S9Yh1 z>BFl2Jn86`Q@3caBfk=3-bL&^GD2uFe8QUSJ{Og!a1~q&J7E+`w0Zdj_zHX*?uVbl zFX0(@7G8os!W-}w{1e-81+K&n)NvhNh1cK!ZpWRt3va}m@MiLfaV(*MWvrl!r*Q$# z;H`KYeiiS)JMk|3I^K)l!SCVs@d5lX{sbS!NANNH6+VT(#^2!!_#(cHuizW_H+&o4 zQBYZ_bSRxlTDe*oPzIGP%1&jMvRlb31*NDk#Zel{t;$)^gC)N^5%)FX(?)TV-$f&> z^7tkEE_3r(=f3gOfe(`3y(lJ!UYZv^_Q~sVL!Y{Fc*!1x`NkI8>nx-Xl`=*!7}ME2^9lx-*95!wDtnT)QG%Zlv4U?!!v zkwa>s?hTtLi&19#j#NrtMy@H!cBd%|QD$V6s^N~N{_joxRT}XB0&gRd$#>&g+<^T! zgga>9AIAa>{3V>iX)<$06TnHd(8GXF0%Y{J;TQ2scsqU>@5X!Z8~9E97Mc7H@P~LG z{s{$uz!K7qf$r|}tl4u6BcB?ovN|BQddck%BDlfETk(tL`ErjmNWb8Od{ zBThW=v13U6q775ryma=?rIP3GT#BF2UqtG| zvzHKdTCObR%2KW@-`AC8?00fy8Sk;kmF0ijOu775mZ3=}R+jBx(!IBNu)&3e))^T4 zXl^}!`wgHS=16KYZ6vuZ_uyzA4rQC?;aJv(8dMYY-jkTKRX+PeK=0uZHNb9_SNKs| zbKNQ&AgNO%KTDc6u!OvqkY7n}Y|*=Wq!m!grB?ie&L0vw?NF!s9YV(iuT?huGg-n# zuKx)+86*M{0f~S_KqBzo5#VS46mtCj-`-2#{||-aLn0s%_;4bC%SH>Me7o;bM_qgY zkfHb)id^PNiaby{RG|kK;hFF{9%cA-yltEp2P(_+G|@#tDMjIZzX*64+~|-e%m0@r J%a_&q|KIm{x}5+3 diff --git a/cmd/party/api/api.go b/cmd/party/api/api.go index 2b66e67..abe3b6f 100644 --- a/cmd/party/api/api.go +++ b/cmd/party/api/api.go @@ -44,7 +44,7 @@ func (api *Api) Authenticate(next http.Handler) http.Handler { case errors.Is(err, data.ErrRecordNotFound): api.errorResponse(w, r, data.ErrInvalidAuthToken) default: - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } @@ -55,7 +55,7 @@ func (api *Api) Authenticate(next http.Handler) http.Handler { case errors.Is(err, data.ErrRecordNotFound): api.errorResponse(w, r, data.ErrInvalidCredentials) default: - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } diff --git a/cmd/party/api/device_tokens.go b/cmd/party/api/device_tokens.go index b553f94..d22d7e7 100644 --- a/cmd/party/api/device_tokens.go +++ b/cmd/party/api/device_tokens.go @@ -38,7 +38,7 @@ func (api *Api) RegisterDeviceToken(w http.ResponseWriter, r *http.Request) { api.App.Logger.PrintError(err, map[string]string{ "user_id": fmt.Sprint(user.ID), }) - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } @@ -65,7 +65,7 @@ func (api *Api) DeleteDeviceToken(w http.ResponseWriter, r *http.Request) { tokens, err := api.App.Models.DeviceTokens.GetForUser(user.ID) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } owns := false @@ -81,7 +81,7 @@ func (api *Api) DeleteDeviceToken(w http.ResponseWriter, r *http.Request) { } if err := api.App.Models.DeviceTokens.Delete(input.Token); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } diff --git a/cmd/party/api/errors.go b/cmd/party/api/errors.go index adbac8f..be3733f 100644 --- a/cmd/party/api/errors.go +++ b/cmd/party/api/errors.go @@ -16,25 +16,20 @@ func (api *Api) LogError(r *http.Request, err error) { } func (api *Api) errorResponse(w http.ResponseWriter, r *http.Request, err error) { - apiErr := &data.Error{ - HttpCode: http.StatusInternalServerError, - Message: "the server encountered a problem", - } + api.App.LogError(r, err) - // Try to "unbox" the error to see if it's our rich *Error type - var customErr *data.Error - if errors.As(err, &customErr) { - apiErr = customErr - } + apiErr := &data.Error{ + HttpCode: http.StatusInternalServerError, + Message: "the server encountered a problem", + } + + var customErr *data.Error + if errors.As(err, &customErr) { + apiErr = customErr + } if err := common.WriteJSON(w, apiErr.HttpCode, common.Envelope{"error": apiErr}, nil); err != nil { api.App.LogError(r, err) w.WriteHeader(500) } } - -func (api *Api) ServerErrorResponse(w http.ResponseWriter, r *http.Request, err error) { - api.App.LogError(r, err) - - api.errorResponse(w, r, err) -} diff --git a/cmd/party/api/healthcheck.go b/cmd/party/api/healthcheck.go index 1b92614..3652ff1 100644 --- a/cmd/party/api/healthcheck.go +++ b/cmd/party/api/healthcheck.go @@ -15,6 +15,6 @@ func (api *Api) Healthcheck(w http.ResponseWriter, r *http.Request) { } if err := common.WriteJSON(w, http.StatusOK, common.Envelope{"health_check": env}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/issues.go b/cmd/party/api/issues.go index c6b9022..9d92580 100644 --- a/cmd/party/api/issues.go +++ b/cmd/party/api/issues.go @@ -33,12 +33,12 @@ func (api *Api) ListIssues(w http.ResponseWriter, r *http.Request) { issues, metadata, err := api.App.FetchIssues(input.Title, input.Filters, common.GetUser(r)) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"issues": issues, "metadata": metadata}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -65,7 +65,7 @@ func (api *Api) CreateIssue(w http.ResponseWriter, r *http.Request) { headers := make(http.Header) headers.Set("Location", fmt.Sprintf("/v1/issues/%d", issue.ID)) if err = common.WriteJSON(w, http.StatusCreated, common.Envelope{"issue": issue, "options": options}, headers); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -81,13 +81,13 @@ func (api *Api) ReadIssue(w http.ResponseWriter, r *http.Request) { if errors.Is(err, data.ErrRecordNotFound) { api.errorResponse(w, r, data.ErrRecordNotFound) } else { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"issue": result.IssueDetail, "options": result.Options}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -117,7 +117,7 @@ func (api *Api) UpdateIssue(w http.ResponseWriter, r *http.Request) { } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"issue": issue}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -132,13 +132,13 @@ func (api *Api) DeleteIssue(w http.ResponseWriter, r *http.Request) { if errors.Is(err, data.ErrRecordNotFound) { api.errorResponse(w, r, data.ErrRecordNotFound) } else { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"message": "issue successfully deleted"}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -154,13 +154,13 @@ func (api *Api) ReadIssuePubKey(w http.ResponseWriter, r *http.Request) { if errors.Is(err, data.ErrRecordNotFound) { api.errorResponse(w, r, data.ErrRecordNotFound) } else { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"public_key": pubKey}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -186,6 +186,6 @@ func (api *Api) BlindSignIssueVote(w http.ResponseWriter, r *http.Request) { } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"signed": signed}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/middleware.go b/cmd/party/api/middleware.go index 4263d8f..370a139 100644 --- a/cmd/party/api/middleware.go +++ b/cmd/party/api/middleware.go @@ -17,7 +17,7 @@ func (api *Api) RecoverPanic(next http.Handler) http.Handler { defer func() { if err := recover(); err != nil { w.Header().Set("Connection", "close") - api.ServerErrorResponse(w, r, fmt.Errorf("%s", err)) + api.errorResponse(w, r, fmt.Errorf("%s", err)) } }() next.ServeHTTP(w, r) @@ -49,7 +49,7 @@ func (api *Api) RequirePermission(code string, next http.HandlerFunc) http.Handl fn := func(w http.ResponseWriter, r *http.Request) { permissions, err := api.App.Models.Permissions.GetAllForUser(common.GetUser(r).ID) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if !permissions.Include(code) { @@ -87,7 +87,7 @@ func (api *Api) RateLimit(next http.Handler) http.Handler { if api.App.LimiterEnabled { ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } diff --git a/cmd/party/api/mps.go b/cmd/party/api/mps.go index ef43d1a..77b63e3 100644 --- a/cmd/party/api/mps.go +++ b/cmd/party/api/mps.go @@ -10,7 +10,7 @@ import ( func (api *Api) ListMPs(w http.ResponseWriter, r *http.Request) { members, err := api.App.Parlament.ListNRMembers("XXVIII") if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } @@ -25,6 +25,6 @@ func (api *Api) ListMPs(w http.ResponseWriter, r *http.Request) { "members": members, "total": len(members), }, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/parlvotedetail.go b/cmd/party/api/parlvotedetail.go index 06c1a9a..e14755d 100644 --- a/cmd/party/api/parlvotedetail.go +++ b/cmd/party/api/parlvotedetail.go @@ -21,7 +21,7 @@ func (api *Api) GetParlVoteDetail(w http.ResponseWriter, r *http.Request) { detail, err := api.App.Parlament.GetDocumentVote(path) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if detail == nil { @@ -30,6 +30,6 @@ func (api *Api) GetParlVoteDetail(w http.ResponseWriter, r *http.Request) { } if err := common.WriteJSON(w, http.StatusOK, common.Envelope{"vote": detail}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/parlvotes.go b/cmd/party/api/parlvotes.go index b8c0559..01a83fd 100644 --- a/cmd/party/api/parlvotes.go +++ b/cmd/party/api/parlvotes.go @@ -33,7 +33,7 @@ func (api *Api) ListParlVotes(w http.ResponseWriter, r *http.Request) { Period: []string{parlament.CurrentPeriod}, }) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } @@ -102,7 +102,7 @@ func (api *Api) ListParlVotes(w http.ResponseWriter, r *http.Request) { "total_with_votes": totalWithVotes, "party_stats": partyStats, }, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/tokens.go b/cmd/party/api/tokens.go index ad45871..853583b 100644 --- a/cmd/party/api/tokens.go +++ b/cmd/party/api/tokens.go @@ -35,13 +35,13 @@ func (api *Api) CreateAuthenticationToken(w http.ResponseWriter, r *http.Request case errors.Is(err, data.ErrInvalidCredentials): api.errorResponse(w, r, data.ErrInvalidCredentials) default: - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusCreated, common.Envelope{"authentication_token": token}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -61,11 +61,11 @@ func (api *Api) DeleteAuthenticationToken(w http.ResponseWriter, r *http.Request } if err := api.App.DeleteToken(token); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if err := common.WriteJSON(w, http.StatusOK, common.Envelope{"message": "authentication token successfully deleted"}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/users.go b/cmd/party/api/users.go index 1d7c5a2..6e1427d 100644 --- a/cmd/party/api/users.go +++ b/cmd/party/api/users.go @@ -30,12 +30,12 @@ func (api *Api) ListUsers(w http.ResponseWriter, r *http.Request) { users, metadata, err := api.App.ListUsers(input.Filters) if err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"users": users, "metadata": metadata}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -54,7 +54,7 @@ func (api *Api) CreateUser(w http.ResponseWriter, r *http.Request) { } if err = common.WriteJSON(w, http.StatusCreated, common.Envelope{"user": user, "authentication_token": authToken}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -80,13 +80,13 @@ func (api *Api) ReadUser(w http.ResponseWriter, r *http.Request) { if errors.Is(err, data.ErrRecordNotFound) { api.errorResponse(w, r, data.ErrRecordNotFound) } else { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"user": target}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -94,7 +94,7 @@ func (api *Api) ReadUser(w http.ResponseWriter, r *http.Request) { // user := common.GetUser(r).ID // if err := common.WriteJSON(w, http.StatusOK, common.Envelope{"user": user}, nil); err != nil { -// api.ServerErrorResponse(w, r, err) +// api.errorResponse(w, r, err) // } // } @@ -109,13 +109,13 @@ func (api *Api) DeleteUser(w http.ResponseWriter, r *http.Request) { if errors.Is(err, data.ErrRecordNotFound) { api.errorResponse(w, r, data.ErrRecordNotFound) } else { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } return } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"message": "user successfully deleted"}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } @@ -142,6 +142,6 @@ func (api *Api) ActivateUser(w http.ResponseWriter, r *http.Request) { } if err = common.WriteJSON(w, http.StatusOK, common.Envelope{"user": user}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } } diff --git a/cmd/party/api/votes.go b/cmd/party/api/votes.go index e049b55..28865e0 100644 --- a/cmd/party/api/votes.go +++ b/cmd/party/api/votes.go @@ -26,12 +26,12 @@ func (api *Api) Vote(w http.ResponseWriter, r *http.Request) { } if err := api.App.CastVote(input.IssueID, input.OptionID, input.Nonce, input.Signature); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) return } if err := common.WriteJSON(w, http.StatusCreated, common.Envelope{"message": "vote successfully cast"}, nil); err != nil { - api.ServerErrorResponse(w, r, err) + api.errorResponse(w, r, err) } }