package password import ( "context" "fmt" "trankilou.fr/lassistanoque/backend/internal/domain" "trankilou.fr/lassistanoque/backend/internal/service/auth" ) type PasswordAuthenticator struct { tokenManager auth.TokenManager userRepository domain.UserRepository } func NewPasswordAuthenticator( tokenManager auth.TokenManager, userRepository domain.UserRepository, ) *PasswordAuthenticator { return &PasswordAuthenticator{ tokenManager, userRepository, } } func (s *PasswordAuthenticator) Authenticate(ctx context.Context, creds auth.Credentials) (*auth.Session, error) { user, err := s.userRepository.FindUserByEmail(creds.Email) if err != nil || !user.Enabled { return nil, fmt.Errorf("Unauthorized user %s : %s", creds.Email, err) } ok, err := VerifyPassword(creds.Password, user.Password) if !ok { return nil, fmt.Errorf("Password don't match") } if err != nil { return nil, fmt.Errorf("Error verifying password: %s", err) } accessToken, expiresAt, err := s.tokenManager.GenerateAccessToken(user) if err != nil { return nil, fmt.Errorf("Unable to generate access token: %s", err) } refreshToken, _, err := s.tokenManager.GenerateRefreshToken(user.ID) if err != nil { return nil, fmt.Errorf("Unable to generate refresh token: %s", err) } return &auth.Session{ User: user, AccessToken: accessToken, RefreshToken: refreshToken, ExpiresAt: expiresAt, }, nil } func (s *PasswordAuthenticator) Register(ctx context.Context, registration auth.Registration) (*auth.Session, error) { hashedPassord, err := HashPassword(registration.Password) if err != nil { return nil, err } user := &domain.User{ Email: registration.Email, Firstname: registration.Firstname, Lastname: registration.Lastname, Password: hashedPassord, Enabled: true, } count, err := s.userRepository.CountUsers() if err != nil { return nil, err } if count == 0 { user.Administrator = true } user, err = s.userRepository.CreateUser(user) if err != nil { return nil, err } return &auth.Session{User: user}, nil }