main pico / pkg / db / postgres / tokens.go
Antonio Mika  ·  2026-10-10
 1package postgres
 2
 3import (
 4	"github.com/picosh/pico/pkg/db"
 5)
 6
 7func (me *PsqlDB) FindUserByToken(token string) (*db.User, error) {
 8	user := &db.User{}
 9	err := me.Db.Get(user, `
10	SELECT app_users.id, app_users.name, app_users.created_at
11	FROM app_users
12	LEFT JOIN tokens ON tokens.user_id = app_users.id
13	WHERE tokens.token = $1 AND tokens.expires_at > NOW()`, token)
14	if err != nil {
15		return nil, err
16	}
17	return user, nil
18}
19
20func (me *PsqlDB) InsertToken(userID, name string) (string, error) {
21	var token string
22	err := me.Db.QueryRow(`INSERT INTO tokens (user_id, name) VALUES($1, $2) RETURNING token;`, userID, name).Scan(&token)
23	if err != nil {
24		return "", err
25	}
26	return token, nil
27}
28
29func (me *PsqlDB) UpsertToken(userID, name string) (string, error) {
30	token, _ := me.findTokenByName(userID, name)
31	if token != "" {
32		return token, nil
33	}
34
35	token, err := me.InsertToken(userID, name)
36	return token, err
37}
38
39func (me *PsqlDB) findTokenByName(userID, name string) (string, error) {
40	var token string
41	err := me.Db.QueryRow(`SELECT token FROM tokens WHERE user_id = $1 AND name = $2`, userID, name).Scan(&token)
42	if err != nil {
43		return "", err
44	}
45	return token, nil
46}
47
48func (me *PsqlDB) RemoveToken(tokenID string) error {
49	_, err := me.Db.Exec(`DELETE FROM tokens WHERE id = $1`, tokenID)
50	return err
51}
52
53func (me *PsqlDB) FindTokensByUser(userID string) ([]*db.Token, error) {
54	var tokens []*db.Token
55	err := me.Db.Select(&tokens, `SELECT * FROM tokens WHERE user_id = $1`, userID)
56	if err != nil {
57		return nil, err
58	}
59	return tokens, nil
60}