From 96a373a7940b71552e0f298c2bf0ae8082475184 Mon Sep 17 00:00:00 2001 From: Stavros Date: Fri, 24 Jan 2025 20:31:10 +0200 Subject: [PATCH] feat: internal server error page --- internal/api/api.go | 55 ++++++++---------------- site/src/main.tsx | 2 + site/src/pages/internal-server-error.tsx | 21 +++++++++ 3 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 site/src/pages/internal-server-error.tsx diff --git a/internal/api/api.go b/internal/api/api.go index 6229410..a1ec111 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -279,54 +279,34 @@ func (api *API) SetupRoutes() { bindErr := c.BindUri(&providerName) - if bindErr != nil { - log.Error().Err(bindErr).Msg("Failed to bind URI") - c.JSON(400, gin.H{ - "status": 400, - "message": "Bad Request", - }) + if handleApiError(c, "Failed to bind URI", bindErr) { return } code := c.Query("code") if code == "" { - c.JSON(400, gin.H{ - "status": 400, - "message": "Bad Request", - }) + log.Error().Msg("No code provided") + c.Redirect(http.StatusPermanentRedirect, "/error") return } provider := api.Providers.GetProvider(providerName.Provider) if provider == nil { - c.JSON(404, gin.H{ - "status": 404, - "message": "Not Found", - }) + c.Redirect(http.StatusPermanentRedirect, "/not-found") return } token, tokenErr := provider.ExchangeToken(code) - if tokenErr != nil { - log.Error().Err(tokenErr).Msg("Failed to exchange token") - c.JSON(500, gin.H{ - "status": 500, - "message": "Internal Server Error", - }) + if handleApiError(c, "Failed to exchange token", tokenErr) { return } email, emailErr := api.Providers.GetUser(providerName.Provider) - if emailErr != nil { - log.Error().Err(emailErr).Msg("Failed to get user") - c.JSON(500, gin.H{ - "status": 500, - "message": "Internal Server Error", - }) + if handleApiError(c, "Failed to get user", emailErr) { return } @@ -335,12 +315,7 @@ func (api *API) SetupRoutes() { unauthorizedQuery, unauthorizedQueryErr := query.Values(types.UnauthorizedQuery{ Email: email, }) - if unauthorizedQueryErr != nil { - log.Error().Err(unauthorizedQueryErr).Msg("Failed to build query") - c.JSON(501, gin.H{ - "status": 501, - "message": "Internal Server Error", - }) + if handleApiError(c, "Failed to build query", unauthorizedQueryErr) { return } c.Redirect(http.StatusPermanentRedirect, fmt.Sprintf("%s/unauthorized?%s", api.Config.AppURL, unauthorizedQuery.Encode())) @@ -365,12 +340,7 @@ func (api *API) SetupRoutes() { RedirectURI: redirectURI, }) - if redirectQueryErr != nil { - log.Error().Err(redirectQueryErr).Msg("Failed to build query") - c.JSON(501, gin.H{ - "status": 501, - "message": "Internal Server Error", - }) + if handleApiError(c, "Failed to build query", redirectQueryErr) { return } @@ -406,3 +376,12 @@ func zerolog() gin.HandlerFunc { } } } + +func handleApiError(c *gin.Context, msg string, err error) bool { + if err != nil { + log.Error().Err(err).Msg(msg) + c.Redirect(http.StatusPermanentRedirect, "/error") + return true + } + return false +} diff --git a/site/src/main.tsx b/site/src/main.tsx index 2cd216a..a30a5fd 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -14,6 +14,7 @@ import { LogoutPage } from "./pages/logout-page.tsx"; import { ContinuePage } from "./pages/continue-page.tsx"; import { NotFoundPage } from "./pages/not-found-page.tsx"; import { UnauthorizedPage } from "./pages/unauthorized-page.tsx"; +import { InternalServerError } from "./pages/internal-server-error.tsx"; const queryClient = new QueryClient({ defaultOptions: { @@ -36,6 +37,7 @@ createRoot(document.getElementById("root")!).render( } /> } /> } /> + } /> } /> diff --git a/site/src/pages/internal-server-error.tsx b/site/src/pages/internal-server-error.tsx new file mode 100644 index 0000000..b841409 --- /dev/null +++ b/site/src/pages/internal-server-error.tsx @@ -0,0 +1,21 @@ +import { Button, Paper, Text } from "@mantine/core"; +import { Layout } from "../components/layouts/layout"; + +export const InternalServerError = () => { + return ( + + + + Internal Server Error + + + An error occured on the server and it currently cannot serve your + request. + + + + + ); +};