github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/services/users/service.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package users 5 6 import ( 7 "errors" 8 "fmt" 9 "runtime" 10 "sync" 11 12 "github.com/masterhung0112/hk_server/v5/einterfaces" 13 "github.com/masterhung0112/hk_server/v5/model" 14 "github.com/masterhung0112/hk_server/v5/services/cache" 15 "github.com/masterhung0112/hk_server/v5/store" 16 ) 17 18 type UserService struct { 19 store store.UserStore 20 sessionStore store.SessionStore 21 oAuthStore store.OAuthStore 22 sessionCache cache.Cache 23 sessionPool sync.Pool 24 metrics einterfaces.MetricsInterface 25 cluster einterfaces.ClusterInterface 26 config func() *model.Config 27 } 28 29 // ServiceConfig is used to initialize the UserService. 30 type ServiceConfig struct { 31 // Mandatory fields 32 UserStore store.UserStore 33 SessionStore store.SessionStore 34 OAuthStore store.OAuthStore 35 ConfigFn func() *model.Config 36 // Optional fields 37 Metrics einterfaces.MetricsInterface 38 Cluster einterfaces.ClusterInterface 39 } 40 41 func New(c ServiceConfig) (*UserService, error) { 42 if err := c.validate(); err != nil { 43 return nil, err 44 } 45 46 cacheProvider := cache.NewProvider() 47 if err := cacheProvider.Connect(); err != nil { 48 return nil, fmt.Errorf("could not connect to cache provider: %w", err) 49 } 50 51 sessionCache, err := cacheProvider.NewCache(&cache.CacheOptions{ 52 Size: model.SESSION_CACHE_SIZE, 53 Striped: true, 54 StripedBuckets: maxInt(runtime.NumCPU()-1, 1), 55 }) 56 if err != nil { 57 return nil, fmt.Errorf("could not create session cache: %w", err) 58 } 59 60 return &UserService{ 61 store: c.UserStore, 62 sessionStore: c.SessionStore, 63 oAuthStore: c.OAuthStore, 64 config: c.ConfigFn, 65 metrics: c.Metrics, 66 cluster: c.Cluster, 67 sessionCache: sessionCache, 68 sessionPool: sync.Pool{ 69 New: func() interface{} { 70 return &model.Session{} 71 }, 72 }, 73 }, nil 74 } 75 76 func (c *ServiceConfig) validate() error { 77 if in := c; in.ConfigFn == nil || in.UserStore == nil || in.SessionStore == nil || in.OAuthStore == nil { 78 return errors.New("required parameters are not provided") 79 } 80 81 return nil 82 }