diff --git a/pkg/bbgo/bootstrap.go b/pkg/bbgo/bootstrap.go index 73188c7d2..59d557692 100644 --- a/pkg/bbgo/bootstrap.go +++ b/pkg/bbgo/bootstrap.go @@ -15,7 +15,7 @@ func BootstrapEnvironmentLightweight(ctx context.Context, environ *Environment, } if userConfig.Persistence != nil { - if err := environ.ConfigurePersistence(userConfig.Persistence); err != nil { + if err := ConfigurePersistence(ctx, userConfig.Persistence); err != nil { return errors.Wrap(err, "persistence configure error") } } @@ -33,7 +33,7 @@ func BootstrapEnvironment(ctx context.Context, environ *Environment, userConfig } if userConfig.Persistence != nil { - if err := environ.ConfigurePersistence(userConfig.Persistence); err != nil { + if err := ConfigurePersistence(ctx, userConfig.Persistence); err != nil { return errors.Wrap(err, "persistence configure error") } } diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index 455a8d640..9f57420db 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -13,7 +13,6 @@ import ( "sync" "time" - "github.com/codingconcepts/env" "github.com/pkg/errors" "github.com/pquerna/otp" log "github.com/sirupsen/logrus" @@ -276,31 +275,6 @@ func (environ *Environment) Start(ctx context.Context) (err error) { return } -func (environ *Environment) ConfigurePersistence(conf *PersistenceConfig) error { - if conf.Redis != nil { - if err := env.Set(conf.Redis); err != nil { - return err - } - - redisPersistence := service.NewRedisPersistenceService(conf.Redis) - persistenceServiceFacade.Redis = redisPersistence - } - - if conf.Json != nil { - if _, err := os.Stat(conf.Json.Directory); os.IsNotExist(err) { - if err2 := os.MkdirAll(conf.Json.Directory, 0777); err2 != nil { - log.WithError(err2).Errorf("can not create directory: %s", conf.Json.Directory) - return err2 - } - } - - jsonPersistence := &service.JsonPersistenceService{Directory: conf.Json.Directory} - persistenceServiceFacade.Json = jsonPersistence - } - - return nil -} - func (environ *Environment) SetStartTime(t time.Time) *Environment { environ.startTime = t return environ diff --git a/pkg/bbgo/isolation.go b/pkg/bbgo/isolation.go index f85b8d915..44df20034 100644 --- a/pkg/bbgo/isolation.go +++ b/pkg/bbgo/isolation.go @@ -22,6 +22,13 @@ func NewDefaultIsolation() *Isolation { } } +func NewIsolation(persistenceFacade *service.PersistenceServiceFacade) *Isolation { + return &Isolation{ + gracefulShutdown: GracefulShutdown{}, + persistenceServiceFacade: persistenceFacade, + } +} + func GetIsolationFromContext(ctx context.Context) *Isolation { isolatedContext, ok := ctx.Value(IsolationContextKey).(*Isolation) if ok { diff --git a/pkg/bbgo/persistence.go b/pkg/bbgo/persistence.go index 8d2a2aa33..e87fd92a7 100644 --- a/pkg/bbgo/persistence.go +++ b/pkg/bbgo/persistence.go @@ -2,8 +2,11 @@ package bbgo import ( "context" + "os" "reflect" + "github.com/codingconcepts/env" + "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/c9s/bbgo/pkg/dynamic" @@ -70,3 +73,44 @@ func storePersistenceFields(obj interface{}, id string, persistence service.Pers return store.Save(inf) }) } + +func NewPersistenceServiceFacade(conf *PersistenceConfig) (*service.PersistenceServiceFacade, error) { + facade := &service.PersistenceServiceFacade{ + Memory: service.NewMemoryService(), + } + + if conf.Redis != nil { + if err := env.Set(conf.Redis); err != nil { + return nil, err + } + + redisPersistence := service.NewRedisPersistenceService(conf.Redis) + facade.Redis = redisPersistence + } + + if conf.Json != nil { + if _, err := os.Stat(conf.Json.Directory); os.IsNotExist(err) { + if err2 := os.MkdirAll(conf.Json.Directory, 0777); err2 != nil { + return nil, errors.Wrapf(err2, "can not create directory: %s", conf.Json.Directory) + } + } + + jsonPersistence := &service.JsonPersistenceService{Directory: conf.Json.Directory} + facade.Json = jsonPersistence + } + + return facade, nil +} + +func ConfigurePersistence(ctx context.Context, conf *PersistenceConfig) error { + facade, err := NewPersistenceServiceFacade(conf) + if err != nil { + return err + } + + isolation := GetIsolationFromContext(ctx) + isolation.persistenceServiceFacade = facade + + persistenceServiceFacade = facade + return nil +}