63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
type AliasDB struct{ DB *sql.DB }
|
|
|
|
func OpenAliasDB(path string) (*AliasDB, error) {
|
|
db, err := sql.Open("sqlite", path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, err := db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS aliases (
|
|
alias_email TEXT PRIMARY KEY,
|
|
username TEXT NOT NULL,
|
|
enabled INTEGER NOT NULL DEFAULT 1,
|
|
updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_aliases_username ON aliases(username);
|
|
`); err != nil {
|
|
_ = db.Close()
|
|
return nil, fmt.Errorf("init schema: %w", err)
|
|
}
|
|
return &AliasDB{DB: db}, nil
|
|
}
|
|
|
|
func (a *AliasDB) Close() error { return a.DB.Close() }
|
|
|
|
// Returns username owning alias, ok
|
|
func (a *AliasDB) AliasOwner(aliasEmail string) (string, bool, error) {
|
|
var username string
|
|
var enabled int
|
|
err := a.DB.QueryRow(`SELECT username, enabled FROM aliases WHERE alias_email=?`, aliasEmail).Scan(&username, &enabled)
|
|
if err == sql.ErrNoRows {
|
|
return "", false, nil
|
|
}
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
if enabled != 1 {
|
|
return "", false, nil
|
|
}
|
|
return username, true, nil
|
|
}
|
|
|
|
// Returns true if alias belongs to username
|
|
func (a *AliasDB) AliasBelongsTo(aliasEmail, username string) (bool, error) {
|
|
var enabled int
|
|
err := a.DB.QueryRow(`SELECT enabled FROM aliases WHERE alias_email=? AND username=?`, aliasEmail, username).Scan(&enabled)
|
|
if err == sql.ErrNoRows {
|
|
return false, nil
|
|
}
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return enabled == 1, nil
|
|
}
|