Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into expand_orders
This commit is contained in:
@@ -15,6 +15,7 @@ import (
|
||||
roleRepo "git.ma-al.com/goc_daniel/b2b/app/repos/rolesRepo"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/service/emailService"
|
||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||
|
||||
"github.com/dlclark/regexp2"
|
||||
@@ -68,22 +69,47 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin
|
||||
// Find user by email
|
||||
if err := s.db.Preload("Role.Permissions").Where("email = ?", req.Email).First(&user).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
logger.Info("login failed - invalid credentials",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"reason", "user not found",
|
||||
)
|
||||
return nil, "", responseErrors.ErrInvalidCredentials
|
||||
}
|
||||
logger.Error("login failed - database error",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
return nil, "", fmt.Errorf("database error: %w", err)
|
||||
}
|
||||
// Check if user is active
|
||||
if !user.IsActive {
|
||||
logger.Info("login failed - user inactive",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"reason", "user account is inactive",
|
||||
)
|
||||
return nil, "", responseErrors.ErrUserInactive
|
||||
}
|
||||
|
||||
// Check if email is verified
|
||||
if !user.EmailVerified {
|
||||
logger.Info("login failed - email not verified",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"reason", "email not verified",
|
||||
)
|
||||
return nil, "", responseErrors.ErrEmailNotVerified
|
||||
}
|
||||
|
||||
// Verify password
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
|
||||
logger.Info("login failed - invalid credentials",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"reason", "wrong password",
|
||||
)
|
||||
return nil, "", responseErrors.ErrInvalidCredentials
|
||||
}
|
||||
|
||||
@@ -94,6 +120,11 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin
|
||||
if req.LangID != nil {
|
||||
_, err := s.GetLangISOCode(*req.LangID)
|
||||
if err != nil {
|
||||
logger.Warn("login failed - invalid language ID",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"reason", "invalid language ID",
|
||||
)
|
||||
return nil, "", responseErrors.ErrBadLangID
|
||||
}
|
||||
user.LangID = *req.LangID
|
||||
@@ -105,12 +136,22 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin
|
||||
// Generate access token (JWT)
|
||||
accessToken, err := s.generateAccessToken(&user)
|
||||
if err != nil {
|
||||
logger.Error("login failed - token generation error",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
return nil, "", fmt.Errorf("failed to generate access token: %w", err)
|
||||
}
|
||||
|
||||
// Generate opaque refresh token and store in DB
|
||||
rawRefreshToken, err := s.createRefreshToken(user.ID)
|
||||
if err != nil {
|
||||
logger.Error("login failed - refresh token creation error",
|
||||
"service", "AuthService.Login",
|
||||
"email", req.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
return nil, "", fmt.Errorf("failed to create refresh token: %w", err)
|
||||
}
|
||||
|
||||
@@ -171,6 +212,11 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
||||
}
|
||||
|
||||
if err := s.db.Create(&user).Error; err != nil {
|
||||
logger.Error("registration failed - database error",
|
||||
"service", "AuthService.Register",
|
||||
"email", req.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
return fmt.Errorf("failed to create user: %w", err)
|
||||
}
|
||||
|
||||
@@ -182,8 +228,11 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
||||
}
|
||||
|
||||
if err := s.email.SendVerificationEmail(user.Email, user.EmailVerificationToken, baseURL, lang); err != nil {
|
||||
// Log error but don't fail registration - user can request resend
|
||||
_ = err
|
||||
logger.Warn("failed to send verification email",
|
||||
"service", "AuthService.Register",
|
||||
"email", req.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -307,6 +356,10 @@ func (s *AuthService) ResetPassword(token, newPassword string) error {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return responseErrors.ErrInvalidResetToken
|
||||
}
|
||||
logger.Error("password reset failed - database error",
|
||||
"service", "AuthService.ResetPassword",
|
||||
"error", err.Error(),
|
||||
)
|
||||
return fmt.Errorf("database error: %w", err)
|
||||
}
|
||||
|
||||
@@ -333,6 +386,10 @@ func (s *AuthService) ResetPassword(token, newPassword string) error {
|
||||
|
||||
user.Country = nil
|
||||
if err := s.db.Save(&user).Error; err != nil {
|
||||
logger.Error("password reset failed - database error",
|
||||
"service", "AuthService.ResetPassword",
|
||||
"error", err.Error(),
|
||||
)
|
||||
return fmt.Errorf("failed to update password: %w", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -8,10 +8,12 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/view"
|
||||
"golang.org/x/oauth2"
|
||||
@@ -77,6 +79,13 @@ func (s *AuthService) HandleGoogleCallback(code string) (*model.AuthResponse, st
|
||||
// Find or create user
|
||||
user, err := s.findOrCreateGoogleUser(userInfo)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "database") {
|
||||
logger.Error("google oauth callback failed - database error",
|
||||
"service", "AuthService.HandleGoogleCallback",
|
||||
"email", userInfo.Email,
|
||||
"error", err.Error(),
|
||||
)
|
||||
}
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user