refac: dry single queries
This commit is contained in:
parent
c8d179e297
commit
fefc4ac3db
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue