codeword/internal/services/recovery_service.go

86 lines
3.0 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-31 12:22:03 +00:00
"context"
2023-12-29 11:30:20 +00:00
"go.uber.org/zap"
)
2023-12-31 12:22:03 +00:00
type CodewordRepository interface {
2024-01-03 15:45:41 +00:00
StoreRecoveryRecord(ctx context.Context, userID string, email string, key []byte) (string, error)
InsertToQueue(ctx context.Context, userID string, email string, key []byte, id string) error
2023-12-31 12:22:03 +00:00
Ping(ctx context.Context) error
2024-01-03 15:45:41 +00:00
GetRecoveryRecord(ctx context.Context, key []byte) (*models.RestoreRequest, error)
2023-12-29 11:30:20 +00:00
}
2023-12-31 12:22:03 +00:00
type UserRepository interface {
FindByEmail(ctx context.Context, email string) (*models.User, error)
2023-12-29 11:30:20 +00:00
}
2023-12-29 18:02:50 +00:00
type Deps struct {
2023-12-31 12:22:03 +00:00
Logger *zap.Logger
CodewordRepository CodewordRepository
UserRepository UserRepository
EncryptService *encrypt.Encrypt
2023-12-29 11:30:20 +00:00
}
2023-12-29 18:02:50 +00:00
type RecoveryService struct {
2023-12-31 12:22:03 +00:00
logger *zap.Logger
repositoryCodeword CodewordRepository
repositoryUser UserRepository
encryptService *encrypt.Encrypt
2023-12-29 18:02:50 +00:00
}
func NewRecoveryService(deps Deps) *RecoveryService {
2023-12-29 11:30:20 +00:00
return &RecoveryService{
2023-12-31 12:22:03 +00:00
logger: deps.Logger,
repositoryCodeword: deps.CodewordRepository,
repositoryUser: deps.UserRepository,
encryptService: deps.EncryptService,
2023-12-29 11:30:20 +00:00
}
}
// GenerateKey генерирует ключ, используя шифрование на основе эллиптической кривой
2023-12-31 12:22:03 +00:00
func (s *RecoveryService) GenerateKey() ([]byte, error) {
key, err := s.encryptService.SignCommonSecret()
if err != nil {
return nil, err
}
return key, nil
}
func (s *RecoveryService) Ping(ctx context.Context) error {
return s.repositoryCodeword.Ping(ctx)
2023-12-29 11:30:20 +00:00
}
// FindUserByEmail ищет пользователя по электронной почте
2023-12-31 12:22:03 +00:00
func (s *RecoveryService) FindUserByEmail(ctx context.Context, email string) (*models.User, error) {
return s.repositoryUser.FindByEmail(ctx, email)
2023-12-29 11:30:20 +00:00
}
// StoreRecoveryRecord сохраняет запись восстановления в базе данных
2024-01-03 15:45:41 +00:00
func (s *RecoveryService) StoreRecoveryRecord(ctx context.Context, userID string, email string, key []byte) (string, error) {
id, err := s.repositoryCodeword.StoreRecoveryRecord(ctx, userID, email, key)
if err != nil {
return "", err
}
return id, nil
2023-12-29 11:30:20 +00:00
}
2023-12-31 12:22:03 +00:00
// SendRecoveryEmail посылает письмо для восстановления доступа пользователю
2024-01-03 15:45:41 +00:00
func (s *RecoveryService) RecoveryEmailTask(ctx context.Context, userID string, email string, key []byte, id string) error {
return s.repositoryCodeword.InsertToQueue(ctx, userID, email, key, id)
2023-12-29 11:30:20 +00:00
}
2023-12-31 12:22:03 +00:00
// GetRecoveryRecord получает запись восстановления из базы данных
2024-01-03 15:45:41 +00:00
func (s *RecoveryService) GetRecoveryRecord(ctx context.Context, key []byte) (*models.RestoreRequest, error) {
2023-12-31 12:22:03 +00:00
return s.repositoryCodeword.GetRecoveryRecord(ctx, key)
2023-12-29 11:30:20 +00:00
}
// ExchangeForTokens обменивает ссылку восстановления на токены используя сервис аутентификации.
func (s *RecoveryService) ExchangeForTokens(userID string) (map[string]string, error) {
// TODO
return nil, nil
}