The codebase that powers boop.cat
boop.cat
1// Copyright 2025 boop.cat
2// Licensed under the Apache License, Version 2.0
3// See LICENSE file for details.
4
5package db
6
7import (
8 "database/sql"
9 "time"
10)
11
12type EmailVerification struct {
13 ID string
14 UserID string
15 Token string
16 NewEmail sql.NullString
17 CreatedAt string
18 ExpiresAt int64
19 UsedAt sql.NullString
20}
21
22func CreateVerificationToken(db *sql.DB, id, userID, token string, expiresAt int64) error {
23 _, err := db.Exec(`
24 INSERT INTO emailVerifications (id, userId, token, createdAt, expiresAt)
25 VALUES (?, ?, ?, ?, ?)
26 `, id, userID, token, time.Now().UTC().Format(time.RFC3339), expiresAt)
27 return err
28}
29
30func GetVerificationToken(db *sql.DB, token string) (*EmailVerification, error) {
31 var ev EmailVerification
32 err := db.QueryRow(`
33 SELECT id, userId, token, newEmail, createdAt, expiresAt, usedAt
34 FROM emailVerifications
35 WHERE token = ? AND usedAt IS NULL
36 `, token).Scan(&ev.ID, &ev.UserID, &ev.Token, &ev.NewEmail, &ev.CreatedAt, &ev.ExpiresAt, &ev.UsedAt)
37 if err != nil {
38 return nil, err
39 }
40 return &ev, nil
41}
42
43func MarkTokenUsed(db *sql.DB, id string) error {
44 _, err := db.Exec(`UPDATE emailVerifications SET usedAt = ? WHERE id = ?`, time.Now().UTC().Format(time.RFC3339), id)
45 return err
46}
47
48func UpdateUserEmailVerified(db *sql.DB, userID string) error {
49 _, err := db.Exec(`UPDATE users SET emailVerified = 1 WHERE id = ?`, userID)
50 return err
51}
52
53func UpdateUserPassword(db *sql.DB, userID, passwordHash string) error {
54 _, err := db.Exec(`UPDATE users SET passwordHash = ? WHERE id = ?`, passwordHash, userID)
55 return err
56}