a geicko-2 based round robin ranking system designed to test c++ battleship submissions
battleship.dunkirk.sh
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}