Improve Store

Still need to fill out SQLite bootstrap

Also setup plug-in system mechanism
This commit is contained in:
Dan Jones 2024-09-14 20:37:51 -05:00
commit e7b88bcc09
10 changed files with 154 additions and 6 deletions

34
store/factory.go Normal file
View file

@ -0,0 +1,34 @@
package store
import (
"errors"
"fmt"
"codeberg.org/danjones000/lenore/config"
)
var ErrNoFactory = errors.New("unknown factory")
type StoreFactory func(config.Config) (Store, error)
var factories map[string]StoreFactory
func init() {
factories = make(map[string]StoreFactory)
}
func AddFactory(name string, f StoreFactory) {
factories[name] = f
}
func GetFactory(name string) StoreFactory {
return factories[name]
}
func MakeStore(name string, conf config.Config) (Store, error) {
f, ok := factories[name]
if !ok {
return nil, fmt.Errorf("%w: %s", ErrNoFactory, name)
}
return f(conf)
}

47
store/factory_test.go Normal file
View file

@ -0,0 +1,47 @@
package store
import (
"testing"
"codeberg.org/danjones000/lenore/config"
"codeberg.org/danjones000/lenore/internal/testmocks"
"github.com/stretchr/testify/assert"
)
var f StoreFactory = func(config.Config) (Store, error) {
return testmocks.GetStore(), nil
}
func TestAddFactory(t *testing.T) {
AddFactory("mock", f)
defer delete(factories, "mock")
_, ok := factories["mock"]
assert.True(t, ok)
}
func TestGetFactoryNil(t *testing.T) {
f := GetFactory("mock")
assert.Nil(t, f)
}
func TestGetFactoryNotNil(t *testing.T) {
AddFactory("mock", f)
defer delete(factories, "mock")
f := GetFactory("mock")
assert.NotNil(t, f)
}
func TestMakeStoreError(t *testing.T) {
s, e := MakeStore("mock", config.Config{})
assert.Nil(t, s)
assert.ErrorIs(t, e, ErrNoFactory)
assert.ErrorContains(t, e, ErrNoFactory.Error()+": mock")
}
func TestMakeStoreNoError(t *testing.T) {
AddFactory("mock", f)
defer delete(factories, "mock")
s, e := MakeStore("mock", config.Config{})
assert.NotNil(t, s)
assert.NoError(t, e)
}

29
store/sqlite/repo.go Normal file
View file

@ -0,0 +1,29 @@
package sqlite
import (
"codeberg.org/danjones000/lenore/config"
"codeberg.org/danjones000/lenore/store"
"github.com/go-ap/storage-sqlite"
)
func init() {
store.AddFactory("sqlite", MakeStore)
}
func MakeStore(conf config.Config) (store.Store, error) {
sqlConf := sqlite.Config{Path: conf.Conn.DSN}
db, err := sqlite.New(sqlConf)
if err != nil {
return nil, err
}
return Repo{db}, nil
}
type Repo struct {
store.PartStore
}
func (r Repo) Bootstrap(config.Config) error {
// @todo
return nil
}

View file

@ -1,6 +1,7 @@
package store
import (
"codeberg.org/danjones000/lenore/config"
st "github.com/go-ap/fedbox/storage"
proc "github.com/go-ap/processing"
"github.com/openshift/osin"
@ -21,7 +22,19 @@ type ClientLister interface {
GetClient(id string) (osin.Client, error)
}
type Bootstrapper interface {
// Bootstrap should initialize the data store so that it can be used.
// This will be called every time the application starts, so it MUST be idempotent and doesn't delete existing data.
// An option is to run migrations in this method.
Bootstrap(config.Config) error
}
type Store interface {
Bootstrapper
PartStore
}
type PartStore interface {
ClientSaver
ClientLister
proc.Store