package services import ( "GoMembership/internal/models" "GoMembership/internal/repositories" // "GoMembership/pkg/errors" "crypto/rand" "encoding/base64" "golang.org/x/crypto/bcrypt" "time" ) type UserService interface { RegisterUser(user *models.User) (int64, error) // AuthenticateUser(email, password string) (*models.User, error) } type userService struct { repo repositories.UserRepository } func NewUserService(repo repositories.UserRepository) UserService { return &userService{repo} } func (service *userService) RegisterUser(user *models.User) (int64, error) { salt := make([]byte, 16) if _, err := rand.Read(salt); err != nil { return -1, err } user.Salt = base64.StdEncoding.EncodeToString(salt) hashedPassword, err := HashPassword(user.Password, user.Salt) if err != nil { return -1, err } user.Password = string(hashedPassword) user.CreatedAt = time.Now() user.UpdatedAt = time.Now() user.MandateDateSigned = time.Now() return service.repo.CreateUser(user) } func HashPassword(password string, salt string) (string, error) { saltedPassword := password + salt hashedPassword, err := bcrypt.GenerateFromPassword([]byte(saltedPassword), bcrypt.DefaultCost) if err != nil { return "", err } return base64.StdEncoding.EncodeToString(hashedPassword), nil } /* func (s *userService) AuthenticateUser(email, password string) (*models.User, error) { user, err := s.repo.FindUserByEmail(email) if err != nil { return nil, errors.ErrUserNotFound } if !verifyPassword(password, user.Password, user.Salt) { return nil, errors.ErrInvalidCredentials } return user, nil } */ /* func verifyPassword(password string, storedPassword string, salt string) bool { saltedPassword := password + salt decodedStoredPassword, err := base64.StdEncoding.DecodeString(storedPassword) if err != nil { return false } err = bcrypt.CompareHashAndPassword([]byte(decodedStoredPassword), []byte(saltedPassword)) return err == nil } */