The codebase that powers boop.cat boop.cat
at main 56 lines 1.6 kB view raw
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}