summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorJulien Dessaux2024-11-17 00:05:22 +0100
committerJulien Dessaux2024-12-17 23:19:18 +0100
commit25ed1188ed970a19675befef12afe68045565c4a (patch)
tree5cfc55047d833400028fb69a7f069f5cedecaacd /cmd
parentfix(tfstated): hash passwords instead of relying on the database encryption key (diff)
downloadtfstated-25ed1188ed970a19675befef12afe68045565c4a.tar.gz
tfstated-25ed1188ed970a19675befef12afe68045565c4a.tar.bz2
tfstated-25ed1188ed970a19675befef12afe68045565c4a.zip
chore(tfstated): refactor helpers to their own package
Diffstat (limited to 'cmd')
-rw-r--r--cmd/tfstated/delete.go7
-rw-r--r--cmd/tfstated/get.go5
-rw-r--r--cmd/tfstated/helpers.go36
-rw-r--r--cmd/tfstated/lock.go13
-rw-r--r--cmd/tfstated/post.go9
-rw-r--r--cmd/tfstated/unlock.go11
6 files changed, 25 insertions, 56 deletions
diff --git a/cmd/tfstated/delete.go b/cmd/tfstated/delete.go
index 3b708d5..d594073 100644
--- a/cmd/tfstated/delete.go
+++ b/cmd/tfstated/delete.go
@@ -5,22 +5,23 @@ import (
"net/http"
"git.adyxax.org/adyxax/tfstated/pkg/database"
+ "git.adyxax.org/adyxax/tfstated/pkg/helpers"
)
func handleDelete(db *database.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
- _ = errorResponse(w, http.StatusBadRequest,
+ helpers.ErrorResponse(w, http.StatusBadRequest,
fmt.Errorf("no state path provided, cannot DELETE /"))
return
}
if success, err := db.DeleteState(r.URL.Path); err != nil {
- _ = errorResponse(w, http.StatusInternalServerError, err)
+ helpers.ErrorResponse(w, http.StatusInternalServerError, err)
} else if success {
w.WriteHeader(http.StatusOK)
} else {
- _ = errorResponse(w, http.StatusNotFound,
+ helpers.ErrorResponse(w, http.StatusNotFound,
fmt.Errorf("state path not found: %s", r.URL.Path))
}
})
diff --git a/cmd/tfstated/get.go b/cmd/tfstated/get.go
index 6bc4466..3310560 100644
--- a/cmd/tfstated/get.go
+++ b/cmd/tfstated/get.go
@@ -5,6 +5,7 @@ import (
"net/http"
"git.adyxax.org/adyxax/tfstated/pkg/database"
+ "git.adyxax.org/adyxax/tfstated/pkg/helpers"
)
func handleGet(db *database.DB) http.Handler {
@@ -12,13 +13,13 @@ func handleGet(db *database.DB) http.Handler {
w.Header().Set("Cache-Control", "no-store, no-cache")
if r.URL.Path == "/" {
- _ = errorResponse(w, http.StatusBadRequest,
+ helpers.ErrorResponse(w, http.StatusBadRequest,
fmt.Errorf("no state path provided, cannot GET /"))
return
}
if data, err := db.GetState(r.URL.Path); err != nil {
- _ = errorResponse(w, http.StatusInternalServerError, err)
+ helpers.ErrorResponse(w, http.StatusInternalServerError, err)
} else {
w.WriteHeader(http.StatusOK)
_, _ = w.Write(data)
diff --git a/cmd/tfstated/helpers.go b/cmd/tfstated/helpers.go
deleted file mode 100644
index 33e14a4..0000000
--- a/cmd/tfstated/helpers.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "fmt"
- "log/slog"
- "net/http"
-)
-
-func decode(r *http.Request, data any) error {
- if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
- return fmt.Errorf("failed to decode json: %w", err)
- }
- return nil
-}
-
-func encode(w http.ResponseWriter, status int, data any) error {
- w.Header().Set("Content-Type", "application/json")
- w.WriteHeader(status)
- if err := json.NewEncoder(w).Encode(data); err != nil {
- slog.Error("failed to encode json", "err", err)
- return fmt.Errorf("failed to encode json: %w", err)
- }
- return nil
-}
-
-func errorResponse(w http.ResponseWriter, status int, err error) error {
- type errorResponse struct {
- Msg string `json:"msg"`
- Status int `json:"status"`
- }
- return encode(w, status, &errorResponse{
- Msg: fmt.Sprintf("%+v", err),
- Status: status,
- })
-}
diff --git a/cmd/tfstated/lock.go b/cmd/tfstated/lock.go
index bab9c6b..80e3575 100644
--- a/cmd/tfstated/lock.go
+++ b/cmd/tfstated/lock.go
@@ -7,6 +7,7 @@ import (
"time"
"git.adyxax.org/adyxax/tfstated/pkg/database"
+ "git.adyxax.org/adyxax/tfstated/pkg/helpers"
)
type lockRequest struct {
@@ -34,27 +35,27 @@ func (l *lockRequest) valid() []error {
func handleLock(db *database.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
- _ = encode(w, http.StatusBadRequest,
+ _ = helpers.Encode(w, http.StatusBadRequest,
fmt.Errorf("no state path provided, cannot LOCK /"))
return
}
var lock lockRequest
- if err := decode(r, &lock); err != nil {
- _ = encode(w, http.StatusBadRequest, err)
+ if err := helpers.Decode(r, &lock); err != nil {
+ _ = helpers.Encode(w, http.StatusBadRequest, err)
return
}
if errs := lock.valid(); len(errs) > 0 {
- _ = encode(w, http.StatusBadRequest,
+ _ = helpers.Encode(w, http.StatusBadRequest,
fmt.Errorf("invalid lock: %+v", errs))
return
}
if success, err := db.SetLockOrGetExistingLock(r.URL.Path, &lock); err != nil {
- _ = errorResponse(w, http.StatusInternalServerError, err)
+ helpers.ErrorResponse(w, http.StatusInternalServerError, err)
} else if success {
w.WriteHeader(http.StatusOK)
} else {
- _ = encode(w, http.StatusConflict, lock)
+ _ = helpers.Encode(w, http.StatusConflict, lock)
}
})
}
diff --git a/cmd/tfstated/post.go b/cmd/tfstated/post.go
index 674eaba..86344b1 100644
--- a/cmd/tfstated/post.go
+++ b/cmd/tfstated/post.go
@@ -6,13 +6,14 @@ import (
"net/http"
"git.adyxax.org/adyxax/tfstated/pkg/database"
+ "git.adyxax.org/adyxax/tfstated/pkg/helpers"
"git.adyxax.org/adyxax/tfstated/pkg/model"
)
func handlePost(db *database.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
- _ = errorResponse(w, http.StatusBadRequest,
+ helpers.ErrorResponse(w, http.StatusBadRequest,
fmt.Errorf("no state path provided, cannot POST /"),
)
return
@@ -22,15 +23,15 @@ func handlePost(db *database.DB) http.Handler {
data, err := io.ReadAll(r.Body)
if err != nil || len(data) == 0 {
- _ = errorResponse(w, http.StatusBadRequest, err)
+ helpers.ErrorResponse(w, http.StatusBadRequest, err)
return
}
account := r.Context().Value(model.AccountContextKey{}).(*model.Account)
if idMismatch, err := db.SetState(r.URL.Path, account.Id, data, id); err != nil {
if idMismatch {
- _ = errorResponse(w, http.StatusConflict, err)
+ helpers.ErrorResponse(w, http.StatusConflict, err)
} else {
- _ = errorResponse(w, http.StatusInternalServerError, err)
+ helpers.ErrorResponse(w, http.StatusInternalServerError, err)
}
} else {
w.WriteHeader(http.StatusOK)
diff --git a/cmd/tfstated/unlock.go b/cmd/tfstated/unlock.go
index e8bddd9..c003d8d 100644
--- a/cmd/tfstated/unlock.go
+++ b/cmd/tfstated/unlock.go
@@ -5,27 +5,28 @@ import (
"net/http"
"git.adyxax.org/adyxax/tfstated/pkg/database"
+ "git.adyxax.org/adyxax/tfstated/pkg/helpers"
)
func handleUnlock(db *database.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
- _ = encode(w, http.StatusBadRequest,
+ _ = helpers.Encode(w, http.StatusBadRequest,
fmt.Errorf("no state path provided, cannot LOCK /"))
return
}
var lock lockRequest
- if err := decode(r, &lock); err != nil {
- _ = encode(w, http.StatusBadRequest, err)
+ if err := helpers.Decode(r, &lock); err != nil {
+ _ = helpers.Encode(w, http.StatusBadRequest, err)
return
}
if success, err := db.Unlock(r.URL.Path, &lock); err != nil {
- _ = errorResponse(w, http.StatusInternalServerError, err)
+ helpers.ErrorResponse(w, http.StatusInternalServerError, err)
} else if success {
w.WriteHeader(http.StatusOK)
} else {
- _ = encode(w, http.StatusConflict, lock)
+ _ = helpers.Encode(w, http.StatusConflict, lock)
}
})
}