package token import ( "fmt" "time" "git.oblat.lv/alex/triggerssmith/internal/config" ) 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 } func NewTokenService(cfg *config.Auth, store TokenStore) (*Service, error) { if store == nil { return nil, fmt.Errorf("store is nil") } if cfg == nil { return nil, fmt.Errorf("config is nil") } 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) } func (s *Service) RevokeByRefreshDefault(jti string) error { expiryTime := time.Now().Add(-time.Duration(s.cfg.RefreshTokenTTL)) return s.store.revoke(jti, expiryTime) } func (s *Service) IsRevoked(jti string) (bool, error) { return s.store.isRevoked(jti) }