codeword/internal/services/recovery_service.go
2023-12-29 21:02:50 +03:00

77 lines
2.5 KiB
Go

package services
import (
"codeword/internal/models"
"codeword/internal/utils/encrypt"
"go.uber.org/zap"
"time"
)
type UserRepository interface {
FindByEmail(email string) (*models.User, error)
StoreRecoveryRecord(userID string, signature string, createdAt time.Time) error
GetRecoveryRecord(signature string) (*models.RestoreRequest, error)
}
type EmailSender interface {
SendRecoveryEmail(email, signature string) error
}
type Deps struct {
Logger *zap.Logger
Repository UserRepository
Email EmailSender
EncryptService *encrypt.Encrypt
}
type RecoveryService struct {
logger *zap.Logger
repository UserRepository
email EmailSender
encryptService *encrypt.Encrypt
}
func NewRecoveryService(deps Deps) *RecoveryService {
return &RecoveryService{
logger: deps.Logger,
repository: deps.Repository,
email: deps.Email,
encryptService: deps.EncryptService,
}
}
// GenerateKey генерирует ключ, используя шифрование на основе эллиптической кривой
func (s *RecoveryService) GenerateKey() (string, error) {
// TODO
return "", nil
}
// FindUserByEmail ищет пользователя по электронной почте
func (s *RecoveryService) FindUserByEmail(email string) (*models.User, error) {
return s.repository.FindByEmail(email)
}
// StoreRecoveryRecord сохраняет запись восстановления в базе данных
func (s *RecoveryService) StoreRecoveryRecord(userID string) (string, error) {
signature := ""
createdAt := time.Now()
err := s.repository.StoreRecoveryRecord(userID, signature, createdAt)
return signature, err
}
// GetRecoveryRecord получает запись восстановления из базы данных
func (s *RecoveryService) GetRecoveryRecord(signature string) (*models.RestoreRequest, error) {
return s.repository.GetRecoveryRecord(signature)
}
// SendRecoveryEmail посылает письмо для восстановления доступа пользователю
func (s *RecoveryService) SendRecoveryEmail(email string, signature string) error {
return s.email.SendRecoveryEmail(email, signature)
}
// ExchangeForTokens обменивает ссылку восстановления на токены используя сервис аутентификации.
func (s *RecoveryService) ExchangeForTokens(userID string) (map[string]string, error) {
// TODO
return nil, nil
}