Files
evening_detective_server/internal/services/users_service/service.go
T
2026-07-02 03:30:51 +07:00

121 lines
2.5 KiB
Go

package users_service
import (
"context"
"errors"
"evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator"
"evening_detective_server/internal/repos/users_repo"
"fmt"
"golang.org/x/crypto/bcrypt"
)
type UsersService struct {
usersRepo *users_repo.UsersRepo
passwordGenerator password_generator.IPasswordGenerator
emailSender email_sender.IEmailSender
}
func NewUsersService(
usersRepo *users_repo.UsersRepo,
passwordGenerator password_generator.IPasswordGenerator,
emailSender email_sender.IEmailSender,
) *UsersService {
return &UsersService{
usersRepo: usersRepo,
passwordGenerator: passwordGenerator,
emailSender: emailSender,
}
}
func (s *UsersService) AddUser(
ctx context.Context,
username string,
email string,
) error {
password, err := s.passwordGenerator.Generate()
if err != nil {
return err
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return err
}
err = s.usersRepo.AddUser(
ctx,
username,
email,
string(hashedPassword),
"user",
)
if err != nil {
return err
}
err = s.emailSender.Send(ctx, email_sender.Message{
To: email,
Subject: "Приветствую тебя, детектив!",
Body: fmt.Sprintf("Вот твой пароль для входа в систему: %s", password),
})
return err
}
func (s *UsersService) RefreshPassword(
ctx context.Context,
email string,
) error {
password, err := s.passwordGenerator.Generate()
if err != nil {
return err
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return err
}
err = s.usersRepo.UpdateUserPassword(
ctx,
email,
string(hashedPassword),
)
if err != nil {
return err
}
err = s.emailSender.Send(ctx, email_sender.Message{
To: email,
Subject: "Приветствую тебя, детектив!",
Body: fmt.Sprintf("Вот твой новый пароль для входа в систему, не теряй: %s", password),
})
return err
}
func (s *UsersService) Login(
ctx context.Context,
email string,
password string,
) error {
user, err := s.usersRepo.GetUserByEmail(
ctx,
email,
)
if err != nil {
return err
}
if err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil {
return errors.New("Не верен email или пароль")
}
fmt.Println(user, err)
// gen tokens (module)
// save refresh token?
return nil // claims?
}