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
|
|
|
|
}
|