Files
2026-08-08 23:12:37 +02:00

83 lines
2.0 KiB
Go

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,
}
// TODO: create team "Espace personnel" and put user in it
user, err = s.userRepository.CreateUser(user)
if err != nil {
return nil, err
}
return &auth.Session{User: user}, nil
}