75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
package userstore
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "embed"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"git.keks.cloud/kekskurse/miniauth/pkg/utils"
|
|
"github.com/google/uuid"
|
|
"github.com/rs/zerolog"
|
|
|
|
_ "github.com/tursodatabase/libsql-client-go/libsql"
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
//go:embed migrations/schema.sql
|
|
var schema string
|
|
|
|
type Config struct {
|
|
SQLite struct {
|
|
Path string `env:"SQLITE_PATH"`
|
|
}
|
|
Logger zerolog.Logger
|
|
}
|
|
|
|
type Store struct {
|
|
log zerolog.Logger
|
|
db *sql.DB
|
|
}
|
|
|
|
func NewStore(c Config) (Store, error) {
|
|
log := c.Logger.With().Str("pkg", "userstore").Str("sqlitePath", c.SQLite.Path).Logger()
|
|
|
|
db, err := sql.Open("libsql", c.SQLite.Path)
|
|
if err != nil {
|
|
return Store{}, utils.WrapError(ErrCantOpenDatabase, err, log)
|
|
}
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
return Store{}, utils.WrapError(ErrCantOpenDatabase, err, log)
|
|
}
|
|
|
|
s := Store{
|
|
db: db,
|
|
log: log,
|
|
}
|
|
|
|
return s, nil
|
|
}
|
|
|
|
func NewDummyStore() (Store, error) {
|
|
name, err := os.MkdirTemp("", "miniauth-teststore")
|
|
if err != nil {
|
|
return Store{}, err
|
|
}
|
|
|
|
c := Config{}
|
|
c.SQLite.Path = fmt.Sprintf("file://%v/%v.sqlite", name, uuid.NewString())
|
|
|
|
store, err := NewStore(c)
|
|
if err != nil {
|
|
return Store{}, err
|
|
}
|
|
|
|
newSchema := strings.Replace(schema, "CREATE TABLE sqlite_sequence(name,seq);", "", 1)
|
|
_, err = store.db.Exec(newSchema)
|
|
if err != nil {
|
|
return Store{}, err
|
|
}
|
|
|
|
return store, nil
|
|
}
|