From 9c8b6a8f91f6a17e5a6557d427e08acf19017e30 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 30 Mar 2023 16:05:40 +0200 Subject: [PATCH] feat(!): return 204 instead of useless json responses, add fastFetch --- backend/routes/auth/undelete.go | 4 +-- backend/routes/member/delete_member.go | 2 +- backend/routes/mod/create_report.go | 8 ++--- backend/routes/mod/resolve_report.go | 2 +- backend/routes/mod/warnings.go | 2 +- backend/routes/user/delete_user.go | 2 +- backend/routes/user/export.go | 2 +- frontend/src/lib/api/fetch.ts | 32 +++++++++++++++++-- .../routes/@[username]/ReportButton.svelte | 4 +-- .../src/routes/auth/login/CallbackPage.svelte | 6 ++-- .../src/routes/edit/member/[id]/+page.svelte | 8 +++-- frontend/src/routes/edit/profile/+page.svelte | 2 +- frontend/src/routes/reports/+page.svelte | 8 ++--- frontend/src/routes/settings/+page.svelte | 4 +-- .../src/routes/settings/export/+page.svelte | 4 +-- .../src/routes/settings/warnings/+page.svelte | 4 +-- 16 files changed, 63 insertions(+), 31 deletions(-) diff --git a/backend/routes/auth/undelete.go b/backend/routes/auth/undelete.go index 6bc2314..a09cb36 100644 --- a/backend/routes/auth/undelete.go +++ b/backend/routes/auth/undelete.go @@ -42,7 +42,7 @@ func (s *Server) cancelDelete(w http.ResponseWriter, r *http.Request) error { log.Errorf("executing undelete query: %v", err) } - render.JSON(w, r, map[string]any{"success": true}) + render.NoContent(w, r) return nil } @@ -104,6 +104,6 @@ func (s *Server) forceDelete(w http.ResponseWriter, r *http.Request) error { return errors.Wrap(err, "deleting user") } - render.JSON(w, r, map[string]any{"success": true}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/member/delete_member.go b/backend/routes/member/delete_member.go index a4e62cb..672d3e6 100644 --- a/backend/routes/member/delete_member.go +++ b/backend/routes/member/delete_member.go @@ -47,6 +47,6 @@ func (s *Server) deleteMember(w http.ResponseWriter, r *http.Request) error { } } - render.JSON(w, r, map[string]any{"deleted": true}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/mod/create_report.go b/backend/routes/mod/create_report.go index 7e8264e..1b4b505 100644 --- a/backend/routes/mod/create_report.go +++ b/backend/routes/mod/create_report.go @@ -51,13 +51,13 @@ func (s *Server) createUserReport(w http.ResponseWriter, r *http.Request) error return server.APIError{Code: server.ErrBadRequest, Details: "Reason cannot exceed 2000 characters"} } - report, err := s.DB.CreateReport(ctx, claims.UserID, u.ID, nil, req.Reason) + _, err = s.DB.CreateReport(ctx, claims.UserID, u.ID, nil, req.Reason) if err != nil { log.Errorf("creating report for %v: %v", u.ID, err) return errors.Wrap(err, "creating report") } - render.JSON(w, r, map[string]any{"created": true, "created_at": report.CreatedAt}) + render.NoContent(w, r) return nil } @@ -100,12 +100,12 @@ func (s *Server) createMemberReport(w http.ResponseWriter, r *http.Request) erro return server.APIError{Code: server.ErrBadRequest, Details: "Reason cannot exceed 2000 characters"} } - report, err := s.DB.CreateReport(ctx, claims.UserID, u.ID, &m.ID, req.Reason) + _, err = s.DB.CreateReport(ctx, claims.UserID, u.ID, &m.ID, req.Reason) if err != nil { log.Errorf("creating report for %v: %v", m.ID, err) return errors.Wrap(err, "creating report") } - render.JSON(w, r, map[string]any{"created": true, "created_at": report.CreatedAt}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/mod/resolve_report.go b/backend/routes/mod/resolve_report.go index bf7730c..28f327e 100644 --- a/backend/routes/mod/resolve_report.go +++ b/backend/routes/mod/resolve_report.go @@ -108,6 +108,6 @@ func (s *Server) resolveReport(w http.ResponseWriter, r *http.Request) error { return errors.Wrap(err, "committing transaction") } - render.JSON(w, r, map[string]any{"success": true}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/mod/warnings.go b/backend/routes/mod/warnings.go index ba642a9..6419d78 100644 --- a/backend/routes/mod/warnings.go +++ b/backend/routes/mod/warnings.go @@ -58,6 +58,6 @@ func (s *Server) ackWarning(w http.ResponseWriter, r *http.Request) (err error) return server.APIError{Code: server.ErrNotFound} } - render.JSON(w, r, map[string]any{"ok": true}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/user/delete_user.go b/backend/routes/user/delete_user.go index c68916b..80b498a 100644 --- a/backend/routes/user/delete_user.go +++ b/backend/routes/user/delete_user.go @@ -37,6 +37,6 @@ func (s *Server) deleteUser(w http.ResponseWriter, r *http.Request) error { return errors.Wrap(err, "committing transaction") } - render.JSON(w, r, map[string]any{"deleted": true}) + render.NoContent(w, r) return nil } diff --git a/backend/routes/user/export.go b/backend/routes/user/export.go index c1588e0..32f8a3f 100644 --- a/backend/routes/user/export.go +++ b/backend/routes/user/export.go @@ -43,7 +43,7 @@ func (s *Server) startExport(w http.ResponseWriter, r *http.Request) error { } } - render.JSON(w, r, map[string]any{"started": true}) + render.NoContent(w, r) return nil } diff --git a/frontend/src/lib/api/fetch.ts b/frontend/src/lib/api/fetch.ts index 3f080c2..20fa072 100644 --- a/frontend/src/lib/api/fetch.ts +++ b/frontend/src/lib/api/fetch.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import type { APIError } from "./entities"; import { PUBLIC_BASE_URL } from "$env/static/public"; @@ -21,9 +22,36 @@ export async function apiFetch( }); const data = await resp.json(); - if (resp.status < 200 || resp.status >= 300) throw data as APIError; + if (resp.status < 200 || resp.status >= 400) throw data as APIError; return data as T; } -export const apiFetchClient = async (path: string, method: string = "GET", body: any = null) => +export const apiFetchClient = async (path: string, method = "GET", body: any = null) => apiFetch(path, { method, body, token: localStorage.getItem("pronouns-token") || undefined }); + +/** Fetches the specified path without parsing the response body. */ +export async function fastFetch( + path: string, + { + method, + body, + token, + headers, + }: { method?: string; body?: any; token?: string; headers?: Record }, +) { + const resp = await fetch(`${PUBLIC_BASE_URL}/api/v1${path}`, { + method: method || "GET", + headers: { + ...(token ? { Authorization: token } : {}), + ...(headers ? headers : {}), + "Content-Type": "application/json", + }, + body: body ? JSON.stringify(body) : null, + }); + + if (resp.status < 200 || resp.status >= 400) throw (await resp.json()) as APIError; +} + +/** Fetches the specified path without parsing the response body. */ +export const fastFetchClient = async (path: string, method = "GET", body: any = null) => + fastFetch(path, { method, body, token: localStorage.getItem("pronouns-token") || undefined }); diff --git a/frontend/src/routes/@[username]/ReportButton.svelte b/frontend/src/routes/@[username]/ReportButton.svelte index cd63685..f33f5c0 100644 --- a/frontend/src/routes/@[username]/ReportButton.svelte +++ b/frontend/src/routes/@[username]/ReportButton.svelte @@ -1,6 +1,6 @@