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}