From 51c603afe0373f45f8d389c99cac9d3aec959b75 Mon Sep 17 00:00:00 2001 From: bt Date: Sun, 24 May 2026 18:52:58 +0200 Subject: [common] Users and permissions database --- storage/storage.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) (limited to 'storage') diff --git a/storage/storage.go b/storage/storage.go index 1dcea40..28f2564 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -2,7 +2,6 @@ package storage import ( "database/sql" - "fmt" "log" "time" @@ -16,6 +15,12 @@ type Database struct { const initSql = ` CREATE TABLE IF NOT EXISTS messages (id INTEGER NOT NULL PRIMARY KEY, source STRING, target STRING, timestamp INT, content STRING); + + CREATE TABLE IF NOT EXISTS users + (name STRING NOT NULL PRIMARY KEY, pass STRING); + + CREATE TABLE IF NOT EXISTS permissions + (user STRING, channel STRING, read INT, write INT, PRIMARY KEY (user, channel)); ` func InitDb(path string) (*Database, error) { @@ -28,9 +33,7 @@ func InitDb(path string) (*Database, error) { return &Database{db}, nil } -func (db *Database) Write(msg core.Message) (err error) { - fmt.Println(msg.Timestamp) - +func (db *Database) AddMessage(msg core.Message) (err error) { _, err = db.Exec( "INSERT INTO messages (source, target, timestamp, content) VALUES (?, ?, ?, ?);", msg.Source, msg.Target, msg.Timestamp.Unix(), msg.Content, @@ -39,7 +42,7 @@ func (db *Database) Write(msg core.Message) (err error) { return err } -func (db *Database) Read(channel string, since time.Time, num int, offset int) (history []core.Message, err error) { +func (db *Database) GetHistory(channel string, since time.Time, num int, offset int) (history []core.Message, err error) { rows, err := db.Query( `SELECT source, target, timestamp, content FROM messages WHERE target = ? AND timestamp > ? LIMIT ? OFFSET ?`, channel, since.Unix(), num, offset, @@ -70,3 +73,52 @@ func (db *Database) Read(channel string, since time.Time, num int, offset int) ( return history, nil } + +func (db *Database) SetUser(user core.UserData) error { + _, err := db.Exec( + "INSERT OR REPLACE INTO users (name, pass) VALUES (?, ?);", + user.Name, user.Pass, + ) + + return err +} + +func (db *Database) DelUser(name string) error { + _, err := db.Exec("DELETE FROM users WHERE name = ?", name) + return err +} + +func (db *Database) GetUserPass(name string) (string, error) { + var pass string + + err := db.QueryRow("SELECT pass FROM users WHERE name = ?", name).Scan(&pass) + if err != nil { + return "", err + } + + return pass, nil +} + +func (db *Database) SetPermission(perm core.PermissionData) error { + _, err := db.Exec( + "INSERT OR REPLACE INTO permissions (user, channel, read, write) VALUES (?, ?, ?, ?);", + perm.User, perm.Channel, perm.Read, perm.Write, perm.User, perm.Channel, + ) + + return err +} + +func (db *Database) GetPermission(user, channel string) (core.PermissionData, error) { + var perm core.PermissionData + + err := db.QueryRow( + "SELECT (read, write) FROM permissions WHERE user = ? AND channel = ?", user, channel). + Scan(&perm.Read, &perm.Write) + if err != nil { + return core.PermissionData{}, err + } + + perm.User = user + perm.Channel = channel + return perm, nil +} -- cgit v1.2.3