codeword/internal/services/recovery_service.go

77 lines
2.5 KiB
Go
Raw Normal View History

2023-12-29 11:30:20 +00:00
package services
import (
"codeword/internal/models"
2023-12-29 16:09:06 +00:00
"codeword/internal/utils/encrypt"
2023-12-29 11:30:20 +00:00
"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
}
2023-12-29 18:02:50 +00:00
type Deps struct {
2023-12-29 16:09:06 +00:00
Logger *zap.Logger
Repository UserRepository
Email EmailSender
EncryptService *encrypt.Encrypt
2023-12-29 11:30:20 +00:00
}
2023-12-29 18:02:50 +00:00
type RecoveryService struct {
logger *zap.Logger
repository UserRepository
email EmailSender
encryptService *encrypt.Encrypt
}
func NewRecoveryService(deps Deps) *RecoveryService {
2023-12-29 11:30:20 +00:00
return &RecoveryService{
2023-12-29 18:02:50 +00:00
logger: deps.Logger,
repository: deps.Repository,
email: deps.Email,
encryptService: deps.EncryptService,
2023-12-29 11:30:20 +00:00
}
}
// GenerateKey генерирует ключ, используя шифрование на основе эллиптической кривой
func (s *RecoveryService) GenerateKey() (string, error) {
// TODO
return "", nil
}
// FindUserByEmail ищет пользователя по электронной почте
func (s *RecoveryService) FindUserByEmail(email string) (*models.User, error) {
2023-12-29 18:02:50 +00:00
return s.repository.FindByEmail(email)
2023-12-29 11:30:20 +00:00
}
// StoreRecoveryRecord сохраняет запись восстановления в базе данных
func (s *RecoveryService) StoreRecoveryRecord(userID string) (string, error) {
signature := ""
createdAt := time.Now()
2023-12-29 18:02:50 +00:00
err := s.repository.StoreRecoveryRecord(userID, signature, createdAt)
2023-12-29 11:30:20 +00:00
return signature, err
}
// GetRecoveryRecord получает запись восстановления из базы данных
func (s *RecoveryService) GetRecoveryRecord(signature string) (*models.RestoreRequest, error) {
2023-12-29 18:02:50 +00:00
return s.repository.GetRecoveryRecord(signature)
2023-12-29 11:30:20 +00:00
}
// SendRecoveryEmail посылает письмо для восстановления доступа пользователю
func (s *RecoveryService) SendRecoveryEmail(email string, signature string) error {
2023-12-29 18:02:50 +00:00
return s.email.SendRecoveryEmail(email, signature)
2023-12-29 11:30:20 +00:00
}
// ExchangeForTokens обменивает ссылку восстановления на токены используя сервис аутентификации.
func (s *RecoveryService) ExchangeForTokens(userID string) (map[string]string, error) {
// TODO
return nil, nil
}