From a61d80ee1f320afcb5646991475e93f5df14796b Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Sun, 13 Feb 2022 13:11:22 +0000 Subject: [PATCH 1/4] Implement SPA handling in Backend --- http/http.go | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/http/http.go b/http/http.go index 53870b4..ade5c22 100644 --- a/http/http.go +++ b/http/http.go @@ -1,8 +1,11 @@ package http import ( + "errors" + "io" "io/fs" "net/http" + "path" "strings" "git.javil.eu/jacob1123/budgeteer" @@ -18,6 +21,7 @@ type Handler struct { Service *postgres.Database TokenVerifier budgeteer.TokenVerifier CredentialsVerifier *bcrypt.Verifier + StaticFS http.FileSystem } const ( @@ -37,14 +41,10 @@ func (h *Handler) LoadRoutes(router *gin.Engine) { if err != nil { panic("couldn't open static files") } - staticFS := http.FS(static) + h.StaticFS = http.FS(static) router.Use(enableCachingForStaticFiles()) - router.NoRoute( - func(c *gin.Context) { - c.FileFromFS(c.Request.URL.Path, staticFS) - }, - ) + router.NoRoute(h.ServeStatic) withLogin := router.Group("") withLogin.Use(h.verifyLoginWithRedirect) @@ -81,6 +81,35 @@ func (h *Handler) LoadRoutes(router *gin.Engine) { transaction.POST("/new", h.newTransaction) transaction.POST("/:transactionid", h.newTransaction) } +func (h *Handler) ServeStatic(c *gin.Context) { + h.ServeStaticFile(c, c.Request.URL.Path) +} + +func (h *Handler) ServeStaticFile(c *gin.Context, fullPath string) { + file, err := h.StaticFS.Open(fullPath) + if errors.Is(err, fs.ErrNotExist) { + h.ServeStaticFile(c, path.Join("/", "/index.html")) + return + } + + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + stat, err := file.Stat() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + if stat.IsDir() { + h.ServeStaticFile(c, path.Join(fullPath, "index.html")) + return + } + + http.ServeContent(c.Writer, c.Request, stat.Name(), stat.ModTime(), file.(io.ReadSeeker)) +} func enableCachingForStaticFiles() gin.HandlerFunc { return func(c *gin.Context) { -- 2.47.2 From 958929fd163d64264a6fd5d2545dd0f3d6b4699b Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Sun, 13 Feb 2022 13:15:40 +0000 Subject: [PATCH 2/4] Update docker-compose to use new tag --- docker-compose.dev.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 26843b0..f747b77 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -2,9 +2,7 @@ version: '3.7' services: app: - image: budgeteer:dev - build: - context: ./docker/ + image: hub.javil.eu/budgeteer:dev container_name: budgeteer stdin_open: true # docker run -i tty: true # docker run -t -- 2.47.2 From a97d050eadb5d1bec94a6f94ec0f442986f6edd7 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Sun, 13 Feb 2022 13:15:51 +0000 Subject: [PATCH 3/4] Specify Map serializer for budgets --- web/src/stores/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/stores/session.ts b/web/src/stores/session.ts index eba19d1..73d5a0b 100644 --- a/web/src/stores/session.ts +++ b/web/src/stores/session.ts @@ -21,7 +21,7 @@ export interface Budget { export const useSessionStore = defineStore('session', { state: () => ({ Session: useStorage('session', null, undefined, { serializer: StorageSerializers.object }), - Budgets: useStorage>('budgets', new Map()), + Budgets: useStorage>('budgets', new Map(), undefined, { serializer: StorageSerializers.map }), }), getters: { BudgetsList: (state) => [ ...state.Budgets.values() ], -- 2.47.2 From 5633c029acdb9eb74adf2851583742879ee77657 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Sun, 13 Feb 2022 13:20:18 +0000 Subject: [PATCH 4/4] Update Earthfile and production docker-compose.yml --- Earthfile | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Earthfile b/Earthfile index 2bdcf67..ffc0310 100644 --- a/Earthfile +++ b/Earthfile @@ -12,7 +12,7 @@ docker: WORKDIR /app COPY +build/budgeteer . ENTRYPOINT ["/app/budgeteer"] - SAVE IMAGE budgeteer:latest + SAVE IMAGE hub.javil.eu/budgeteer:latest run: LOCALLY diff --git a/docker-compose.yml b/docker-compose.yml index 3878b8f..4b2a772 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.7' services: app: - image: budgeteer:latest + image: hub.javil.eu/budgeteer:latest container_name: budgeteer ports: - 1323:1323 -- 2.47.2