From 4e6b789167266f312630101773867906d75bada8 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 19 Feb 2024 01:19:56 +0100 Subject: [PATCH] Add page to create/update user --- db.go | 12 +++++++++++- entity.go | 15 ++++++++++----- main.go | 2 ++ template/index.html | 4 +++- template/update-user.html | 21 +++++++++++++++++++++ user.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++-- diff --git a/db.go b/db.go index c82dca8c118d5fd507ec9575f4b8413bc3e4f946..9198db2582880a8b5a2c1562c69bbb9ebe656f75 100644 --- a/db.go +++ b/db.go @@ -57,7 +57,17 @@ func (db *DB) Close() error { return db.db.Close() } -func (db *DB) FetchUser(ctx context.Context, username string) (*User, error) { +func (db *DB) FetchUser(ctx context.Context, id ID[*User]) (*User, error) { + rows, err := db.db.QueryContext(ctx, "SELECT * FROM User WHERE id = ?", id) + if err != nil { + return nil, err + } + var user User + err = scanRow(&user, rows) + return &user, err +} + +func (db *DB) FetchUserByUsername(ctx context.Context, username string) (*User, error) { rows, err := db.db.QueryContext(ctx, "SELECT * FROM User WHERE username = ?", username) if err != nil { return nil, err diff --git a/entity.go b/entity.go index a36750b99156715f6cd98b0b98c367b3531a92a3..2958f9b7c433741ae3992289b24f8719a955c4c6 100644 --- a/entity.go +++ b/entity.go @@ -33,6 +33,14 @@ _ sql.Scanner = (*ID[*User])(nil) _ driver.Valuer = ID[*User](0) ) +func ParseID[T entity](s string) (ID[T], error) { + u, _ := strconv.ParseUint(s, 10, 63) + if u == 0 { + return 0, fmt.Errorf("invalid ID") + } + return ID[T](u), nil +} + func (ptr *ID[T]) Scan(v interface{}) error { if v == nil { *ptr = 0 @@ -207,11 +215,8 @@ } func UnmarshalSecret[T entity](s string) (id ID[T], secret string, err error) { idStr, secret, _ := strings.Cut(s, ".") - u, _ := strconv.ParseUint(idStr, 10, 63) - if u == 0 { - return 0, "", fmt.Errorf("invalid ID") - } - return ID[T](int64(u)), secret, nil + id, err = ParseID[T](idStr) + return id, secret, err } func MarshalSecret[T entity](id ID[T], secret string) string { diff --git a/main.go b/main.go index e6d5e7e9b49df2756caa03580139b79c85909961..063c66500e938e47213622f7462593a85a994b3a 100644 --- a/main.go +++ b/main.go @@ -36,6 +36,8 @@ mux.Handle("/static/*", http.FileServer(http.FS(staticFS))) mux.Get("/", index) mux.Post("/client/new", createClient) mux.HandleFunc("/login", login) + mux.HandleFunc("/user/new", updateUser) + mux.HandleFunc("/user/{id}", updateUser) mux.HandleFunc("/authorize", authorize) mux.Post("/token", exchangeToken) diff --git a/template/index.html b/template/index.html index 06c442c3dd5a9b4e13cdc6fd7809b0738bdf6abd..764be26d0efd6979d632c552d50f83308545df2d 100644 --- a/template/index.html +++ b/template/index.html @@ -5,10 +5,12 @@

sinwon

+ +
-{{ with . }} +{{ with .Clients }}

{{ . | len }} clients registered: