endpoint to update JWT cookies

This commit is contained in:
Daniel Goc
2026-03-18 15:40:54 +01:00
parent 01c8f4333f
commit e094865fc7
7 changed files with 167 additions and 30 deletions

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -5,14 +5,16 @@ import (
"git.ma-al.com/goc_daniel/b2b/repository/jwtFieldsRepo"
)
// jwtService handles updating JWT cookies
// JWTService handles retrieving JWT fields (languages and countries)
type JWTService struct {
repo jwtFieldsRepo.JWTFieldsRepo
repo jwtFieldsRepo.UIJWTFieldsRepo
}
// NewJWTService creates a new JWT service
func New() *JWTService {
return &JWTService{}
return &JWTService{
repo: jwtFieldsRepo.New(),
}
}
func (s *JWTService) GetLanguages() ([]model.Language, error) {
@@ -22,7 +24,3 @@ func (s *JWTService) GetLanguages() ([]model.Language, error) {
func (s *JWTService) GetCountriesAndCurrencies() ([]model.Country, error) {
return s.repo.GetCountriesAndCurrencies()
}
func (s *JWTService) UpdateChoice() error {
return nil
}