From 7f284d50032be5ae725da9ea8264a865497a26cc Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:27:10 +0900 Subject: [PATCH 1/5] feat: configurable db file name --- .gitignore | 2 +- server/db/db.go | 2 +- server/env/env.go | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5a4c884..518ff42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .DS_Store gin-bin -lishwist.db +*lishwist.db .env*.local server/db/init_sql.go .ignored/ diff --git a/server/db/db.go b/server/db/db.go index eff20d8..c3df638 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -14,7 +14,7 @@ import ( var database *sql.DB func Open() error { - db, err := sql.Open("sqlite", "./lishwist.db") + db, err := sql.Open("sqlite", env.DatabaseFile) if err != nil { return err } diff --git a/server/env/env.go b/server/env/env.go index a6f27be..ee9a036 100644 --- a/server/env/env.go +++ b/server/env/env.go @@ -14,6 +14,7 @@ func GuaranteeEnv(key string) (variable string) { return } +var DatabaseFile = GuaranteeEnv("LISHWIST_DATABASE_FILE") var SessionSecret = GuaranteeEnv("LISHWIST_SESSION_SECRET") var HostRootUrl = GuaranteeEnv("LISHWIST_HOST_ROOT_URL") var HostPort = os.Getenv("LISHWIST_HOST_PORT") -- 2.40.1 From f2e67761ffaa6c765f65688272905feff03150fc Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:27:59 +0900 Subject: [PATCH 2/5] feat: normalized usernames --- server/api/register.go | 2 +- server/db/group.go | 4 +++- server/db/init.sql | 1 + server/db/user.go | 36 ++++++++++++++++++++---------------- server/normalize/name.go | 14 ++++++++++++++ 5 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 server/normalize/name.go diff --git a/server/api/register.go b/server/api/register.go index 77a4df1..88b5312 100644 --- a/server/api/register.go +++ b/server/api/register.go @@ -77,7 +77,7 @@ func Register(username, newPassword, confirmPassword string) *RegisterProps { existingUser, _ := db.GetUserByName(username) if existingUser != nil { - log.Printf("Username is taken: %q\n", username) + log.Printf("Username is taken: %q\n", existingUser.NormalName) props.Username.Error = "Username is taken" return props } diff --git a/server/db/group.go b/server/db/group.go index 5b1efdc..9ba69d3 100644 --- a/server/db/group.go +++ b/server/db/group.go @@ -3,6 +3,7 @@ package db import ( "database/sql" "fmt" + "lishwist/normalize" "strconv" ) @@ -66,7 +67,7 @@ func queryForGroups(query string, args ...any) ([]Group, error) { } func queryForGroupMembers(groupId string) ([]User, error) { - query := "SELECT user.id, user.name, user.reference, user.is_admin, user.is_live FROM v_user AS user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ? ORDER BY group_member.user_id" + query := "SELECT user.id, user.name, user.display_name, user.reference, user.is_admin, user.is_live FROM v_user AS user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ? ORDER BY group_member.user_id" members, err := queryForUsers(query, groupId) if err != nil { return members, fmt.Errorf("Failed to get members: %w", err) @@ -85,6 +86,7 @@ func GetAllGroups() ([]Group, error) { } func CreateGroup(name string, reference string) (*Group, error) { + name = normalize.Name(name) stmt := "INSERT INTO [group] (name, reference) VALUES (?, ?)" result, err := database.Exec(stmt, name, reference) if err != nil { diff --git a/server/db/init.sql b/server/db/init.sql index 5f1aeff..2780036 100644 --- a/server/db/init.sql +++ b/server/db/init.sql @@ -2,6 +2,7 @@ BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "user" ( "id" INTEGER NOT NULL UNIQUE, "name" TEXT NOT NULL UNIQUE, + "display_name" TEXT NOT NULL UNIQUE, "reference" TEXT NOT NULL UNIQUE, "motto" TEXT NOT NULL DEFAULT "", "password_hash" TEXT NOT NULL, diff --git a/server/db/user.go b/server/db/user.go index 79975f9..ea40c88 100644 --- a/server/db/user.go +++ b/server/db/user.go @@ -3,16 +3,18 @@ package db import ( "database/sql" "fmt" + "lishwist/normalize" "github.com/google/uuid" ) type User struct { - Id string - Name string - Reference string - IsAdmin bool - IsLive bool + Id string + NormalName string + Name string + Reference string + IsAdmin bool + IsLive bool } type Gift struct { @@ -30,7 +32,7 @@ type Gift struct { func queryForUser(query string, args ...any) (*User, error) { var u User - err := database.QueryRow(query, args...).Scan(&u.Id, &u.Name, &u.Reference, &u.IsAdmin, &u.IsLive) + err := database.QueryRow(query, args...).Scan(&u.Id, &u.NormalName, &u.Name, &u.Reference, &u.IsAdmin, &u.IsLive) if err == sql.ErrNoRows { return nil, nil } else if err != nil { @@ -48,7 +50,7 @@ func queryForUsers(query string, args ...any) ([]User, error) { users := []User{} for rows.Next() { var u User - err = rows.Scan(&u.Id, &u.Name, &u.Reference, &u.IsAdmin, &u.IsLive) + err = rows.Scan(&u.Id, &u.NormalName, &u.Name, &u.Reference, &u.IsAdmin, &u.IsLive) if err != nil { return nil, err } @@ -62,27 +64,28 @@ func queryForUsers(query string, args ...any) ([]User, error) { } func GetAllUsers() ([]User, error) { - stmt := "SELECT id, name, reference, is_admin, is_live FROM user" + stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM user" return queryForUsers(stmt) } func GetUser(id string) (*User, error) { - stmt := "SELECT id, name, reference, is_admin, is_live FROM v_user WHERE id = ?" + stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE id = ?" return queryForUser(stmt, id) } func GetUserByName(username string) (*User, error) { - stmt := "SELECT id, name, reference, is_admin, is_live FROM v_user WHERE name = ?" + username = normalize.Name(username) + stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE name = ?" return queryForUser(stmt, username) } func GetUserByReference(reference string) (*User, error) { - stmt := "SELECT id, name, reference, is_admin, is_live FROM v_user WHERE reference = ?" + stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE reference = ?" return queryForUser(stmt, reference) } func GetAnyUserByReference(reference string) (*User, error) { - stmt := "SELECT id, name, reference, is_admin, is_live FROM user WHERE reference = ?" + stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM user WHERE reference = ?" return queryForUser(stmt, reference) } @@ -96,13 +99,14 @@ func (u *User) SetLive(setting bool) error { return err } -func CreateUser(username string, passHash []byte) (*User, error) { - stmt := "INSERT INTO user (name, reference, password_hash) VALUES (?, ?, ?)" +func CreateUser(name string, passHash []byte) (*User, error) { + username := normalize.Name(name) + stmt := "INSERT INTO user (name, display_name, reference, password_hash) VALUES (?, ?, ?, ?)" reference, err := uuid.NewRandom() if err != nil { return nil, err } - result, err := database.Exec(stmt, username, reference, passHash) + result, err := database.Exec(stmt, username, name, reference, passHash) if err != nil { return nil, err } @@ -112,7 +116,7 @@ func CreateUser(username string, passHash []byte) (*User, error) { } user := User{ Id: fmt.Sprintf("%d", id), - Name: username, + Name: name, } return &user, nil } diff --git a/server/normalize/name.go b/server/normalize/name.go new file mode 100644 index 0000000..ccd8574 --- /dev/null +++ b/server/normalize/name.go @@ -0,0 +1,14 @@ +package normalize + +import ( + "strings" +) + +func Trim(s string) string { + return strings.Trim(s, " \t") +} + +func Name(name string) string { + name = Trim(name) + return strings.ToLower(name) +} -- 2.40.1 From 67abba1f6704f036ef29a70d31c610b85120befd Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:01:41 +0900 Subject: [PATCH 3/5] refac: db/ as submodule of api/ --- .gitignore | 2 +- server/{ => api}/db/db.go | 0 server/{ => api}/db/gen_init_sql.go | 0 server/{ => api}/db/group.go | 0 server/{ => api}/db/init.sql | 0 server/{ => api}/db/migration/1.sql | 0 server/{ => api}/db/user.go | 0 server/api/login.go | 2 +- server/api/register.go | 2 +- server/main.go | 3 ++- server/routing/context.go | 2 +- server/routing/foreign_wishlist.go | 2 +- server/routing/groups.go | 2 +- server/routing/home.go | 2 +- server/routing/todo.go | 2 +- server/routing/users.go | 2 +- server/routing/wishlist.go | 2 +- 17 files changed, 12 insertions(+), 11 deletions(-) rename server/{ => api}/db/db.go (100%) rename server/{ => api}/db/gen_init_sql.go (100%) rename server/{ => api}/db/group.go (100%) rename server/{ => api}/db/init.sql (100%) rename server/{ => api}/db/migration/1.sql (100%) rename server/{ => api}/db/user.go (100%) diff --git a/.gitignore b/.gitignore index 518ff42..d862823 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ gin-bin *lishwist.db .env*.local -server/db/init_sql.go +server/api/db/init_sql.go .ignored/ diff --git a/server/db/db.go b/server/api/db/db.go similarity index 100% rename from server/db/db.go rename to server/api/db/db.go diff --git a/server/db/gen_init_sql.go b/server/api/db/gen_init_sql.go similarity index 100% rename from server/db/gen_init_sql.go rename to server/api/db/gen_init_sql.go diff --git a/server/db/group.go b/server/api/db/group.go similarity index 100% rename from server/db/group.go rename to server/api/db/group.go diff --git a/server/db/init.sql b/server/api/db/init.sql similarity index 100% rename from server/db/init.sql rename to server/api/db/init.sql diff --git a/server/db/migration/1.sql b/server/api/db/migration/1.sql similarity index 100% rename from server/db/migration/1.sql rename to server/api/db/migration/1.sql diff --git a/server/db/user.go b/server/api/db/user.go similarity index 100% rename from server/db/user.go rename to server/api/db/user.go diff --git a/server/api/login.go b/server/api/login.go index 9e39d3a..d4d9341 100644 --- a/server/api/login.go +++ b/server/api/login.go @@ -1,7 +1,7 @@ package api import ( - "lishwist/db" + "lishwist/api/db" "lishwist/templates" "log" diff --git a/server/api/register.go b/server/api/register.go index 88b5312..1d72fa5 100644 --- a/server/api/register.go +++ b/server/api/register.go @@ -3,7 +3,7 @@ package api import ( "log" - "lishwist/db" + "lishwist/api/db" "lishwist/templates" "golang.org/x/crypto/bcrypt" diff --git a/server/main.go b/server/main.go index 6f63b08..d77f133 100644 --- a/server/main.go +++ b/server/main.go @@ -6,7 +6,8 @@ import ( "net/http" "lishwist/api" - "lishwist/db" + // TODO: lishwist/api/db ought not to be used outside lishwist/api + "lishwist/api/db" "lishwist/env" "lishwist/router" "lishwist/routing" diff --git a/server/routing/context.go b/server/routing/context.go index e8c9fb0..1d48290 100644 --- a/server/routing/context.go +++ b/server/routing/context.go @@ -1,7 +1,7 @@ package routing import ( - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" "net/http" ) diff --git a/server/routing/foreign_wishlist.go b/server/routing/foreign_wishlist.go index 99b8944..0eb0123 100644 --- a/server/routing/foreign_wishlist.go +++ b/server/routing/foreign_wishlist.go @@ -1,7 +1,7 @@ package routing import ( - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" "net/http" ) diff --git a/server/routing/groups.go b/server/routing/groups.go index f38e22e..a6db5e5 100644 --- a/server/routing/groups.go +++ b/server/routing/groups.go @@ -4,7 +4,7 @@ import ( "net/http" "slices" - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" ) diff --git a/server/routing/home.go b/server/routing/home.go index c2a5084..7f05b79 100644 --- a/server/routing/home.go +++ b/server/routing/home.go @@ -3,7 +3,7 @@ package routing import ( "net/http" - "lishwist/db" + "lishwist/api/db" "lishwist/env" "lishwist/rsvp" ) diff --git a/server/routing/todo.go b/server/routing/todo.go index 470aabf..d856a3e 100644 --- a/server/routing/todo.go +++ b/server/routing/todo.go @@ -1,7 +1,7 @@ package routing import ( - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" "net/http" ) diff --git a/server/routing/users.go b/server/routing/users.go index 05fc35a..826f14b 100644 --- a/server/routing/users.go +++ b/server/routing/users.go @@ -1,7 +1,7 @@ package routing import ( - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" "net/http" ) diff --git a/server/routing/wishlist.go b/server/routing/wishlist.go index 798c6a5..d8b2c4e 100644 --- a/server/routing/wishlist.go +++ b/server/routing/wishlist.go @@ -1,7 +1,7 @@ package routing import ( - "lishwist/db" + "lishwist/api/db" "lishwist/rsvp" "net/http" ) -- 2.40.1 From c8d179e29701c434c048f6b62690f829cb1a8809 Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:02:55 +0900 Subject: [PATCH 4/5] feat: write flashes in SeeOther response --- server/routing/login.go | 6 +++--- server/routing/register.go | 6 +++--- server/rsvp/response.go | 7 +++++++ server/rsvp/session.go | 17 +++++++++++++---- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/server/routing/login.go b/server/routing/login.go index e296ddb..dffb9b1 100644 --- a/server/routing/login.go +++ b/server/routing/login.go @@ -11,7 +11,7 @@ func Login(h http.Header, r *rsvp.Request) rsvp.Response { props := api.NewLoginProps("", "") - flash := session.FlashGet("login_props") + flash := session.FlashGet() flashProps, ok := flash.(*api.LoginProps) if ok { props.Username.Value = flashProps.Username.Value @@ -21,7 +21,7 @@ func Login(h http.Header, r *rsvp.Request) rsvp.Response { props.Password.Error = flashProps.Password.Error } - flash = session.FlashGet("successful_registration") + flash = session.FlashGet() successfulReg, _ := flash.(bool) if successfulReg { props.SuccessfulRegistration = true @@ -39,7 +39,7 @@ func LoginPost(h http.Header, r *rsvp.Request) rsvp.Response { props := api.Login(username, password) if props != nil { - session.FlashSet(&props, "login_props") + session.FlashSet(&props) return rsvp.SeeOther("/").SaveSession(session) } diff --git a/server/routing/register.go b/server/routing/register.go index 33aded9..c9118b3 100644 --- a/server/routing/register.go +++ b/server/routing/register.go @@ -10,7 +10,7 @@ func Register(h http.Header, r *rsvp.Request) rsvp.Response { props := api.NewRegisterProps("", "", "") session := r.GetSession() - flash := session.FlashGet("register_props") + flash := session.FlashGet() flashProps, _ := flash.(*api.RegisterProps) if flashProps != nil { @@ -36,10 +36,10 @@ func RegisterPost(h http.Header, r *rsvp.Request) rsvp.Response { s := r.GetSession() if props != nil { - s.FlashSet(&props, "register_props") + s.FlashSet(&props) return rsvp.SeeOther("/register").SaveSession(s) } - s.FlashSet(true, "successful_registration") + s.FlashSet(true) return rsvp.SeeOther("/").SaveSession(s) } diff --git a/server/rsvp/response.go b/server/rsvp/response.go index 921e79e..d5653db 100644 --- a/server/rsvp/response.go +++ b/server/rsvp/response.go @@ -29,6 +29,13 @@ func (res *Response) Write(w http.ResponseWriter, r *http.Request) error { if res.SeeOther != "" { http.Redirect(w, r, res.SeeOther, http.StatusSeeOther) + flash := res.Session.FlashPeek() + if flash != nil { + err := json.NewEncoder(w).Encode(flash) + if err != nil { + return err + } + } return nil } diff --git a/server/rsvp/session.go b/server/rsvp/session.go index 9761766..4389d5a 100644 --- a/server/rsvp/session.go +++ b/server/rsvp/session.go @@ -8,8 +8,8 @@ type Session struct { inner *sessions.Session } -func (s *Session) FlashGet(key ...string) any { - list := s.inner.Flashes(key...) +func (s *Session) FlashGet() any { + list := s.inner.Flashes() if len(list) < 1 { return nil } else { @@ -17,8 +17,17 @@ func (s *Session) FlashGet(key ...string) any { } } -func (s *Session) FlashSet(value any, key ...string) { - s.inner.AddFlash(value, key...) +func (s *Session) FlashPeek() any { + list, _ := s.inner.Values["_flash"].([]any) + if len(list) < 1 { + return nil + } else { + return list[0] + } +} + +func (s *Session) FlashSet(value any) { + s.inner.AddFlash(value) } func (s *Session) SetID(value string) { -- 2.40.1 From fefc4ac3db2b5ff3edc979a66e6f87ba1e3d4793 Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:56:25 +0900 Subject: [PATCH 5/5] refac: dry single queries --- server/api/db/db.go | 2 +- server/api/db/gen_init_sql.go | 2 +- server/api/db/group.go | 48 +++++++++++++++-------------------- server/api/db/user.go | 38 +++++++++++++-------------- 4 files changed, 42 insertions(+), 48 deletions(-) diff --git a/server/api/db/db.go b/server/api/db/db.go index c3df638..b564228 100644 --- a/server/api/db/db.go +++ b/server/api/db/db.go @@ -23,7 +23,7 @@ func Open() error { } func Init() error { - _, err := database.Exec(InitQuery) + _, err := database.Exec(initQuery) if err != nil { return err } diff --git a/server/api/db/gen_init_sql.go b/server/api/db/gen_init_sql.go index 2e9d7e4..0e3da1b 100644 --- a/server/api/db/gen_init_sql.go +++ b/server/api/db/gen_init_sql.go @@ -11,7 +11,7 @@ import ( var initTemplate = template.Must(template.New("").Parse("// Code generated DO NOT EDIT.\n" + "package db\n" + "\n" + - "const InitQuery = `{{.}}`\n", + "const initQuery = `{{.}}`\n", )) func main() { diff --git a/server/api/db/group.go b/server/api/db/group.go index 9ba69d3..615fa4c 100644 --- a/server/api/db/group.go +++ b/server/api/db/group.go @@ -1,7 +1,6 @@ package db import ( - "database/sql" "fmt" "lishwist/normalize" "strconv" @@ -23,52 +22,47 @@ func (g *Group) MemberIndex(userId string) int { return -1 } -func queryForGroup(query string, args ...any) (*Group, error) { - var group Group - err := database.QueryRow(query, args...).Scan(&group.Id, &group.Name, &group.Reference) - if err == sql.ErrNoRows { - return nil, nil - } else if err != nil { - return nil, err - } - members, err := queryForGroupMembers(group.Id) - if err != nil { - return nil, err - } - group.Members = members - return &group, nil -} - -func queryForGroups(query string, args ...any) ([]Group, error) { +func queryManyGroups(query string, args ...any) ([]Group, error) { groups := []Group{} rows, err := database.Query(query, args...) if err != nil { - return groups, fmt.Errorf("Query failed: %w", err) + return nil, fmt.Errorf("Query failed: %w", err) } defer rows.Close() for rows.Next() { var group Group err := rows.Scan(&group.Id, &group.Name, &group.Reference) if err != nil { - return groups, fmt.Errorf("Failed to scan row: %w", err) + return nil, fmt.Errorf("Failed to scan row: %w", err) } - members, err := queryForGroupMembers(group.Id) + members, err := queryManyGroupMembers(group.Id) if err != nil { - return groups, fmt.Errorf("Failed to query for group members: %w", err) + return nil, fmt.Errorf("Failed to query for group members: %w", err) } group.Members = members groups = append(groups, group) } err = rows.Err() if err != nil { - return groups, fmt.Errorf("Rows error: %w", err) + return nil, fmt.Errorf("Rows error: %w", err) } return groups, nil } -func queryForGroupMembers(groupId string) ([]User, error) { +func queryOneGroup(query string, args ...any) (*Group, error) { + groups, err := queryManyGroups(query, args...) + if err != nil { + return nil, err + } + if len(groups) < 1 { + return nil, nil + } + return &groups[0], nil +} + +func queryManyGroupMembers(groupId string) ([]User, error) { query := "SELECT user.id, user.name, user.display_name, user.reference, user.is_admin, user.is_live FROM v_user AS user JOIN group_member ON group_member.user_id = user.id JOIN [group] ON [group].id = group_member.group_id WHERE [group].id = ? ORDER BY group_member.user_id" - members, err := queryForUsers(query, groupId) + members, err := queryManyUsers(query, groupId) if err != nil { return members, fmt.Errorf("Failed to get members: %w", err) } @@ -77,12 +71,12 @@ func queryForGroupMembers(groupId string) ([]User, error) { func GetGroupByReference(reference string) (*Group, error) { query := "SELECT [group].id, [group].name, [group].reference FROM [group] WHERE [group].reference = ?" - return queryForGroup(query, reference) + return queryOneGroup(query, reference) } func GetAllGroups() ([]Group, error) { query := "SELECT id, name, reference FROM [group];" - return queryForGroups(query) + return queryManyGroups(query) } func CreateGroup(name string, reference string) (*Group, error) { diff --git a/server/api/db/user.go b/server/api/db/user.go index ea40c88..34d2ba8 100644 --- a/server/api/db/user.go +++ b/server/api/db/user.go @@ -30,18 +30,7 @@ type Gift struct { CreatorName string `json:",omitempty"` } -func queryForUser(query string, args ...any) (*User, error) { - var u User - err := database.QueryRow(query, args...).Scan(&u.Id, &u.NormalName, &u.Name, &u.Reference, &u.IsAdmin, &u.IsLive) - if err == sql.ErrNoRows { - return nil, nil - } else if err != nil { - return nil, err - } - return &u, nil -} - -func queryForUsers(query string, args ...any) ([]User, error) { +func queryManyUsers(query string, args ...any) ([]User, error) { rows, err := database.Query(query, args...) if err != nil { return nil, err @@ -63,30 +52,41 @@ func queryForUsers(query string, args ...any) ([]User, error) { return users, nil } +func queryOneUser(query string, args ...any) (*User, error) { + users, err := queryManyUsers(query, args...) + if err != nil { + return nil, err + } + if len(users) < 1 { + return nil, nil + } + return &users[0], nil +} + func GetAllUsers() ([]User, error) { stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM user" - return queryForUsers(stmt) + return queryManyUsers(stmt) } func GetUser(id string) (*User, error) { stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE id = ?" - return queryForUser(stmt, id) + return queryOneUser(stmt, id) } func GetUserByName(username string) (*User, error) { username = normalize.Name(username) stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE name = ?" - return queryForUser(stmt, username) + return queryOneUser(stmt, username) } func GetUserByReference(reference string) (*User, error) { stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE reference = ?" - return queryForUser(stmt, reference) + return queryOneUser(stmt, reference) } func GetAnyUserByReference(reference string) (*User, error) { stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM user WHERE reference = ?" - return queryForUser(stmt, reference) + return queryOneUser(stmt, reference) } func (u *User) SetLive(setting bool) error { @@ -410,10 +410,10 @@ func (u *User) AddGiftToUser(otherUserReference string, giftName string) error { func (u *User) GetGroups() ([]Group, error) { stmt := "SELECT [group].id, [group].name, [group].reference FROM [group] JOIN group_member ON group_member.group_id = [group].id JOIN v_user AS user ON user.id = group_member.user_id WHERE user.id = ?" - return queryForGroups(stmt, u.Id) + return queryManyGroups(stmt, u.Id) } func (u *User) GetGroupByReference(reference string) (*Group, error) { stmt := "SELECT [group].id, [group].name, [group].reference FROM [group] JOIN group_member ON [group].id == group_member.group_id WHERE [group].reference = ? AND group_member.user_id = ?" - return queryForGroup(stmt, reference, u.Id) + return queryOneGroup(stmt, reference, u.Id) } -- 2.40.1