From cd465d42a3915e405c721cc723e1a77b36634eeb Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 19 Dec 2025 14:26:28 +0200 Subject: [PATCH] add init functions --- internal/token/service.go | 22 ++++++++++++++++++++++ internal/token/store_sqlite.go | 10 ++++++++++ internal/user/gorm_store.go | 10 ++++++++++ internal/user/model.go | 6 +++++- internal/user/service.go | 32 ++++++++++++++++++++++++++++++++ internal/user/store.go | 2 ++ 6 files changed, 81 insertions(+), 1 deletion(-) diff --git a/internal/token/service.go b/internal/token/service.go index f498c7e..684b73d 100644 --- a/internal/token/service.go +++ b/internal/token/service.go @@ -10,9 +10,13 @@ import ( type TokenStore interface { revoke(tokenID string, expiresAt time.Time) error isRevoked(tokenID string) (bool, error) + + init() error } type Service struct { + initialized bool + cfg *config.Auth store TokenStore } @@ -27,6 +31,24 @@ func NewTokenService(cfg *config.Auth, store TokenStore) (*Service, error) { return &Service{cfg: cfg, store: store}, nil } +func (s *Service) isInitialized() bool { + return s.initialized +} + +func (s *Service) Init() error { + if s.isInitialized() { + return nil + } + + err := s.store.init() + if err != nil { + return fmt.Errorf("failed to initialize token store: %w", err) + } + + s.initialized = true + return nil +} + func (s *Service) Revoke(jti string, exp time.Time) error { return s.store.revoke(jti, exp) } diff --git a/internal/token/store_sqlite.go b/internal/token/store_sqlite.go index a7513ec..dc70e09 100644 --- a/internal/token/store_sqlite.go +++ b/internal/token/store_sqlite.go @@ -43,3 +43,13 @@ func (s *SQLiteTokenStore) isRevoked(tokenID string) (bool, error) { } return count > 0, nil } + +func (s *SQLiteTokenStore) init() error { + // AutoMigrate models + err := s.db.AutoMigrate(&Token{}) + if err != nil { + return fmt.Errorf("failed to migrate Token model: %w", err) + } + + return nil +} diff --git a/internal/user/gorm_store.go b/internal/user/gorm_store.go index d48fa83..3d3836f 100644 --- a/internal/user/gorm_store.go +++ b/internal/user/gorm_store.go @@ -43,3 +43,13 @@ func (s *GormUserStore) Update(user *User) error { func (s *GormUserStore) Delete(id int64) error { return s.db.Delete(&User{}, id).Error } + +func (s *GormUserStore) init() error { + // AutoMigrate models + err := s.db.AutoMigrate(&User{}) + if err != nil { + return fmt.Errorf("failed to migrate User model: %w", err) + } + + return nil +} diff --git a/internal/user/model.go b/internal/user/model.go index f6fca17..4037d79 100644 --- a/internal/user/model.go +++ b/internal/user/model.go @@ -1,11 +1,15 @@ package user -import "gorm.io/gorm" +import ( + "git.oblat.lv/alex/triggerssmith/internal/acl" + "gorm.io/gorm" +) type User struct { ID int64 `gorm:"primaryKey"` Username string `gorm:"uniqueIndex;not null"` Email string `gorm:"uniqueIndex;not null"` Password string `gorm:"not null"` + Roles []acl.Role `gorm:"many2many:user_roles"` DeletedAt gorm.DeletedAt `gorm:"index"` } diff --git a/internal/user/service.go b/internal/user/service.go index daa9c03..5707920 100644 --- a/internal/user/service.go +++ b/internal/user/service.go @@ -3,6 +3,8 @@ package user import "fmt" type Service struct { + initialized bool + store UserCRUD } @@ -15,18 +17,48 @@ func NewService(store UserCRUD) (*Service, error) { }, nil } +func (s *Service) isInitialized() bool { + return s.initialized +} + +func (s *Service) Init() error { + if s.isInitialized() { + return nil + } + + err := s.store.init() + if err != nil { + return fmt.Errorf("failed to initialize user store: %w", err) + } + + s.initialized = true + return nil +} + func (s *Service) Create(user *User) error { + if !s.isInitialized() { + return fmt.Errorf("user service is not initialized") + } return s.store.Create(user) } func (s *Service) GetBy(by, value string) (*User, error) { + if !s.isInitialized() { + return nil, fmt.Errorf("user service is not initialized") + } return s.store.GetBy(by, value) } func (s *Service) Update(user *User) error { + if !s.isInitialized() { + return fmt.Errorf("user service is not initialized") + } return s.store.Update(user) } func (s *Service) Delete(id int64) error { + if !s.isInitialized() { + return fmt.Errorf("user service is not initialized") + } return s.store.Delete(id) } diff --git a/internal/user/store.go b/internal/user/store.go index b9f8fd8..0dc1e2f 100644 --- a/internal/user/store.go +++ b/internal/user/store.go @@ -5,4 +5,6 @@ type UserCRUD interface { GetBy(by, value string) (*User, error) Update(user *User) error Delete(id int64) error + + init() error }