visedriver/request/base.go

114 lines
3.0 KiB
Go
Raw Normal View History

2025-01-13 11:31:42 +01:00
package request
import (
2025-01-19 10:04:37 +01:00
"context"
"git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/visedriver/entry"
2025-01-21 16:28:55 +01:00
"git.grassecon.net/grassrootseconomics/visedriver/errors"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
2025-02-04 14:08:08 +01:00
type EngineFunc func(engine.Config, resource.Resource, *persist.Persister) engine.Engine
type BaseRequestHandler struct {
cfgTemplate engine.Config
2025-01-21 16:28:55 +01:00
rp RequestParser
rs resource.Resource
hn entry.EntryHandler
provider storage.StorageProvider
2025-02-04 14:08:08 +01:00
engineFunc EngineFunc
}
2025-01-13 11:31:42 +01:00
func NewBaseRequestHandler(cfg engine.Config, rs resource.Resource, stateDb db.Db, userdataDb db.Db, rp RequestParser, hn entry.EntryHandler) *BaseRequestHandler {
2025-02-04 14:08:08 +01:00
h := &BaseRequestHandler{
cfgTemplate: cfg,
rs: rs,
hn: hn,
rp: rp,
provider: storage.NewSimpleStorageProvider(stateDb, userdataDb),
}
2025-02-04 14:08:08 +01:00
h.engineFunc = h.getDefaultEngine
return h
}
func (f *BaseRequestHandler) WithEngineFunc(fn EngineFunc) *BaseRequestHandler {
f.engineFunc = fn
return f
}
2025-01-19 10:04:37 +01:00
func (f *BaseRequestHandler) Shutdown(ctx context.Context) {
err := f.provider.Close(ctx)
if err != nil {
logg.Errorf("handler shutdown error", "err", err)
}
}
func (f *BaseRequestHandler) GetEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
2025-02-04 14:08:08 +01:00
return f.engineFunc(cfg, rs, pr)
}
func (f *BaseRequestHandler) getDefaultEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
en := engine.NewEngine(cfg, rs)
en = en.WithPersister(pr)
2025-02-04 14:08:08 +01:00
en = en.WithFirst(f.hn.Init)
if f.cfgTemplate.EngineDebug {
en = en.WithDebug(nil)
}
return en
}
2025-01-21 16:28:55 +01:00
func (f *BaseRequestHandler) Process(rqs RequestSession) (RequestSession, error) {
var r bool
var err error
2024-09-23 18:35:17 +02:00
logg.InfoCtxf(rqs.Ctx, "new request", "data", rqs)
rqs.Storage, err = f.provider.Get(rqs.Ctx, rqs.Config.SessionId)
if err != nil {
logg.ErrorCtxf(rqs.Ctx, "", "storage get error", err)
2025-01-05 12:17:58 +01:00
return rqs, errors.ErrStorage
}
f.hn.SetPersister(rqs.Storage.Persister)
defer func() {
f.hn.Exit()
}()
2025-02-04 14:08:08 +01:00
rqs.Engine = f.GetEngine(rqs.Config, f.rs, rqs.Storage.Persister)
2024-09-20 12:13:20 +02:00
r, err = rqs.Engine.Exec(rqs.Ctx, rqs.Input)
if err != nil {
perr := f.provider.Put(rqs.Ctx, rqs.Config.SessionId, rqs.Storage)
rqs.Storage = nil
if perr != nil {
logg.ErrorCtxf(rqs.Ctx, "", "storage put error", perr)
}
return rqs, err
}
rqs.Continue = r
return rqs, nil
}
2025-01-21 16:28:55 +01:00
func (f *BaseRequestHandler) Output(rqs RequestSession) (RequestSession, error) {
var err error
2024-09-20 21:15:24 +02:00
_, err = rqs.Engine.Flush(rqs.Ctx, rqs.Writer)
return rqs, err
}
2025-01-21 16:28:55 +01:00
func (f *BaseRequestHandler) Reset(ctx context.Context, rqs RequestSession) (RequestSession, error) {
defer f.provider.Put(ctx, rqs.Config.SessionId, rqs.Storage)
2025-01-19 10:04:37 +01:00
return rqs, rqs.Engine.Finish(ctx)
}
func (f *BaseRequestHandler) GetConfig() engine.Config {
return f.cfgTemplate
}
2025-01-21 16:28:55 +01:00
func (f *BaseRequestHandler) GetRequestParser() RequestParser {
return f.rp
}