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 }