endpoint to update JWT cookies
This commit is contained in:
@@ -28,6 +28,7 @@ type JWTClaims struct {
|
||||
Username string `json:"username"`
|
||||
Role model.CustomerRole `json:"customer_role"`
|
||||
CartsIDs []uint `json:"carts_ids"`
|
||||
LangID uint `json:"lang_id"`
|
||||
CountryID uint `json:"country_id"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
@@ -149,7 +150,8 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
||||
EmailVerified: false,
|
||||
EmailVerificationToken: token,
|
||||
EmailVerificationExpires: &expiresAt,
|
||||
Lang: req.Lang,
|
||||
LangID: req.LangID,
|
||||
CountryID: req.CountryID,
|
||||
}
|
||||
|
||||
if err := s.db.Create(&user).Error; err != nil {
|
||||
@@ -158,10 +160,11 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
||||
|
||||
// Send verification email
|
||||
baseURL := config.Get().App.BaseURL
|
||||
lang := req.Lang
|
||||
if lang == "" {
|
||||
lang = "en" // Default to English
|
||||
lang, err := s.GetLangISOCode(req.LangID)
|
||||
if err != nil {
|
||||
return responseErrors.ErrBadLangID
|
||||
}
|
||||
|
||||
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
|
||||
@@ -266,10 +269,11 @@ func (s *AuthService) RequestPasswordReset(emailAddr string) error {
|
||||
|
||||
// Send password reset email
|
||||
baseURL := config.Get().App.BaseURL
|
||||
lang := "en"
|
||||
if user.Lang != "" {
|
||||
lang = user.Lang
|
||||
lang, err := s.GetLangISOCode(user.LangID)
|
||||
if err != nil {
|
||||
return responseErrors.ErrBadLangID
|
||||
}
|
||||
|
||||
if err := s.email.SendPasswordResetEmail(user.Email, user.PasswordResetToken, baseURL, lang); err != nil {
|
||||
_ = err
|
||||
}
|
||||
@@ -477,7 +481,8 @@ func (s *AuthService) generateAccessToken(user *model.Customer) (string, error)
|
||||
Username: user.Email,
|
||||
Role: user.Role,
|
||||
CartsIDs: []uint{},
|
||||
CountryID: 1,
|
||||
LangID: user.LangID,
|
||||
CountryID: user.CountryID,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(s.config.JWTExpiration) * time.Second)),
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
@@ -488,6 +493,45 @@ func (s *AuthService) generateAccessToken(user *model.Customer) (string, error)
|
||||
return token.SignedString([]byte(s.config.JWTSecret))
|
||||
}
|
||||
|
||||
// UpdateChoice updates the user's language and/or country choice and returns a new JWT token
|
||||
func (s *AuthService) UpdateChoice(userID uint, langID uint, countryID uint) (string, error) {
|
||||
var user model.Customer
|
||||
|
||||
// Find user by ID
|
||||
if err := s.db.First(&user, userID).Error; err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Update user langID if provided
|
||||
if langID == 0 {
|
||||
langID = user.LangID
|
||||
}
|
||||
_, err := s.GetLangISOCode(langID)
|
||||
if err != nil {
|
||||
return "", responseErrors.ErrBadLangID
|
||||
} else {
|
||||
user.LangID = langID
|
||||
}
|
||||
|
||||
if countryID == 0 {
|
||||
countryID = user.CountryID
|
||||
}
|
||||
err = s.CheckIfCountryExists(countryID)
|
||||
if err != nil {
|
||||
return "", responseErrors.ErrBadCountryID
|
||||
} else {
|
||||
user.CountryID = countryID
|
||||
}
|
||||
|
||||
// Save the updated user
|
||||
if err := s.db.Save(&user).Error; err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Generate new JWT token with updated claims
|
||||
return s.generateAccessToken(&user)
|
||||
}
|
||||
|
||||
// generateVerificationToken generates a random verification token
|
||||
func (s *AuthService) generateVerificationToken() (string, error) {
|
||||
bytes := make([]byte, 32)
|
||||
@@ -507,3 +551,29 @@ func validatePassword(password string) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *AuthService) GetLangISOCode(langID uint) (string, error) {
|
||||
var lang string
|
||||
|
||||
if langID == 0 { // retrieve the default lang
|
||||
err := db.DB.Table("b2b_language").Where("is_default = ?", 1).First(lang).Error
|
||||
return lang, err
|
||||
} else {
|
||||
err := db.DB.Table("b2b_language").Where("id = ?", langID).Where("active = ?", 1).First(lang).Error
|
||||
return lang, err
|
||||
}
|
||||
}
|
||||
|
||||
func (s *AuthService) CheckIfCountryExists(countryID uint) error {
|
||||
var count int64
|
||||
|
||||
err := db.DB.Table("b2b_countries").Where("id = ?", countryID).Count(&count).Error
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if count == 0 {
|
||||
return responseErrors.ErrBadCountryID
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ func (s *AuthService) findOrCreateGoogleUser(info *view.GoogleUserInfo) (*model.
|
||||
Role: model.RoleUser,
|
||||
IsActive: true,
|
||||
EmailVerified: true,
|
||||
Lang: "en",
|
||||
LangID: 2,
|
||||
}
|
||||
|
||||
if err := s.db.Create(&newUser).Error; err != nil {
|
||||
|
||||
Reference in New Issue
Block a user