Remove 'go-playground/form' dependency; just use JSON and 'hx-ext="json-enc"' in all forms

This commit is contained in:
Alessio 2024-03-08 14:07:25 -08:00
parent c6ec9be562
commit 42ab53fb73
5 changed files with 14 additions and 44 deletions

1
go.mod
View File

@ -5,7 +5,6 @@ go 1.16
require ( require (
github.com/Masterminds/sprig/v3 v3.2.3 github.com/Masterminds/sprig/v3 v3.2.3
github.com/andybalholm/cascadia v1.3.2 github.com/andybalholm/cascadia v1.3.2
github.com/go-playground/form/v4 v4.2.1
github.com/go-test/deep v1.0.7 github.com/go-test/deep v1.0.7
github.com/google/uuid v1.1.1 github.com/google/uuid v1.1.1
github.com/jarcoal/httpmock v1.1.0 github.com/jarcoal/httpmock v1.1.0

4
go.sum
View File

@ -9,10 +9,6 @@ github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/form/v4 v4.2.1 h1:HjdRDKO0fftVMU5epjPW2SOREcZ6/wLUzEobqUGJuPw=
github.com/go-playground/form/v4 v4.2.1/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=

View File

@ -2,6 +2,8 @@ package webserver
import ( import (
"fmt" "fmt"
"encoding/json"
"io"
"net/http" "net/http"
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
@ -13,10 +15,11 @@ type LoginData struct {
} }
type LoginForm struct { type LoginForm struct {
Username string `form:"username"` Username string `json:"username"`
Password string `form:"password"` Password string `json:"password"`
FormErrors FormErrors
} }
type FormErrors map[string]string
func (f *LoginForm) Validate() { func (f *LoginForm) Validate() {
if f.FormErrors == nil { if f.FormErrors == nil {
@ -34,11 +37,9 @@ func (app *Application) Login(w http.ResponseWriter, r *http.Request) {
app.traceLog.Printf("'Login' handler (path: %q)", r.URL.Path) app.traceLog.Printf("'Login' handler (path: %q)", r.URL.Path)
var form LoginForm var form LoginForm
if r.Method == "POST" { if r.Method == "POST" {
err := parse_form(r, &form) data, err := io.ReadAll(r.Body)
if err != nil { panic_if(err)
app.InfoLog.Print("Form error parse: " + err.Error()) panic_if(json.Unmarshal(data, &form)) // TODO: HTTP 400 not 500
app.error_400_with_message(w, err.Error())
}
form.Validate() form.Validate()
if len(form.FormErrors) == 0 { if len(form.FormErrors) == 0 {
api := scraper.NewGuestSession() api := scraper.NewGuestSession()
@ -104,14 +105,11 @@ func (app *Application) after_login(w http.ResponseWriter, r *http.Request, api
func (app *Application) ChangeSession(w http.ResponseWriter, r *http.Request) { func (app *Application) ChangeSession(w http.ResponseWriter, r *http.Request) {
app.traceLog.Printf("'change-session' handler (path: %q)", r.URL.Path) app.traceLog.Printf("'change-session' handler (path: %q)", r.URL.Path)
form := struct { form := struct {
AccountName string `form:"account"` AccountName string `json:"account"`
}{} }{}
err := parse_form(r, &form) data, err := io.ReadAll(r.Body)
if err != nil { panic_if(err)
app.InfoLog.Print("Form error parse: " + err.Error()) panic_if(json.Unmarshal(data, &form)) // TODO: HTTP 400 not 500
app.error_400_with_message(w, err.Error())
return
}
err = app.SetActiveUser(scraper.UserHandle(form.AccountName)) err = app.SetActiveUser(scraper.UserHandle(form.AccountName))
if err != nil { if err != nil {
app.error_400_with_message(w, fmt.Sprintf("User not in database: %s", form.AccountName)) app.error_400_with_message(w, fmt.Sprintf("User not in database: %s", form.AccountName))

View File

@ -3,7 +3,6 @@ package webserver
import ( import (
"crypto/tls" "crypto/tls"
// "encoding/json" // "encoding/json"
"errors"
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
@ -15,8 +14,6 @@ import (
"strings" "strings"
"time" "time"
"github.com/go-playground/form/v4"
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence"
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
) )
@ -183,23 +180,3 @@ func parse_cursor_value(c *persistence.Cursor, r *http.Request) error {
} }
return nil return nil
} }
type FormErrors map[string]string
var formDecoder = form.NewDecoder()
var (
ErrCorruptedFormData = errors.New("corrupted form data")
ErrIncorrectFormParams = errors.New("incorrect form parameters")
)
func parse_form(req *http.Request, result interface{}) error {
err := req.ParseForm()
if err != nil {
return ErrCorruptedFormData
}
if err = formDecoder.Decode(result, req.PostForm); err != nil {
return ErrIncorrectFormParams
}
return nil
}

View File

@ -2,7 +2,7 @@
{{define "main"}} {{define "main"}}
<div class="login"> <div class="login">
<form hx-post="/change-session" hx-target=".nav-sidebar" hx-swap="outerHTML"> <form hx-post="/change-session" hx-target=".nav-sidebar" hx-swap="outerHTML" hx-ext="json-enc">
<label for="select-account">Choose account:</label> <label for="select-account">Choose account:</label>
<select name="account" id="select-account"> <select name="account" id="select-account">
{{range .ExistingSessions}} {{range .ExistingSessions}}
@ -17,7 +17,7 @@
<p>Or log in</p> <p>Or log in</p>
<form class="login-form" hx-post="/login" hx-target="body"> <form class="login-form" hx-post="/login" hx-target="body" hx-ext="json-enc">
<div class="field-container"> <div class="field-container">
<label>Username</label> <label>Username</label>
{{with .FormErrors.username}} {{with .FormErrors.username}}