a geicko-2 based round robin ranking system designed to test c++ battleship submissions battleship.dunkirk.sh
at main 2.9 kB view raw
1package storage 2 3import ( 4 "database/sql" 5 "strings" 6 "time" 7) 8 9type User struct { 10 ID int 11 Username string 12 Name string 13 Bio string 14 Link string 15 PublicKey string 16 CreatedAt time.Time 17 LastLoginAt time.Time 18} 19 20func GetUserByUsername(username string) (*User, error) { 21 var u User 22 var lastLogin sql.NullTime 23 err := DB.QueryRow( 24 `SELECT id, username, name, bio, link, public_key, created_at, last_login_at 25 FROM users WHERE username = ?`, 26 username, 27 ).Scan(&u.ID, &u.Username, &u.Name, &u.Bio, &u.Link, &u.PublicKey, &u.CreatedAt, &lastLogin) 28 29 if err == sql.ErrNoRows { 30 return nil, nil 31 } 32 if err != nil { 33 return nil, err 34 } 35 36 if lastLogin.Valid { 37 u.LastLoginAt = lastLogin.Time 38 } 39 40 return &u, nil 41} 42 43func GetUserByPublicKey(publicKey string) (*User, error) { 44 publicKey = strings.TrimSpace(publicKey) 45 46 var u User 47 var lastLogin sql.NullTime 48 err := DB.QueryRow( 49 `SELECT id, username, name, bio, link, public_key, created_at, last_login_at 50 FROM users WHERE TRIM(public_key) = ?`, 51 publicKey, 52 ).Scan(&u.ID, &u.Username, &u.Name, &u.Bio, &u.Link, &u.PublicKey, &u.CreatedAt, &lastLogin) 53 54 if err == sql.ErrNoRows { 55 return nil, nil 56 } 57 if err != nil { 58 return nil, err 59 } 60 61 if lastLogin.Valid { 62 u.LastLoginAt = lastLogin.Time 63 } 64 65 return &u, nil 66} 67 68func CreateUser(username, name, bio, link, publicKey string) (*User, error) { 69 result, err := DB.Exec( 70 `INSERT INTO users (username, name, bio, link, public_key, created_at, last_login_at) 71 VALUES (?, ?, ?, ?, ?, ?, ?)`, 72 username, name, bio, link, publicKey, time.Now(), time.Now(), 73 ) 74 if err != nil { 75 return nil, err 76 } 77 78 id, _ := result.LastInsertId() 79 return &User{ 80 ID: int(id), 81 Username: username, 82 Name: name, 83 Bio: bio, 84 Link: link, 85 PublicKey: publicKey, 86 CreatedAt: time.Now(), 87 LastLoginAt: time.Now(), 88 }, nil 89} 90 91func UpdateUserLastLogin(username string) error { 92 _, err := DB.Exec( 93 "UPDATE users SET last_login_at = ? WHERE username = ?", 94 time.Now(), username, 95 ) 96 return err 97} 98 99func UpdateUserProfile(username, name, bio, link string) error { 100 _, err := DB.Exec( 101 "UPDATE users SET name = ?, bio = ?, link = ? WHERE username = ?", 102 name, bio, link, username, 103 ) 104 return err 105} 106 107func GetAllUsers() ([]User, error) { 108 rows, err := DB.Query( 109 `SELECT id, username, name, bio, link, public_key, created_at, last_login_at 110 FROM users ORDER BY created_at DESC`, 111 ) 112 if err != nil { 113 return nil, err 114 } 115 defer rows.Close() 116 117 var users []User 118 for rows.Next() { 119 var u User 120 var lastLogin sql.NullTime 121 err := rows.Scan(&u.ID, &u.Username, &u.Name, &u.Bio, &u.Link, &u.PublicKey, &u.CreatedAt, &lastLogin) 122 if err != nil { 123 return nil, err 124 } 125 if lastLogin.Valid { 126 u.LastLoginAt = lastLogin.Time 127 } 128 users = append(users, u) 129 } 130 131 return users, rows.Err() 132}