67 lines
2.2 KiB
Go
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
|
||
|
}
|