2021-03-31 09:29:36 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
package sqlite
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"database/sql"
|
|
|
|
"fmt"
|
|
|
|
|
2021-05-31 12:50:44 +00:00
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/v2/roomdb"
|
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/v2/roomdb/sqlite/models"
|
2021-03-31 13:58:42 +00:00
|
|
|
"github.com/volatiletech/sqlboiler/v4/boil"
|
2021-03-31 09:29:36 +00:00
|
|
|
)
|
|
|
|
|
2021-03-31 13:58:42 +00:00
|
|
|
var _ roomdb.RoomConfig = (*Config)(nil)
|
2021-03-31 09:29:36 +00:00
|
|
|
|
|
|
|
// the database will only ever store one row, which contains all the room settings
|
|
|
|
const configRowID = 0
|
|
|
|
|
|
|
|
/* Config basically enables long-term memory for the server when it comes to storing settings. Currently, the only
|
|
|
|
* stored settings is the privacy mode of the room.
|
2021-03-31 13:58:42 +00:00
|
|
|
*/
|
2021-03-31 09:29:36 +00:00
|
|
|
type Config struct {
|
|
|
|
db *sql.DB
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c Config) GetPrivacyMode(ctx context.Context) (roomdb.PrivacyMode, error) {
|
|
|
|
config, err := models.FindConfig(ctx, c.db, configRowID)
|
|
|
|
if err != nil {
|
|
|
|
return roomdb.ModeUnknown, err
|
|
|
|
}
|
|
|
|
|
2021-04-06 14:20:17 +00:00
|
|
|
return config.PrivacyMode, nil
|
2021-03-31 09:29:36 +00:00
|
|
|
}
|
2021-03-31 13:58:42 +00:00
|
|
|
|
|
|
|
func (c Config) SetPrivacyMode(ctx context.Context, pm roomdb.PrivacyMode) error {
|
|
|
|
// make sure the privacy mode is an ok value
|
|
|
|
err := pm.IsValid()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = transact(c.db, func(tx *sql.Tx) error {
|
|
|
|
// get the settings row
|
|
|
|
config, err := models.FindConfig(ctx, tx, configRowID)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// set the new privacy mode
|
2021-04-06 14:20:17 +00:00
|
|
|
config.PrivacyMode = pm
|
2021-03-31 13:58:42 +00:00
|
|
|
// issue update stmt
|
|
|
|
rowsAffected, err := config.Update(ctx, tx, boil.Infer())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if rowsAffected == 0 {
|
|
|
|
return fmt.Errorf("setting privacy mode should have update the settings row, instead 0 rows were updated")
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil // alles gut!!
|
|
|
|
}
|
2021-04-16 12:33:31 +00:00
|
|
|
|
|
|
|
func (c Config) GetDefaultLanguage(ctx context.Context) (string, error) {
|
|
|
|
config, err := models.FindConfig(ctx, c.db, configRowID)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return config.DefaultLanguage, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c Config) SetDefaultLanguage(ctx context.Context, langTag string) error {
|
|
|
|
if len(langTag) == 0 {
|
|
|
|
return fmt.Errorf("language tag cannot be empty")
|
|
|
|
}
|
|
|
|
|
|
|
|
err := transact(c.db, func(tx *sql.Tx) error {
|
|
|
|
// get the settings row
|
|
|
|
config, err := models.FindConfig(ctx, tx, configRowID)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// set the new language tag
|
|
|
|
config.DefaultLanguage = langTag
|
|
|
|
// issue update stmt
|
|
|
|
rowsAffected, err := config.Update(ctx, tx, boil.Infer())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if rowsAffected == 0 {
|
|
|
|
return fmt.Errorf("setting default language should have update the settings row, instead 0 rows were updated")
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil // alles gut!!
|
|
|
|
}
|