sqlite.go

 1package sqlite
 2
 3import (
 4	"context"
 5
 6	"github.com/charmbracelet/soft-serve/server/access"
 7	"github.com/charmbracelet/soft-serve/server/db"
 8	"github.com/charmbracelet/soft-serve/server/db/sqlite"
 9	"github.com/charmbracelet/soft-serve/server/settings"
10	"github.com/jmoiron/sqlx"
11)
12
13func init() {
14	settings.Register("sqlite", newSettings)
15}
16
17// SqliteSettings is a SQLite settings store.
18type SqliteSettings struct {
19	db  db.Database
20	ctx context.Context
21}
22
23func newSettings(ctx context.Context) (settings.Settings, error) {
24	sdb := db.FromContext(ctx)
25	if sdb == nil {
26		return nil, db.ErrNoDatabase
27	}
28
29	return &SqliteSettings{
30		db:  sdb,
31		ctx: ctx,
32	}, nil
33}
34
35// AllowKeyless returns whether or not keyless access is allowed.
36//
37// It implements backend.Backend.
38func (d *SqliteSettings) AllowKeyless(ctx context.Context) bool {
39	var allow bool
40	if err := sqlite.WrapTx(d.db.DBx(), ctx, func(tx *sqlx.Tx) error {
41		return tx.Get(&allow, "SELECT value FROM settings WHERE key = ?;", "allow_keyless")
42	}); err != nil {
43		return false
44	}
45
46	return allow
47}
48
49// AnonAccess returns the level of anonymous access.
50//
51// It implements backend.Backend.
52func (d *SqliteSettings) AnonAccess(ctx context.Context) access.AccessLevel {
53	var level string
54	if err := sqlite.WrapTx(d.db.DBx(), ctx, func(tx *sqlx.Tx) error {
55		return tx.Get(&level, "SELECT value FROM settings WHERE key = ?;", "anon_access")
56	}); err != nil {
57		return access.NoAccess
58	}
59
60	return access.ParseAccessLevel(level)
61}
62
63// SetAllowKeyless sets whether or not keyless access is allowed.
64//
65// It implements backend.Backend.
66func (d *SqliteSettings) SetAllowKeyless(ctx context.Context, allow bool) error {
67	return sqlite.WrapDbErr(
68		sqlite.WrapTx(d.db.DBx(), ctx, func(tx *sqlx.Tx) error {
69			_, err := tx.Exec("UPDATE settings SET value = ?, updated_at = CURRENT_TIMESTAMP WHERE key = ?;", allow, "allow_keyless")
70			return err
71		}),
72	)
73}
74
75// SetAnonAccess sets the level of anonymous access.
76//
77// It implements backend.Backend.
78func (d *SqliteSettings) SetAnonAccess(ctx context.Context, level access.AccessLevel) error {
79	return sqlite.WrapDbErr(
80		sqlite.WrapTx(d.db.DBx(), ctx, func(tx *sqlx.Tx) error {
81			_, err := tx.Exec("UPDATE settings SET value = ?, updated_at = CURRENT_TIMESTAMP WHERE key = ?;", level.String(), "anon_access")
82			return err
83		}),
84	)
85}