mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
feat: add ui for managing aliases (resolve #91)
This commit is contained in:
@ -1,11 +1,12 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/muety/wakapi/config"
|
||||
"github.com/muety/wakapi/repositories"
|
||||
"sync"
|
||||
|
||||
"github.com/muety/wakapi/models"
|
||||
"github.com/muety/wakapi/repositories"
|
||||
"log"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type AliasService struct {
|
||||
@ -22,7 +23,14 @@ func NewAliasService(aliasRepo repositories.IAliasRepository) *AliasService {
|
||||
|
||||
var userAliases sync.Map
|
||||
|
||||
func (srv *AliasService) LoadUserAliases(userId string) error {
|
||||
func (srv *AliasService) IsInitialized(userId string) bool {
|
||||
if _, ok := userAliases.Load(userId); ok {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (srv *AliasService) InitializeUser(userId string) error {
|
||||
aliases, err := srv.repository.GetByUser(userId)
|
||||
if err == nil {
|
||||
userAliases.Store(userId, aliases)
|
||||
@ -30,9 +38,25 @@ func (srv *AliasService) LoadUserAliases(userId string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (srv *AliasService) GetByUser(userId string) ([]*models.Alias, error) {
|
||||
aliases, err := srv.repository.GetByUser(userId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return aliases, nil
|
||||
}
|
||||
|
||||
func (srv *AliasService) GetByUserAndKeyAndType(userId, key string, summaryType uint8) ([]*models.Alias, error) {
|
||||
aliases, err := srv.repository.GetByUserAndKeyAndType(userId, key, summaryType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return aliases, nil
|
||||
}
|
||||
|
||||
func (srv *AliasService) GetAliasOrDefault(userId string, summaryType uint8, value string) (string, error) {
|
||||
if !srv.IsInitialized(userId) {
|
||||
if err := srv.LoadUserAliases(userId); err != nil {
|
||||
if err := srv.InitializeUser(userId); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
@ -46,9 +70,46 @@ func (srv *AliasService) GetAliasOrDefault(userId string, summaryType uint8, val
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func (srv *AliasService) IsInitialized(userId string) bool {
|
||||
if _, ok := userAliases.Load(userId); ok {
|
||||
return true
|
||||
func (srv *AliasService) Create(alias *models.Alias) (*models.Alias, error) {
|
||||
result, err := srv.repository.Insert(alias)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
go srv.reinitUser(alias.UserID)
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (srv *AliasService) Delete(alias *models.Alias) error {
|
||||
if alias.UserID == "" {
|
||||
return errors.New("no user id specified")
|
||||
}
|
||||
err := srv.repository.Delete(alias.ID)
|
||||
go srv.reinitUser(alias.UserID)
|
||||
return err
|
||||
}
|
||||
|
||||
func (srv *AliasService) DeleteMulti(aliases []*models.Alias) error {
|
||||
ids := make([]uint, len(aliases))
|
||||
affectedUsers := make(map[string]bool)
|
||||
for i, a := range aliases {
|
||||
if a.UserID == "" {
|
||||
return errors.New("no user id specified")
|
||||
}
|
||||
affectedUsers[a.UserID] = true
|
||||
ids[i] = a.ID
|
||||
}
|
||||
|
||||
err := srv.repository.DeleteBatch(ids)
|
||||
|
||||
for k := range affectedUsers {
|
||||
go srv.reinitUser(k)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (srv *AliasService) reinitUser(userId string) {
|
||||
if err := srv.InitializeUser(userId); err != nil {
|
||||
log.Printf("error initializing user aliases – %v\n", err)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/muety/wakapi/config"
|
||||
"github.com/muety/wakapi/models"
|
||||
"github.com/muety/wakapi/repositories"
|
||||
@ -18,7 +19,7 @@ func NewLanguageMappingService(languageMappingsRepo repositories.ILanguageMappin
|
||||
return &LanguageMappingService{
|
||||
config: config.Get(),
|
||||
repository: languageMappingsRepo,
|
||||
cache: cache.New(1*time.Hour, 2*time.Hour),
|
||||
cache: cache.New(24*time.Hour, 24*time.Hour),
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,6 +64,9 @@ func (srv *LanguageMappingService) Create(mapping *models.LanguageMapping) (*mod
|
||||
}
|
||||
|
||||
func (srv *LanguageMappingService) Delete(mapping *models.LanguageMapping) error {
|
||||
if mapping.UserID == "" {
|
||||
return errors.New("no user id specified")
|
||||
}
|
||||
err := srv.repository.Delete(mapping.ID)
|
||||
srv.cache.Delete(mapping.UserID)
|
||||
return err
|
||||
|
@ -15,9 +15,14 @@ type IMiscService interface {
|
||||
}
|
||||
|
||||
type IAliasService interface {
|
||||
LoadUserAliases(string) error
|
||||
GetAliasOrDefault(string, uint8, string) (string, error)
|
||||
Create(*models.Alias) (*models.Alias, error)
|
||||
Delete(*models.Alias) error
|
||||
DeleteMulti([]*models.Alias) error
|
||||
IsInitialized(string) bool
|
||||
InitializeUser(string) error
|
||||
GetByUser(string) ([]*models.Alias, error)
|
||||
GetByUserAndKeyAndType(string, string, uint8) ([]*models.Alias, error)
|
||||
GetAliasOrDefault(string, uint8, string) (string, error)
|
||||
}
|
||||
|
||||
type IHeartbeatService interface {
|
||||
|
@ -50,7 +50,7 @@ func (srv *SummaryService) Aliased(from, to time.Time, user *models.User, f Summ
|
||||
}
|
||||
|
||||
// Initialize alias resolver service
|
||||
if err := srv.aliasService.LoadUserAliases(user.ID); err != nil {
|
||||
if err := srv.aliasService.InitializeUser(user.ID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -249,7 +249,7 @@ func (suite *SummaryServiceTestSuite) TestSummaryService_Aliased() {
|
||||
|
||||
from, to = suite.TestStartTime, suite.TestStartTime.Add(1*time.Hour)
|
||||
suite.HeartbeatService.On("GetAllWithin", from, to, suite.TestUser).Return(filter(from, to, suite.TestHeartbeats), nil)
|
||||
suite.AliasService.On("LoadUserAliases", TestUserId).Return(nil)
|
||||
suite.AliasService.On("InitializeUser", TestUserId).Return(nil)
|
||||
suite.AliasService.On("GetAliasOrDefault", TestUserId, models.SummaryProject, TestProject1).Return(TestProject2, nil)
|
||||
suite.AliasService.On("GetAliasOrDefault", TestUserId, mock.Anything, mock.Anything).Return("", nil)
|
||||
|
||||
|
Reference in New Issue
Block a user