access_token.go

 1// Package database provides database store implementations.
 2package database
 3
 4import (
 5	"context"
 6	"time"
 7
 8	"github.com/charmbracelet/soft-serve/pkg/db"
 9	"github.com/charmbracelet/soft-serve/pkg/db/models"
10	"github.com/charmbracelet/soft-serve/pkg/store"
11)
12
13type accessTokenStore struct{}
14
15var _ store.AccessTokenStore = (*accessTokenStore)(nil)
16
17// CreateAccessToken implements store.AccessTokenStore.
18func (s *accessTokenStore) CreateAccessToken(ctx context.Context, h db.Handler, name string, userID int64, token string, expiresAt time.Time) (models.AccessToken, error) {
19	queryWithoutExpires := `INSERT INTO access_tokens (name, user_id, token, created_at, updated_at)
20	VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id`
21	queryWithExpires := `INSERT INTO access_tokens (name, user_id, token, expires_at, created_at, updated_at)
22	VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id`
23
24	query := queryWithoutExpires
25	values := []interface{}{name, userID, token}
26	if !expiresAt.IsZero() {
27		query = queryWithExpires
28		values = append(values, expiresAt.UTC())
29	}
30
31	var id int64
32	if err := h.GetContext(ctx, &id, h.Rebind(query), values...); err != nil {
33		return models.AccessToken{}, err //nolint:wrapcheck
34	}
35
36	return s.GetAccessToken(ctx, h, id)
37}
38
39// DeleteAccessToken implements store.AccessTokenStore.
40func (*accessTokenStore) DeleteAccessToken(ctx context.Context, h db.Handler, id int64) error {
41	query := h.Rebind(`DELETE FROM access_tokens WHERE id = ?`)
42	_, err := h.ExecContext(ctx, query, id)
43	return err //nolint:wrapcheck
44}
45
46// DeleteAccessTokenForUser implements store.AccessTokenStore.
47func (*accessTokenStore) DeleteAccessTokenForUser(ctx context.Context, h db.Handler, userID int64, id int64) error {
48	query := h.Rebind(`DELETE FROM access_tokens WHERE user_id = ? AND id = ?`)
49	_, err := h.ExecContext(ctx, query, userID, id)
50	return err //nolint:wrapcheck
51}
52
53// GetAccessToken implements store.AccessTokenStore.
54func (*accessTokenStore) GetAccessToken(ctx context.Context, h db.Handler, id int64) (models.AccessToken, error) {
55	query := h.Rebind(`SELECT * FROM access_tokens WHERE id = ?`)
56	var m models.AccessToken
57	err := h.GetContext(ctx, &m, query, id)
58	return m, err //nolint:wrapcheck
59}
60
61// GetAccessTokensByUserID implements store.AccessTokenStore.
62func (*accessTokenStore) GetAccessTokensByUserID(ctx context.Context, h db.Handler, userID int64) ([]models.AccessToken, error) {
63	query := h.Rebind(`SELECT * FROM access_tokens WHERE user_id = ?`)
64	var m []models.AccessToken
65	err := h.SelectContext(ctx, &m, query, userID)
66	return m, err //nolint:wrapcheck
67}
68
69// GetAccessTokenByToken implements store.AccessTokenStore.
70func (*accessTokenStore) GetAccessTokenByToken(ctx context.Context, h db.Handler, token string) (models.AccessToken, error) {
71	query := h.Rebind(`SELECT * FROM access_tokens WHERE token = ?`)
72	var m models.AccessToken
73	err := h.GetContext(ctx, &m, query, token)
74	return m, err //nolint:wrapcheck
75}