chg: backend: error struct
This commit is contained in:
@@ -7,10 +7,12 @@ import (
|
||||
"GoMembership/internal/models"
|
||||
"GoMembership/internal/services"
|
||||
"GoMembership/internal/utils"
|
||||
"strings"
|
||||
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-playground/validator/v10"
|
||||
|
||||
"GoMembership/pkg/errors"
|
||||
"GoMembership/pkg/logger"
|
||||
@@ -33,13 +35,34 @@ func (uc *UserController) UpdateHandler(c *gin.Context) {
|
||||
var user models.User
|
||||
if err := c.ShouldBindJSON(&user); err != nil {
|
||||
logger.Error.Printf("Couldn't decode input: %v", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode request data"})
|
||||
var validationErrors []gin.H
|
||||
if ve, ok := err.(validator.ValidationErrors); ok {
|
||||
for _, e := range ve {
|
||||
|
||||
validationErrors = append(validationErrors, gin.H{
|
||||
"field": e.Field(),
|
||||
"key": "server.validation." + e.Tag(),
|
||||
})
|
||||
}
|
||||
} else {
|
||||
validationErrors = append(validationErrors, gin.H{
|
||||
"field": "general",
|
||||
"key": "server.error.invalid_json",
|
||||
})
|
||||
}
|
||||
logger.Error.Printf("ValidationErrors: %#v", validationErrors)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"errors": validationErrors})
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
logger.Error.Print("Continuing...")
|
||||
tokenString, err := c.Cookie("jwt")
|
||||
if err != nil {
|
||||
logger.Error.Printf("No Auth token: %v\n", err)
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "No Auth token"})
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.no_auth_token",
|
||||
}}})
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
@@ -47,7 +70,10 @@ func (uc *UserController) UpdateHandler(c *gin.Context) {
|
||||
if err != nil {
|
||||
|
||||
logger.Error.Printf("Error retrieving token and claims from JWT")
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "JWT parsing error"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.jwt_parsing_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
jwtUserID := uint((*claims)["user_id"].(float64))
|
||||
@@ -55,22 +81,27 @@ func (uc *UserController) UpdateHandler(c *gin.Context) {
|
||||
|
||||
if user.ID == 0 {
|
||||
logger.Error.Printf("No User.ID in request from user with id: %v, aborting", jwtUserID)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "No user id provided"})
|
||||
c.JSON(http.StatusBadRequest, gin.H{"errors": []gin.H{{
|
||||
"field": "id",
|
||||
"key": "server.validation.no_user_id_provided",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
if user.ID != jwtUserID && userRole < constants.Roles.Editor {
|
||||
c.JSON(http.StatusForbidden, gin.H{"error": "You are not authorized to update this user"})
|
||||
return
|
||||
}
|
||||
if user.Membership.SubscriptionModel.Name == "" {
|
||||
logger.Error.Printf("No subscription model provided: %v", user.Email)
|
||||
c.JSON(http.StatusNotAcceptable, gin.H{"error": "No subscription model provided"})
|
||||
c.JSON(http.StatusForbidden, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.unauthorized_update",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
selectedModel, err := uc.MembershipService.GetModelByName(&user.Membership.SubscriptionModel.Name)
|
||||
if err != nil {
|
||||
logger.Error.Printf("%v:No subscription model found: %#v", user.Email, err)
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Not a valid subscription model"})
|
||||
c.JSON(http.StatusNotFound, gin.H{"errors": []gin.H{{
|
||||
"field": "subscription_model",
|
||||
"key": "server.validation.invalid_subscription_model",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
user.Membership.SubscriptionModel = *selectedModel
|
||||
@@ -84,20 +115,28 @@ func (uc *UserController) UpdateHandler(c *gin.Context) {
|
||||
// user.Email = existingUser.Email
|
||||
// user.RoleID = existingUser.RoleID
|
||||
// }
|
||||
|
||||
updatedUser, err := uc.Service.UpdateUser(&user, userRole)
|
||||
|
||||
if err != nil {
|
||||
switch err {
|
||||
case errors.ErrUserNotFound:
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
|
||||
c.JSON(http.StatusNotFound, gin.H{"errors": []gin.H{{
|
||||
"field": user.FirstName + " " + user.LastName,
|
||||
"key": "server.validation.user_not_found",
|
||||
}}})
|
||||
case errors.ErrInvalidUserData:
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user data"})
|
||||
c.JSON(http.StatusBadRequest, gin.H{"errors": []gin.H{{
|
||||
"field": "user",
|
||||
"key": "server.validation.invalid_user_data",
|
||||
}}})
|
||||
default:
|
||||
logger.Error.Printf("Failed to update user: %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server error"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusAccepted, gin.H{"message": "User updated successfully", "user": updatedUser})
|
||||
}
|
||||
@@ -106,37 +145,51 @@ func (uc *UserController) CurrentUserHandler(c *gin.Context) {
|
||||
userIDInterface, ok := c.Get("user_id")
|
||||
if !ok || userIDInterface == nil {
|
||||
logger.Error.Printf("Error getting user_id from header")
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Missing or invalid user ID type"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.validation.no_user_id_provided",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
userID, ok := userIDInterface.(uint)
|
||||
|
||||
if !ok {
|
||||
logger.Error.Printf("Error: user_id is not of type uint")
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Invalid user ID type"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "user",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
user, err := uc.Service.GetUserByID(uint(userID))
|
||||
if err != nil {
|
||||
logger.Error.Printf("Error retrieving valid user: %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error retrieving user."})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
subscriptions, err := uc.MembershipService.GetSubscriptions(nil)
|
||||
if err != nil {
|
||||
logger.Error.Printf("Error retrieving subscriptions: %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error retrieving subscriptions."})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "validation.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
licenceCategories, err := uc.DriversLicenceService.GetAllCategories()
|
||||
if err != nil {
|
||||
logger.Error.Printf("Error retrieving licence categories: %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error retrieving licence categories."})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "validation.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
logger.Error.Printf("licenceCategories: %#v", licenceCategories)
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"user": user.Safe(),
|
||||
"subscriptions": subscriptions,
|
||||
@@ -164,14 +217,20 @@ func (uc *UserController) LoginHandler(c *gin.Context) {
|
||||
|
||||
if err := c.ShouldBindJSON(&input); err != nil {
|
||||
logger.Error.Printf("Couldn't decode input: %v", err.Error())
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode request data"})
|
||||
c.JSON(http.StatusBadRequest, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.invalid_json",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
user, err := uc.Service.GetUserByEmail(input.Email)
|
||||
if err != nil {
|
||||
logger.Error.Printf("Error during user(%v) retrieval: %v\n", input.Email, err)
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Couldn't find user"})
|
||||
c.JSON(http.StatusNotFound, gin.H{"errors": []gin.H{{
|
||||
"field": "login",
|
||||
"key": "server.validation.user_not_found_or_wrong_password",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -179,20 +238,29 @@ func (uc *UserController) LoginHandler(c *gin.Context) {
|
||||
if err != nil {
|
||||
|
||||
logger.Error.Printf("Error during Password comparison: %v", err.Error())
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "couldn't calculate match"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
|
||||
logger.Error.Printf("Wrong Password: %v %v", user.FirstName, user.LastName)
|
||||
c.JSON(http.StatusNotAcceptable, gin.H{"error": "Wrong Password"})
|
||||
c.JSON(http.StatusNotAcceptable, gin.H{"errors": []gin.H{{
|
||||
"field": "login",
|
||||
"key": "server.validation.user_not_found_or_wrong_password",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
logger.Error.Printf("jwtsevret: %v", config.Auth.JWTSecret)
|
||||
token, err := middlewares.GenerateToken(config.Auth.JWTSecret, user, "")
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate JWT token"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.jwt_generation_failed",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -209,18 +277,31 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
|
||||
|
||||
if err := c.ShouldBindJSON(®Data); err != nil {
|
||||
logger.Error.Printf("Couldn't decode Userdata: %v", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Couldn't decode userdata"})
|
||||
return
|
||||
}
|
||||
if regData.User.Membership.SubscriptionModel.Name == "" {
|
||||
logger.Error.Printf("No subscription model provided: %v", regData.User.Email)
|
||||
c.JSON(http.StatusNotAcceptable, gin.H{"error": "No subscription model provided"})
|
||||
var validationErrors []gin.H
|
||||
if ve, ok := err.(validator.ValidationErrors); ok {
|
||||
for _, e := range ve {
|
||||
validationErrors = append(validationErrors, gin.H{
|
||||
"field": e.Field(),
|
||||
"key": "server.validation." + e.Tag(),
|
||||
})
|
||||
}
|
||||
} else {
|
||||
validationErrors = append(validationErrors, gin.H{
|
||||
"field": "general",
|
||||
"key": "server.error.invalid_json",
|
||||
})
|
||||
}
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": validationErrors})
|
||||
return
|
||||
}
|
||||
|
||||
selectedModel, err := uc.MembershipService.GetModelByName(®Data.User.Membership.SubscriptionModel.Name)
|
||||
if err != nil {
|
||||
logger.Error.Printf("%v:No subscription model found: %#v", regData.User.Email, err)
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Not a valid subscription model"})
|
||||
c.JSON(http.StatusNotFound, gin.H{"errors": []gin.H{{
|
||||
"field": "subscription_model",
|
||||
"key": "server.validation.invalid_subscription_model",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
regData.User.Membership.SubscriptionModel = *selectedModel
|
||||
@@ -231,7 +312,18 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
|
||||
id, token, err := uc.Service.RegisterUser(®Data.User)
|
||||
if err != nil {
|
||||
logger.Error.Printf("Couldn't register User(%v): %v", regData.User.Email, err)
|
||||
c.JSON(int(id), gin.H{"error": "Couldn't register User"})
|
||||
if strings.Contains(err.Error(), "UNIQUE constraint failed: users.email") {
|
||||
c.JSON(http.StatusConflict, gin.H{"errors": []gin.H{{
|
||||
"field": "email",
|
||||
"key": "server.validation.email_already_registered",
|
||||
}}})
|
||||
} else {
|
||||
logger.Error.Printf("Failed to register user: %v", err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
}
|
||||
return
|
||||
}
|
||||
regData.User.ID = id
|
||||
@@ -255,7 +347,10 @@ func (uc *UserController) RegisterUser(c *gin.Context) {
|
||||
_, err = uc.ConsentService.RegisterConsent(&consent)
|
||||
if err != nil {
|
||||
logger.Error.Printf("%v, Couldn't register consent: %v", regData.User.Email, err)
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Couldn't register User-consent"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
|
||||
"field": "general",
|
||||
"key": "server.error.internal_server_error",
|
||||
}}})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user