feat: normalized usernames

This commit is contained in:
Teajey 2024-12-18 21:27:59 +09:00
parent 7f284d5003
commit f2e67761ff
Signed by: Teajey
GPG Key ID: 970E790FE834A713
5 changed files with 39 additions and 18 deletions

View File

@ -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
} }

View File

@ -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 {

View File

@ -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,

View File

@ -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
} }

14
server/normalize/name.go Normal file
View File

@ -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)
}