1package database
2
3import (
4 "context"
5 "strings"
6
7 "github.com/charmbracelet/soft-serve/pkg/db"
8 "github.com/charmbracelet/soft-serve/pkg/db/models"
9 "github.com/charmbracelet/soft-serve/pkg/store"
10 "github.com/charmbracelet/soft-serve/pkg/utils"
11 "github.com/jmoiron/sqlx"
12)
13
14type handleStore struct{}
15
16var _ store.HandleStore = &handleStore{}
17
18// CreateHandle implements store.HandleStore.
19func (*handleStore) CreateHandle(ctx context.Context, h db.Handler, handle string) (int64, error) {
20 handle = strings.ToLower(handle)
21 if err := utils.ValidateHandle(handle); err != nil {
22 return 0, err
23 }
24
25 var id int64
26 query := h.Rebind("INSERT INTO handles (handle, updated_at) VALUES (?, CURRENT_TIMESTAMP) RETURNING id;")
27 err := h.GetContext(ctx, &id, query, handle)
28 return id, db.WrapError(err)
29}
30
31// DeleteHandle implements store.HandleStore.
32func (*handleStore) DeleteHandle(ctx context.Context, h db.Handler, id int64) error {
33 query := h.Rebind("DELETE FROM handles WHERE id = ?;")
34 _, err := h.ExecContext(ctx, query, id)
35 return db.WrapError(err)
36}
37
38// GetHandleByHandle implements store.HandleStore.
39func (*handleStore) GetHandleByHandle(ctx context.Context, h db.Handler, handle string) (models.Handle, error) {
40 var hl models.Handle
41 query := h.Rebind("SELECT * FROM handles WHERE handle = ?;")
42 err := h.GetContext(ctx, &hl, query, handle)
43 return hl, db.WrapError(err)
44}
45
46// GetHandleByID implements store.HandleStore.
47func (*handleStore) GetHandleByID(ctx context.Context, h db.Handler, id int64) (models.Handle, error) {
48 var hl models.Handle
49 query := h.Rebind("SELECT * FROM handles WHERE id = ?;")
50 err := h.GetContext(ctx, &hl, query, id)
51 return hl, db.WrapError(err)
52}
53
54// GetHandleByUserID implements store.HandleStore.
55func (*handleStore) GetHandleByUserID(ctx context.Context, h db.Handler, userID int64) (models.Handle, error) {
56 var hl models.Handle
57 query := h.Rebind("SELECT * FROM handles WHERE id = (SELECT handle_id FROM users WHERE id = ?);")
58 err := h.GetContext(ctx, &hl, query, userID)
59 return hl, db.WrapError(err)
60}
61
62// UpdateHandle implements store.HandleStore.
63func (*handleStore) UpdateHandle(ctx context.Context, h db.Handler, id int64, handle string) error {
64 handle = strings.ToLower(handle)
65 if err := utils.ValidateHandle(handle); err != nil {
66 return err
67 }
68 query := h.Rebind("UPDATE handles SET handle = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?;")
69 _, err := h.ExecContext(ctx, query, handle, id)
70 return db.WrapError(err)
71}
72
73// ListHandlesForIDs implements store.HandleStore.
74func (*handleStore) ListHandlesForIDs(ctx context.Context, h db.Handler, ids []int64) ([]models.Handle, error) {
75 var hls []models.Handle
76 if len(ids) == 0 {
77 return hls, nil
78 }
79
80 query, args, err := sqlx.In("SELECT * FROM handles WHERE id IN (?)", ids)
81 if err != nil {
82 return nil, db.WrapError(err)
83 }
84
85 query = h.Rebind(query)
86 err = h.SelectContext(ctx, &hls, query, args...)
87 return hls, db.WrapError(err)
88}