codeword/internal/services/recovery_service.go
2023-12-29 14:30:20 +03:00

67 lines
2.2 KiB
Go

package services
import (
"codeword/internal/models"
"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 RecoveryService struct {
Logger *zap.Logger
Repository UserRepository
Email EmailSender
}
func NewRecoveryService(logger *zap.Logger, repository UserRepository, email EmailSender) *RecoveryService {
return &RecoveryService{
Logger: logger,
Repository: repository,
Email: email,
}
}
// 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
}