package db
import (
"database/sql"
"log"
"git.sr.ht/~evanj/security"
_ "github.com/mattn/go-sqlite3"
)
const (
perPage = 25
)
type DB struct {
*sql.DB
log *log.Logger
sec securer
}
type securer interface {
TokenCreate(val security.TokenMap) (string, error)
TokenFrom(tokenString string) (security.TokenMap, error)
HashCreate(salt, pass string) (string, error)
HashCompare(salt, pass, hash string) error
}
func New(log *log.Logger, typ, creds string, sec securer) (*DB, error) {
conn, err := sql.Open(typ, creds)
if err != nil {
return nil, err
}
db := &DB{
conn,
log,
sec,
}
return db, nil
}
func (db *DB) EnsureSetup() error {
var _ interface{}
// user
_, _ = db.Exec(`
CREATE TABLE cms_user (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT UNIQUE NOT NULL,
HASH TEXT NOT NULL
);
`)
// space
_, _ = db.Exec(`
CREATE TABLE cms_space (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT NOT NULL,
DESC TEXT NOT NULL
);
`)
// user to space
_, _ = db.Exec(`
CREATE TABLE cms_user_to_space (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
USER_ID INTEGER,
SPACE_ID INTEGER,
FOREIGN KEY(USER_ID) REFERENCES cms_user(ID),
FOREIGN KEY(SPACE_ID) REFERENCES cms_space(ID)
);
`)
return nil
}