From 6fb2db436d18e16995513c3f3027ca3688f2bab5 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Mon, 21 Apr 2025 23:49:24 +0200 Subject: [PATCH] chore(webui): improve the states id page --- pkg/webui/html/states.html | 2 +- pkg/webui/html/statesId.html | 51 ++++++++++++++++++++++++++++++-- pkg/webui/states.go | 42 --------------------------- pkg/webui/statesId.go | 56 ++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 45 deletions(-) create mode 100644 pkg/webui/statesId.go diff --git a/pkg/webui/html/states.html b/pkg/webui/html/states.html index 10eaf33..f55baa0 100644 --- a/pkg/webui/html/states.html +++ b/pkg/webui/html/states.html @@ -45,7 +45,7 @@ {{ end }}
- +
diff --git a/pkg/webui/html/statesId.html b/pkg/webui/html/statesId.html index 9139c91..46610a0 100644 --- a/pkg/webui/html/statesId.html +++ b/pkg/webui/html/statesId.html @@ -1,5 +1,6 @@ {{ define "main" }} -

State

+

{{ .State.Path }}

+

Status

The state at path {{ .State.Path }} @@ -18,8 +19,54 @@ {{ end }} + Use this page to manage the state or inspect the current and past state versions.

-

Use this page to inspect the existing versions.

+

Operations

+
+
+
+ Edit State +
+ + + +
+ {{ if .PathDuplicate }} + This path already exist. + {{ else if .PathError }} + + Path needs to be a valid + + absolute + + URL path is considered absolute when it starts with a / character. + + + and + + clean + + A URL path is considered clean when it has no relative path elements like ../, repeated // and when it does not end with a /. + + + URL path. + + {{ end }} +
+
+
+
+ Danger Zone + +
+
+
+

Versions

diff --git a/pkg/webui/states.go b/pkg/webui/states.go index f7df310..6c763ce 100644 --- a/pkg/webui/states.go +++ b/pkg/webui/states.go @@ -10,7 +10,6 @@ import ( "git.adyxax.org/adyxax/tfstated/pkg/database" "git.adyxax.org/adyxax/tfstated/pkg/model" - "go.n16f.net/uuid" ) type StatesPage struct { @@ -23,7 +22,6 @@ type StatesPage struct { } var statesTemplates = template.Must(template.ParseFS(htmlFS, "html/base.html", "html/states.html")) -var statesIdTemplate = template.Must(template.ParseFS(htmlFS, "html/base.html", "html/statesId.html")) func handleStatesGET(db *database.DB) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -95,43 +93,3 @@ func handleStatesPOST(db *database.DB) http.Handler { http.Redirect(w, r, destination, http.StatusFound) }) } - -func handleStatesIdGET(db *database.DB) http.Handler { - type StatesData struct { - Page *Page - State *model.State - Usernames map[string]string - Versions []model.Version - } - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - var stateId uuid.UUID - if err := stateId.Parse(r.PathValue("id")); err != nil { - errorResponse(w, r, http.StatusBadRequest, err) - return - } - state, err := db.LoadStateById(stateId) - if err != nil { - errorResponse(w, r, http.StatusInternalServerError, err) - return - } - versions, err := db.LoadVersionsByState(state) - if err != nil { - errorResponse(w, r, http.StatusInternalServerError, err) - return - } - usernames, err := db.LoadAccountUsernames() - if err != nil { - errorResponse(w, r, http.StatusInternalServerError, err) - return - } - render(w, statesIdTemplate, http.StatusOK, StatesData{ - Page: makePage(r, &Page{ - Section: "states", - Title: state.Path, - }), - State: state, - Usernames: usernames, - Versions: versions, - }) - }) -} diff --git a/pkg/webui/statesId.go b/pkg/webui/statesId.go new file mode 100644 index 0000000..4d8d413 --- /dev/null +++ b/pkg/webui/statesId.go @@ -0,0 +1,56 @@ +package webui + +import ( + "html/template" + "net/http" + + "git.adyxax.org/adyxax/tfstated/pkg/database" + "git.adyxax.org/adyxax/tfstated/pkg/model" + "go.n16f.net/uuid" +) + +type StatesIdPage struct { + Page *Page + Path string + PathError bool + PathDuplicate bool + State *model.State + Usernames map[string]string + Versions []model.Version +} + +var statesIdTemplate = template.Must(template.ParseFS(htmlFS, "html/base.html", "html/statesId.html")) + +func handleStatesIdGET(db *database.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var stateId uuid.UUID + if err := stateId.Parse(r.PathValue("id")); err != nil { + errorResponse(w, r, http.StatusBadRequest, err) + return + } + state, err := db.LoadStateById(stateId) + if err != nil { + errorResponse(w, r, http.StatusInternalServerError, err) + return + } + versions, err := db.LoadVersionsByState(state) + if err != nil { + errorResponse(w, r, http.StatusInternalServerError, err) + return + } + usernames, err := db.LoadAccountUsernames() + if err != nil { + errorResponse(w, r, http.StatusInternalServerError, err) + return + } + render(w, statesIdTemplate, http.StatusOK, StatesIdPage{ + Page: makePage(r, &Page{ + Section: "states", + Title: state.Path, + }), + State: state, + Usernames: usernames, + Versions: versions, + }) + }) +}