Changes made while flying Tokyo -> Auckland #11

Merged
Teajey merged 5 commits from tokyo-wellington-changes into main 2024-12-27 22:40:30 +13:00
4 changed files with 42 additions and 48 deletions
Showing only changes of commit fefc4ac3db - Show all commits

View File

@ -23,7 +23,7 @@ func Open() error {
} }
func Init() error { func Init() error {
_, err := database.Exec(InitQuery) _, err := database.Exec(initQuery)
if err != nil { if err != nil {
return err return err
} }

View File

@ -11,7 +11,7 @@ import (
var initTemplate = template.Must(template.New("").Parse("// Code generated DO NOT EDIT.\n" + var initTemplate = template.Must(template.New("").Parse("// Code generated DO NOT EDIT.\n" +
"package db\n" + "package db\n" +
"\n" + "\n" +
"const InitQuery = `{{.}}`\n", "const initQuery = `{{.}}`\n",
)) ))
func main() { func main() {

View File

@ -1,7 +1,6 @@
package db package db
import ( import (
"database/sql"
"fmt" "fmt"
"lishwist/normalize" "lishwist/normalize"
"strconv" "strconv"
@ -23,52 +22,47 @@ func (g *Group) MemberIndex(userId string) int {
return -1 return -1
} }
func queryForGroup(query string, args ...any) (*Group, error) { func queryManyGroups(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) {
groups := []Group{} groups := []Group{}
rows, err := database.Query(query, args...) rows, err := database.Query(query, args...)
if err != nil { if err != nil {
return groups, fmt.Errorf("Query failed: %w", err) return nil, fmt.Errorf("Query failed: %w", err)
} }
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
var group Group var group Group
err := rows.Scan(&group.Id, &group.Name, &group.Reference) err := rows.Scan(&group.Id, &group.Name, &group.Reference)
if err != nil { 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 { 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 group.Members = members
groups = append(groups, group) groups = append(groups, group)
} }
err = rows.Err() err = rows.Err()
if err != nil { if err != nil {
return groups, fmt.Errorf("Rows error: %w", err) return nil, fmt.Errorf("Rows error: %w", err)
} }
return groups, nil 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" 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 { if err != nil {
return members, fmt.Errorf("Failed to get members: %w", err) 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) { func GetGroupByReference(reference string) (*Group, error) {
query := "SELECT [group].id, [group].name, [group].reference FROM [group] WHERE [group].reference = ?" 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) { func GetAllGroups() ([]Group, error) {
query := "SELECT id, name, reference FROM [group];" query := "SELECT id, name, reference FROM [group];"
return queryForGroups(query) return queryManyGroups(query)
} }
func CreateGroup(name string, reference string) (*Group, error) { func CreateGroup(name string, reference string) (*Group, error) {

View File

@ -30,18 +30,7 @@ type Gift struct {
CreatorName string `json:",omitempty"` CreatorName string `json:",omitempty"`
} }
func queryForUser(query string, args ...any) (*User, error) { func queryManyUsers(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) {
rows, err := database.Query(query, args...) rows, err := database.Query(query, args...)
if err != nil { if err != nil {
return nil, err return nil, err
@ -63,30 +52,41 @@ func queryForUsers(query string, args ...any) ([]User, error) {
return users, nil 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) { func GetAllUsers() ([]User, error) {
stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM user" 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) { func GetUser(id string) (*User, error) {
stmt := "SELECT id, name, display_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) return queryOneUser(stmt, id)
} }
func GetUserByName(username string) (*User, error) { func GetUserByName(username string) (*User, error) {
username = normalize.Name(username) username = normalize.Name(username)
stmt := "SELECT id, name, display_name, reference, is_admin, is_live FROM v_user WHERE name = ?" 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) { func GetUserByReference(reference string) (*User, error) {
stmt := "SELECT id, name, display_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) return queryOneUser(stmt, reference)
} }
func GetAnyUserByReference(reference string) (*User, error) { func GetAnyUserByReference(reference string) (*User, error) {
stmt := "SELECT id, name, display_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) return queryOneUser(stmt, reference)
} }
func (u *User) SetLive(setting bool) error { 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) { 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 = ?" 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) { 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 = ?" 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)
} }