handle.go

 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}