Changes made while flying Tokyo -> Auckland #11
|
|
@ -77,7 +77,7 @@ func Register(username, newPassword, confirmPassword string) *RegisterProps {
|
||||||
|
|
||||||
existingUser, _ := db.GetUserByName(username)
|
existingUser, _ := db.GetUserByName(username)
|
||||||
if existingUser != nil {
|
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"
|
props.Username.Error = "Username is taken"
|
||||||
return props
|
return props
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package db
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"lishwist/normalize"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -66,7 +67,7 @@ func queryForGroups(query string, args ...any) ([]Group, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryForGroupMembers(groupId string) ([]User, 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)
|
members, err := queryForUsers(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)
|
||||||
|
|
@ -85,6 +86,7 @@ func GetAllGroups() ([]Group, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateGroup(name string, reference string) (*Group, error) {
|
func CreateGroup(name string, reference string) (*Group, error) {
|
||||||
|
name = normalize.Name(name)
|
||||||
stmt := "INSERT INTO [group] (name, reference) VALUES (?, ?)"
|
stmt := "INSERT INTO [group] (name, reference) VALUES (?, ?)"
|
||||||
result, err := database.Exec(stmt, name, reference)
|
result, err := database.Exec(stmt, name, reference)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ BEGIN TRANSACTION;
|
||||||
CREATE TABLE IF NOT EXISTS "user" (
|
CREATE TABLE IF NOT EXISTS "user" (
|
||||||
"id" INTEGER NOT NULL UNIQUE,
|
"id" INTEGER NOT NULL UNIQUE,
|
||||||
"name" TEXT NOT NULL UNIQUE,
|
"name" TEXT NOT NULL UNIQUE,
|
||||||
|
"display_name" TEXT NOT NULL UNIQUE,
|
||||||
"reference" TEXT NOT NULL UNIQUE,
|
"reference" TEXT NOT NULL UNIQUE,
|
||||||
"motto" TEXT NOT NULL DEFAULT "",
|
"motto" TEXT NOT NULL DEFAULT "",
|
||||||
"password_hash" TEXT NOT NULL,
|
"password_hash" TEXT NOT NULL,
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,18 @@ package db
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"lishwist/normalize"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
Id string
|
Id string
|
||||||
Name string
|
NormalName string
|
||||||
Reference string
|
Name string
|
||||||
IsAdmin bool
|
Reference string
|
||||||
IsLive bool
|
IsAdmin bool
|
||||||
|
IsLive bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Gift struct {
|
type Gift struct {
|
||||||
|
|
@ -30,7 +32,7 @@ type Gift struct {
|
||||||
|
|
||||||
func queryForUser(query string, args ...any) (*User, error) {
|
func queryForUser(query string, args ...any) (*User, error) {
|
||||||
var u User
|
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 {
|
if err == sql.ErrNoRows {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
|
@ -48,7 +50,7 @@ func queryForUsers(query string, args ...any) ([]User, error) {
|
||||||
users := []User{}
|
users := []User{}
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var u User
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -62,27 +64,28 @@ func queryForUsers(query string, args ...any) ([]User, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAllUsers() ([]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)
|
return queryForUsers(stmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUser(id string) (*User, error) {
|
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)
|
return queryForUser(stmt, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserByName(username string) (*User, error) {
|
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)
|
return queryForUser(stmt, username)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserByReference(reference string) (*User, error) {
|
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)
|
return queryForUser(stmt, reference)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAnyUserByReference(reference string) (*User, error) {
|
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)
|
return queryForUser(stmt, reference)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -96,13 +99,14 @@ func (u *User) SetLive(setting bool) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateUser(username string, passHash []byte) (*User, error) {
|
func CreateUser(name string, passHash []byte) (*User, error) {
|
||||||
stmt := "INSERT INTO user (name, reference, password_hash) VALUES (?, ?, ?)"
|
username := normalize.Name(name)
|
||||||
|
stmt := "INSERT INTO user (name, display_name, reference, password_hash) VALUES (?, ?, ?, ?)"
|
||||||
reference, err := uuid.NewRandom()
|
reference, err := uuid.NewRandom()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result, err := database.Exec(stmt, username, reference, passHash)
|
result, err := database.Exec(stmt, username, name, reference, passHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -112,7 +116,7 @@ func CreateUser(username string, passHash []byte) (*User, error) {
|
||||||
}
|
}
|
||||||
user := User{
|
user := User{
|
||||||
Id: fmt.Sprintf("%d", id),
|
Id: fmt.Sprintf("%d", id),
|
||||||
Name: username,
|
Name: name,
|
||||||
}
|
}
|
||||||
return &user, nil
|
return &user, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue