diff --git a/settings/pkg/service/v0/service.go b/settings/pkg/service/v0/service.go index 77bae1945..a59c17ffc 100644 --- a/settings/pkg/service/v0/service.go +++ b/settings/pkg/service/v0/service.go @@ -15,7 +15,8 @@ import ( settingssvc "github.com/owncloud/ocis/protogen/gen/ocis/services/settings/v0" "github.com/owncloud/ocis/settings/pkg/config" "github.com/owncloud/ocis/settings/pkg/settings" - store "github.com/owncloud/ocis/settings/pkg/store/metadata" + filestore "github.com/owncloud/ocis/settings/pkg/store/filesystem" + metastore "github.com/owncloud/ocis/settings/pkg/store/metadata" merrors "go-micro.dev/v4/errors" "go-micro.dev/v4/metadata" "google.golang.org/protobuf/types/known/emptypb" @@ -36,7 +37,17 @@ func NewService(cfg *config.Config, logger log.Logger) Service { config: cfg, logger: logger, } - service.manager = store.New(cfg, service.RegisterDefaultRoles) + + switch cfg.StoreType { + default: + fallthrough + case "metadata": + service.manager = metastore.New(cfg) + case "filesystem": + service.manager = filestore.New(cfg) + // TODO: if we want to further support filesystem store it should use default permissions from store/defaults.go instead using this duplicate + service.RegisterDefaultRoles() + } return service } @@ -86,20 +97,18 @@ func (g Service) CheckPermission(ctx context.Context, req *permissions.CheckPerm } // RegisterDefaultRoles composes default roles and saves them. Skipped if the roles already exist. -// NOTE: we can't register on service start any more because metadata might not be up yet -// we need to lazy initialize -func (g Service) RegisterDefaultRoles(m settings.Manager) { +func (g Service) RegisterDefaultRoles() { // FIXME: we're writing default roles per service start (i.e. twice at the moment, for http and grpc server). has to happen only once. for _, role := range generateBundlesDefaultRoles() { bundleID := role.Extension + "." + role.Id // check if the role already exists - bundle, _ := m.ReadBundle(role.Id) + bundle, _ := g.manager.ReadBundle(role.Id) if bundle != nil { g.logger.Debug().Str("bundleID", bundleID).Msg("bundle already exists. skipping.") continue } // create the role - _, err := m.WriteBundle(role) + _, err := g.manager.WriteBundle(role) if err != nil { g.logger.Error().Err(err).Str("bundleID", bundleID).Msg("failed to register bundle") } @@ -107,7 +116,7 @@ func (g Service) RegisterDefaultRoles(m settings.Manager) { } for _, req := range generatePermissionRequests() { - _, err := m.AddSettingToBundle(req.GetBundleId(), req.GetSetting()) + _, err := g.manager.AddSettingToBundle(req.GetBundleId(), req.GetSetting()) if err != nil { g.logger.Error(). Err(err). @@ -118,7 +127,7 @@ func (g Service) RegisterDefaultRoles(m settings.Manager) { } for _, req := range defaultRoleAssignments() { - if _, err := m.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil { + if _, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil { g.logger.Error().Err(err).Msg("failed to register role assignment") } } diff --git a/settings/pkg/settings/settings.go b/settings/pkg/settings/settings.go index 0f3cf9fe5..9132423e8 100644 --- a/settings/pkg/settings/settings.go +++ b/settings/pkg/settings/settings.go @@ -16,7 +16,7 @@ var ( ) // RegisterFunc stores store constructors -type RegisterFunc func(*config.Config, func(Manager)) Manager +type RegisterFunc func(*config.Config) Manager // Manager combines service interfaces for abstraction of storage implementations type Manager interface { diff --git a/settings/pkg/store/filesystem/store.go b/settings/pkg/store/filesystem/store.go index fee4c7ebd..ccd0fe011 100644 --- a/settings/pkg/store/filesystem/store.go +++ b/settings/pkg/store/filesystem/store.go @@ -22,7 +22,7 @@ type Store struct { } // New creates a new store -func New(cfg *config.Config, initStore func(settings.Manager)) settings.Manager { +func New(cfg *config.Config) settings.Manager { s := Store{ //Logger: olog.NewLogger( // olog.Color(cfg.Log.Color), @@ -42,7 +42,6 @@ func New(cfg *config.Config, initStore func(settings.Manager)) settings.Manager } s.dataPath = cfg.DataPath - initStore(&s) return &s } diff --git a/settings/pkg/store/metadata/cache.go b/settings/pkg/store/metadata/cache.go index 48977858a..0f036c592 100644 --- a/settings/pkg/store/metadata/cache.go +++ b/settings/pkg/store/metadata/cache.go @@ -36,7 +36,7 @@ func (c *CachedMDC) SimpleDownload(ctx context.Context, id string) ([]byte, erro return nil, err } - c.files.Set(id, b) + _ = c.files.Set(id, b) return b, nil } @@ -54,15 +54,14 @@ func (c *CachedMDC) SimpleUpload(ctx context.Context, id string, content []byte) } // invalidate caches - err = c.dirs.Remove(path.Dir(id)) - err = c.files.Set(id, content) + _ = c.dirs.Remove(path.Dir(id)) + _ = c.files.Set(id, content) return nil } // Delete invalidates the cache when operation was successful func (c *CachedMDC) Delete(ctx context.Context, id string) error { - err := c.next.Delete(ctx, id) - if err != nil { + if err := c.next.Delete(ctx, id); err != nil { return err } diff --git a/settings/pkg/store/metadata/store.go b/settings/pkg/store/metadata/store.go index e0106f6ca..50e32596a 100644 --- a/settings/pkg/store/metadata/store.go +++ b/settings/pkg/store/metadata/store.go @@ -43,10 +43,8 @@ type Store struct { mdc MetadataClient cfg *config.Config - //initStore func(settings.Manager) - init *sync.Once - l *sync.Mutex + l *sync.Mutex } // Init initialize the store once, later calls are noops @@ -62,26 +60,23 @@ func (s *Store) Init() { return } - //s.init.Do(func() { mdc := &CachedMDC{next: NewMetadataClient(s.cfg.Metadata)} if err := s.initMetadataClient(mdc); err != nil { s.Logger.Error().Err(err).Msg("error initializing metadata client") } - //}) } // New creates a new store -func New(cfg *config.Config, initstore func(settings.Manager)) settings.Manager { +func New(cfg *config.Config) settings.Manager { s := Store{ - //Logger: olog.NewLogger( - //olog.Color(cfg.Log.Color), - //olog.Pretty(cfg.Log.Pretty), - //olog.Level(cfg.Log.Level), - //olog.File(cfg.Log.File), - //), - cfg: cfg, - l: &sync.Mutex{}, - init: &sync.Once{}, + Logger: olog.NewLogger( + olog.Color(cfg.Log.Color), + olog.Pretty(cfg.Log.Pretty), + olog.Level(cfg.Log.Level), + olog.File(cfg.Log.File), + ), + cfg: cfg, + l: &sync.Mutex{}, } return &s