From 62d56cd1c70efa2ed78ebc3e51d0c43cd1c1f3e9 Mon Sep 17 00:00:00 2001 From: Thomas Miceli <27960254+thomiceli@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:00:58 +0100 Subject: [PATCH] Save content form on gist create error (#420) --- internal/db/gist.go | 30 +++++++++++++++ internal/web/handlers/gist/create.go | 1 + internal/web/handlers/gist/edit.go | 6 +-- internal/web/server/middlewares.go | 11 ++++-- templates/pages/create.html | 55 +++++++--------------------- templates/pages/edit.html | 55 ++++++---------------------- templates/partials/_editor.html | 38 +++++++++++++++++++ 7 files changed, 105 insertions(+), 91 deletions(-) create mode 100644 templates/partials/_editor.html diff --git a/internal/db/gist.go b/internal/db/gist.go index 8d8b09f..af68b4d 100644 --- a/internal/db/gist.go +++ b/internal/db/gist.go @@ -567,6 +567,32 @@ func (gist *Gist) TopicsSlice() []string { return topics } +func (gist *Gist) ToDTO() (*GistDTO, error) { + files, err := gist.Files("HEAD", false) + if err != nil { + return nil, err + } + + fileDTOs := make([]FileDTO, 0, len(files)) + for _, file := range files { + fileDTOs = append(fileDTOs, FileDTO{ + Filename: file.Filename, + Content: file.Content, + }) + } + + return &GistDTO{ + Title: gist.Title, + Description: gist.Description, + URL: gist.URL, + Files: fileDTOs, + VisibilityDTO: VisibilityDTO{ + Private: gist.Private, + }, + Topics: strings.Join(gist.TopicsSlice(), " "), + }, nil +} + // -- DTO -- // type GistDTO struct { @@ -580,6 +606,10 @@ type GistDTO struct { VisibilityDTO } +func (dto *GistDTO) HasMetadata() bool { + return dto.Title != "" || dto.Description != "" || dto.URL != "" || dto.Topics != "" +} + type VisibilityDTO struct { Private Visibility `validate:"number,min=0,max=2" form:"private"` } diff --git a/internal/web/handlers/gist/create.go b/internal/web/handlers/gist/create.go index 993f4a5..b71fe07 100644 --- a/internal/web/handlers/gist/create.go +++ b/internal/web/handlers/gist/create.go @@ -62,6 +62,7 @@ func ProcessCreate(ctx *context.Context) error { Content: escapedValue, }) } + ctx.SetData("dto", dto) err = ctx.Validate(dto) if err != nil { diff --git a/internal/web/handlers/gist/edit.go b/internal/web/handlers/gist/edit.go index 2b571d0..d45c2d9 100644 --- a/internal/web/handlers/gist/edit.go +++ b/internal/web/handlers/gist/edit.go @@ -10,12 +10,12 @@ import ( func Edit(ctx *context.Context) error { gist := ctx.GetData("gist").(*db.Gist) - files, err := gist.Files("HEAD", false) + gistDto, err := gist.ToDTO() if err != nil { - return ctx.ErrorRes(500, "Error fetching files from repository", err) + return ctx.ErrorRes(500, "Error getting gist data", err) } - ctx.SetData("files", files) + ctx.SetData("dto", gistDto) ctx.SetData("htmlTitle", ctx.TrH("gist.edit.edit-gist", gist.Title)) return ctx.Html("edit.html") diff --git a/internal/web/server/middlewares.go b/internal/web/server/middlewares.go index e139e4c..b9066f2 100644 --- a/internal/web/server/middlewares.go +++ b/internal/web/server/middlewares.go @@ -49,7 +49,7 @@ func (s *Server) registerMiddlewares() { return nil }, })) - s.echo.Use(middleware.Recover()) + //s.echo.Use(middleware.Recover()) s.echo.Use(middleware.Secure()) s.echo.Use(Middleware(sessionInit).toEcho()) @@ -79,9 +79,9 @@ func (s *Server) registerMiddlewares() { func (s *Server) errorHandler(err error, ctx echo.Context) { var httpErr *echo.HTTPError + data := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map) if errors.As(err, &httpErr) { acceptJson := strings.Contains(ctx.Request().Header.Get("Accept"), "application/json") - data := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map) data["error"] = err if acceptJson { if err := ctx.JSON(httpErr.Code, httpErr); err != nil { @@ -96,7 +96,12 @@ func (s *Server) errorHandler(err error, ctx echo.Context) { return } - log.Fatal().Err(err).Send() + log.Error().Err(err).Send() + httpErr = echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + data["error"] = httpErr + if err := ctx.Render(500, "error", data); err != nil { + log.Fatal().Err(err).Send() + } } func dataInit(next Handler) Handler { diff --git a/templates/pages/create.html b/templates/pages/create.html index 251086b..6fc016d 100644 --- a/templates/pages/create.html +++ b/templates/pages/create.html @@ -10,64 +10,35 @@
-

Metadata ▼

-
-
-
-

- - -

- - -
- - -
+ {{ if .dto.Files }} + {{ range .dto.Files }} + {{ template "_editor" dict "Filename" .Filename "Content" .Content "locale" $.locale }} + {{ end }} + {{ else }} + {{ template "_editor" . }} + {{ end }}
diff --git a/templates/pages/edit.html b/templates/pages/edit.html index 5c731b8..c005644 100644 --- a/templates/pages/edit.html +++ b/templates/pages/edit.html @@ -43,64 +43,33 @@
-

Metadata ▼

-
- {{ range $file := .files }} -
-
-

- - -

- - -
- - -
+ {{ if .dto.Files }} + {{ range .dto.Files }} + {{ template "_editor" dict "Filename" .Filename "Content" .Content "locale" $.locale }} + {{ end }} + {{ else }} + {{ template "_editor" . }} {{ end }}
diff --git a/templates/partials/_editor.html b/templates/partials/_editor.html new file mode 100644 index 0000000..205b0de --- /dev/null +++ b/templates/partials/_editor.html @@ -0,0 +1,38 @@ +{{ define "_editor" }} +
+
+

+ + +

+ + +
+ + +
+{{ end }}