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  }