improved JWTToken update, added list-users endpoint, debug of getCountries

This commit is contained in:
Daniel Goc
2026-03-30 16:19:26 +02:00
parent 68f4850445
commit d0ce65c287
41 changed files with 654 additions and 284 deletions

View File

@@ -6,7 +6,6 @@ import (
"encoding/hex"
"errors"
"fmt"
"strconv"
"time"
"git.ma-al.com/goc_daniel/b2b/app/config"
@@ -14,13 +13,9 @@ import (
"git.ma-al.com/goc_daniel/b2b/app/model"
"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/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/dlclark/regexp2"
"github.com/gofiber/fiber/v3"
"github.com/golang-jwt/jwt/v5"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
@@ -167,7 +162,7 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
baseURL := config.Get().App.BaseURL
lang, err := s.GetLangISOCode(req.LangID)
if err != nil {
return responseErrors.ErrBadLangID
return err
}
if err := s.email.SendVerificationEmail(user.Email, user.EmailVerificationToken, baseURL, lang); err != nil {
@@ -276,7 +271,7 @@ func (s *AuthService) RequestPasswordReset(emailAddr string) error {
baseURL := config.Get().App.BaseURL
lang, err := s.GetLangISOCode(user.LangID)
if err != nil {
return responseErrors.ErrBadLangID
return err
}
if err := s.email.SendPasswordResetEmail(user.Email, user.PasswordResetToken, baseURL, lang); err != nil {
@@ -482,7 +477,7 @@ func hashToken(raw string) string {
func (s *AuthService) generateAccessToken(user *model.Customer) (string, error) {
_, err := s.GetLangISOCode(user.LangID)
if err != nil {
return "", responseErrors.ErrBadLangID
return "", err
}
err = s.CheckIfCountryExists(user.CountryID)
@@ -508,97 +503,19 @@ func (s *AuthService) generateAccessToken(user *model.Customer) (string, error)
return token.SignedString([]byte(s.config.JWTSecret))
}
func (s *AuthService) UpdateJWTToken(c fiber.Ctx) error {
// Get user ID from JWT claims in context (set by auth middleware)
// claims, ok := c.Locals("jwt_claims").(*JWTClaims)
// if !ok || claims == nil {
// return c.Status(fiber.StatusUnauthorized).
// JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated)))
// }
// fmt.Printf("claims: %v\n", claims)
// var user model.Customer
// // Find user by ID
// if err := s.db.First(&user, claims.UserID).Error; err != nil {
// return err
// }
userLocals, ok := c.Locals(constdata.USER_LOCALES_NAME).(*model.UserSession)
if !ok {
return c.Status(fiber.StatusUnauthorized).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated)))
}
user := model.Customer{
ID: userLocals.UserID,
Email: userLocals.Email,
Role: userLocals.Role,
LangID: userLocals.LangID,
CountryID: userLocals.CountryID,
IsActive: userLocals.IsActive,
}
// Parse language and country_id from query params
langIDStr := c.Query("lang_id")
var langID uint
if langIDStr != "" {
parsedID, err := strconv.ParseUint(langIDStr, 10, 32)
if err != nil {
return c.Status(fiber.StatusBadRequest).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadLangID)))
}
langID = uint(parsedID)
_, err = s.GetLangISOCode(langID)
if err != nil {
return responseErrors.ErrBadLangID
} else {
user.LangID = langID
}
}
countryIDStr := c.Query("country_id")
var countryID uint
if countryIDStr != "" {
parsedID, err := strconv.ParseUint(countryIDStr, 10, 32)
if err != nil {
return c.Status(fiber.StatusBadRequest).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadCountryID)))
}
countryID = uint(parsedID)
err = s.CheckIfCountryExists(countryID)
if err != nil {
return responseErrors.ErrBadCountryID
} else {
user.CountryID = countryID
}
}
// Update choice and get new token using AuthService
newToken, err := s.generateAccessToken(&user)
func (s *AuthService) UpdateJWTToken(user *model.Customer) (string, error) {
// Update choice and get new access token using AuthService
new_access_token, err := s.generateAccessToken(user)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
return "", err
}
// Save the updated user
if err := s.db.Save(&user).Error; err != nil {
return fmt.Errorf("database error: %w", err)
if err := s.db.Save(user).Error; err != nil {
return "", fmt.Errorf("database error: %w", err)
}
// Set the new JWT cookie
cookie := new(fiber.Cookie)
cookie.Name = "jwt_token"
cookie.Value = newToken
cookie.HTTPOnly = true
cookie.Secure = true
cookie.SameSite = fiber.CookieSameSiteLaxMode
c.Cookie(cookie)
return c.JSON(response.Make(&fiber.Map{"token": newToken}, 0, i18n.T_(c, response.Message_OK)))
return new_access_token, nil
}
// generateVerificationToken generates a random verification token
@@ -623,14 +540,20 @@ func validatePassword(password string) error {
func (s *AuthService) GetLangISOCode(langID uint) (string, error) {
var lang string
var err error
if langID == 0 { // retrieve the default lang
err := db.DB.Table("b2b_language").Where("is_default = ?", 1).Select("iso_code").Scan(&lang).Error
return lang, err
err = db.DB.Table("b2b_language").Where("is_default = ?", 1).Select("iso_code").Scan(&lang).Error
} else {
err := db.DB.Table("b2b_language").Where("id = ?", langID).Where("active = ?", 1).Select("iso_code").Scan(&lang).Error
return lang, err
err = db.DB.Table("b2b_language").Where("id = ?", langID).Where("active = ?", 1).Select("iso_code").Scan(&lang).Error
}
if err != nil {
return lang, err
} else if lang == "" {
return lang, responseErrors.ErrBadLangID
}
return lang, nil
}
func (s *AuthService) CheckIfCountryExists(countryID uint) error {

View File

@@ -153,7 +153,8 @@ func (s *AuthService) findOrCreateGoogleUser(info *view.GoogleUserInfo) (*model.
Role: model.RoleUser,
IsActive: true,
EmailVerified: true,
LangID: 2,
LangID: 2, // default is english
CountryID: 2, // default is England
}
if err := s.db.Create(&newUser).Error; err != nil {