bring back yahoo pipes!
1package store
2
3import (
4 "database/sql"
5 "fmt"
6 "time"
7
8 "github.com/google/uuid"
9)
10
11type User struct {
12 ID string
13 IndikoSub string
14 Username string
15 Name string
16 Email string
17 Photo string
18 URL string
19 Role string
20 CreatedAt int64
21 UpdatedAt int64
22}
23
24type Session struct {
25 ID string
26 UserID string
27 AccessToken string
28 RefreshToken string
29 ExpiresAt int64
30 CreatedAt int64
31}
32
33func (db *DB) CreateUser(indikoSub, username, name, email, photo, url string) (*User, error) {
34 now := time.Now().Unix()
35 user := &User{
36 ID: uuid.New().String(),
37 IndikoSub: indikoSub,
38 Username: username,
39 Name: name,
40 Email: email,
41 Photo: photo,
42 URL: url,
43 Role: "user",
44 CreatedAt: now,
45 UpdatedAt: now,
46 }
47
48 _, err := db.Exec(`
49 INSERT INTO users (id, indiko_sub, username, name, email, photo, url, role, created_at, updated_at)
50 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
51 `, user.ID, user.IndikoSub, user.Username, user.Name, user.Email, user.Photo, user.URL, user.Role, user.CreatedAt, user.UpdatedAt)
52
53 if err != nil {
54 return nil, fmt.Errorf("insert user: %w", err)
55 }
56
57 return user, nil
58}
59
60func (db *DB) GetUserByIndikoSub(indikoSub string) (*User, error) {
61 user := &User{}
62 err := db.QueryRow(`
63 SELECT id, indiko_sub, username, name, email, photo, url, role, created_at, updated_at
64 FROM users
65 WHERE indiko_sub = ?
66 `, indikoSub).Scan(&user.ID, &user.IndikoSub, &user.Username, &user.Name, &user.Email, &user.Photo, &user.URL, &user.Role, &user.CreatedAt, &user.UpdatedAt)
67
68 if err == sql.ErrNoRows {
69 return nil, nil
70 }
71
72 if err != nil {
73 return nil, fmt.Errorf("query user: %w", err)
74 }
75
76 return user, nil
77}
78
79func (db *DB) GetUserByID(id string) (*User, error) {
80 user := &User{}
81 err := db.QueryRow(`
82 SELECT id, indiko_sub, username, name, email, photo, url, role, created_at, updated_at
83 FROM users
84 WHERE id = ?
85 `, id).Scan(&user.ID, &user.IndikoSub, &user.Username, &user.Name, &user.Email, &user.Photo, &user.URL, &user.Role, &user.CreatedAt, &user.UpdatedAt)
86
87 if err == sql.ErrNoRows {
88 return nil, nil
89 }
90
91 if err != nil {
92 return nil, fmt.Errorf("query user: %w", err)
93 }
94
95 return user, nil
96}
97
98func (db *DB) UpdateUser(user *User) error {
99 user.UpdatedAt = time.Now().Unix()
100
101 _, err := db.Exec(`
102 UPDATE users
103 SET username = ?, name = ?, email = ?, photo = ?, url = ?, updated_at = ?
104 WHERE id = ?
105 `, user.Username, user.Name, user.Email, user.Photo, user.URL, user.UpdatedAt, user.ID)
106
107 if err != nil {
108 return fmt.Errorf("update user: %w", err)
109 }
110
111 return nil
112}
113
114func (db *DB) CreateSession(userID, accessToken, refreshToken string, expiresAt int64) (*Session, error) {
115 session := &Session{
116 ID: uuid.New().String(),
117 UserID: userID,
118 AccessToken: accessToken,
119 RefreshToken: refreshToken,
120 ExpiresAt: expiresAt,
121 CreatedAt: time.Now().Unix(),
122 }
123
124 _, err := db.Exec(`
125 INSERT INTO sessions (id, user_id, access_token, refresh_token, expires_at, created_at)
126 VALUES (?, ?, ?, ?, ?, ?)
127 `, session.ID, session.UserID, session.AccessToken, session.RefreshToken, session.ExpiresAt, session.CreatedAt)
128
129 if err != nil {
130 return nil, fmt.Errorf("insert session: %w", err)
131 }
132
133 return session, nil
134}
135
136func (db *DB) GetSessionByID(id string) (*Session, error) {
137 session := &Session{}
138 err := db.QueryRow(`
139 SELECT id, user_id, access_token, refresh_token, expires_at, created_at
140 FROM sessions
141 WHERE id = ?
142 `, id).Scan(&session.ID, &session.UserID, &session.AccessToken, &session.RefreshToken, &session.ExpiresAt, &session.CreatedAt)
143
144 if err == sql.ErrNoRows {
145 return nil, nil
146 }
147
148 if err != nil {
149 return nil, fmt.Errorf("query session: %w", err)
150 }
151
152 return session, nil
153}
154
155func (db *DB) DeleteSession(id string) error {
156 _, err := db.Exec("DELETE FROM sessions WHERE id = ?", id)
157 if err != nil {
158 return fmt.Errorf("delete session: %w", err)
159 }
160 return nil
161}
162
163func (db *DB) DeleteExpiredSessions() error {
164 now := time.Now().Unix()
165 _, err := db.Exec("DELETE FROM sessions WHERE expires_at < ?", now)
166 if err != nil {
167 return fmt.Errorf("delete expired sessions: %w", err)
168 }
169 return nil
170}