Compare commits

..

2 Commits

Author SHA1 Message Date
Alex
386b50e857 backend: membershipController error handling overhaul 2025-02-28 09:46:02 +01:00
Alex
34cf3a1e33 new errors 2025-02-28 09:45:41 +01:00
3 changed files with 34 additions and 22 deletions

View File

@@ -60,7 +60,8 @@ export default {
internal_server_error: internal_server_error:
'Verdammt, Fehler auf unserer Seite, probieren Sie es nochmal, danach rufen Sie jemanden vom Verein an.', 'Verdammt, Fehler auf unserer Seite, probieren Sie es nochmal, danach rufen Sie jemanden vom Verein an.',
not_possible: 'Vorgang nicht möglich.', not_possible: 'Vorgang nicht möglich.',
not_found: 'Konnte nicht gefunden werden.' not_found: 'Konnte nicht gefunden werden.',
in_use: 'Ist in Benutzung'
}, },
validation: { validation: {
invalid_user_id: 'Nutzer ID ungültig', invalid_user_id: 'Nutzer ID ungültig',

View File

@@ -32,12 +32,12 @@ func (mc *MembershipController) RegisterSubscription(c *gin.Context) {
requestUser, err := mc.UserController.ExtractUserFromContext(c) requestUser, err := mc.UserController.ExtractUserFromContext(c)
if err != nil { if err != nil {
utils.RespondWithError(c, err, "Error extracting user from context in subscription registrationHandler", http.StatusBadRequest, "general", "server.validation.invalid_user_data") utils.RespondWithError(c, err, "Error extracting user from context in subscription registrationHandler", http.StatusBadRequest, errors.Responses.Fields.User, errors.Responses.Keys.NoAuthToken)
return return
} }
if !utils.HasPrivilige(requestUser, constants.Priviliges.Create) { if !utils.HasPrivilige(requestUser, constants.Priviliges.Create) {
utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to register subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to register subscription", http.StatusForbidden, errors.Responses.Fields.User, errors.Responses.Keys.Unauthorized)
return return
} }
@@ -47,15 +47,13 @@ func (mc *MembershipController) RegisterSubscription(c *gin.Context) {
} }
// Register Subscription // Register Subscription
logger.Info.Printf("Registering subscription %v", regData.Subscription.Name)
id, err := mc.Service.RegisterSubscription(&regData.Subscription) id, err := mc.Service.RegisterSubscription(&regData.Subscription)
if err != nil { if err != nil {
logger.Error.Printf("Couldn't register Membershipmodel: %v", err)
if strings.Contains(err.Error(), "UNIQUE constraint failed") { if strings.Contains(err.Error(), "UNIQUE constraint failed") {
c.JSON(http.StatusConflict, "Duplicate subscription name") utils.RespondWithError(c, err, "Subscription already exists", http.StatusConflict, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.Duplicate)
return } else {
utils.RespondWithError(c, err, "Couldn't register Membershipmodel", http.StatusInternalServerError, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.InternalServerError)
} }
c.JSON(http.StatusNotAcceptable, "Couldn't register Membershipmodel")
return return
} }
logger.Info.Printf("registering subscription: %+v", regData) logger.Info.Printf("registering subscription: %+v", regData)
@@ -70,12 +68,12 @@ func (mc *MembershipController) UpdateHandler(c *gin.Context) {
requestUser, err := mc.UserController.ExtractUserFromContext(c) requestUser, err := mc.UserController.ExtractUserFromContext(c)
if err != nil { if err != nil {
utils.RespondWithError(c, err, "Error extracting user from context in subscription UpdateHandler", http.StatusBadRequest, "general", "server.validation.no_auth_tokenw") utils.RespondWithError(c, err, "Error extracting user from context in subscription Updatehandler", http.StatusBadRequest, errors.Responses.Fields.User, errors.Responses.Keys.NoAuthToken)
return return
} }
if !utils.HasPrivilige(requestUser, constants.Priviliges.Update) { if !utils.HasPrivilige(requestUser, constants.Priviliges.Update) {
utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, errors.Responses.Fields.User, errors.Responses.Keys.Unauthorized)
return return
} }
@@ -88,12 +86,15 @@ func (mc *MembershipController) UpdateHandler(c *gin.Context) {
logger.Info.Printf("Updating subscription %v", regData.Subscription.Name) logger.Info.Printf("Updating subscription %v", regData.Subscription.Name)
id, err := mc.Service.UpdateSubscription(&regData.Subscription) id, err := mc.Service.UpdateSubscription(&regData.Subscription)
if err != nil { if err != nil {
logger.Error.Printf("Couldn't update Membershipmodel: %v", err)
if strings.Contains(err.Error(), "UNIQUE constraint failed") { if strings.Contains(err.Error(), "UNIQUE constraint failed") {
c.JSON(http.StatusConflict, "Duplicate subscription name") utils.RespondWithError(c, err, "Subscription already exists", http.StatusConflict, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.Duplicate)
return } else if err == errors.ErrSubscriptionNotFound {
utils.RespondWithError(c, err, "Subscription not found", http.StatusNotFound, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.NotFound)
} else if err == errors.ErrInvalidSubscriptionData {
utils.RespondWithError(c, err, "Invalid subscription data", http.StatusBadRequest, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.Invalid)
} else {
utils.RespondWithError(c, err, "Couldn't update subscription", http.StatusInternalServerError, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.InternalServerError)
} }
c.JSON(http.StatusNotAcceptable, "Couldn't update Membershipmodel")
return return
} }
logger.Info.Printf("updating subscription: %+v", regData) logger.Info.Printf("updating subscription: %+v", regData)
@@ -114,12 +115,12 @@ func (mc *MembershipController) DeleteSubscription(c *gin.Context) {
var data deleteData var data deleteData
requestUser, err := mc.UserController.ExtractUserFromContext(c) requestUser, err := mc.UserController.ExtractUserFromContext(c)
if err != nil { if err != nil {
utils.RespondWithError(c, err, "Error extracting user from context in subscription UpdateHandler", http.StatusBadRequest, "general", "server.validation.no_auth_tokenw") utils.RespondWithError(c, err, "Error extracting user from context in subscription deleteSubscription", http.StatusBadRequest, errors.Responses.Fields.User, errors.Responses.Keys.NoAuthToken)
return return
} }
if !utils.HasPrivilige(requestUser, constants.Priviliges.Delete) { if !utils.HasPrivilige(requestUser, constants.Priviliges.Delete) {
utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, errors.Responses.Fields.User, errors.Responses.Keys.Unauthorized)
return return
} }
@@ -129,7 +130,17 @@ func (mc *MembershipController) DeleteSubscription(c *gin.Context) {
} }
if err := mc.Service.DeleteSubscription(&data.Subscription.ID, &data.Subscription.Name); err != nil { if err := mc.Service.DeleteSubscription(&data.Subscription.ID, &data.Subscription.Name); err != nil {
utils.RespondWithError(c, err, "Error during subscription Deletion", http.StatusExpectationFailed, "subscription", "server.error.not_possible") if err == errors.ErrNoData {
utils.RespondWithError(c, err, "Missing subscription name during deletion", http.StatusExpectationFailed, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.Invalid)
} else if err == errors.ErrNotFound {
utils.RespondWithError(c, err, "Subscription not found", http.StatusNotFound, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.NotFound)
} else if err == errors.ErrInvalidSubscriptionData {
utils.RespondWithError(c, err, "Invalid subscription data", http.StatusBadRequest, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.Invalid)
} else if err == errors.ErrSubscriptionInUse {
utils.RespondWithError(c, err, "Subscription is in use by at least one user", http.StatusExpectationFailed, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.InUse)
} else {
utils.RespondWithError(c, err, "Error during subscription Deletion", http.StatusInternalServerError, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.InternalServerError)
}
return return
} }
@@ -139,11 +150,7 @@ func (mc *MembershipController) DeleteSubscription(c *gin.Context) {
func (mc *MembershipController) GetSubscriptions(c *gin.Context) { func (mc *MembershipController) GetSubscriptions(c *gin.Context) {
subscriptions, err := mc.Service.GetSubscriptions(nil) subscriptions, err := mc.Service.GetSubscriptions(nil)
if err != nil { if err != nil {
logger.Error.Printf("Error retrieving subscriptions: %v", err) utils.RespondWithError(c, err, "Error retrieving subscriptions", http.StatusInternalServerError, errors.Responses.Fields.SubscriptionModel, errors.Responses.Keys.InternalServerError)
c.JSON(http.StatusInternalServerError, gin.H{"errors": []gin.H{{
"field": "general",
"key": "validation.internal_server_error",
}}})
return return
} }

View File

@@ -15,6 +15,8 @@ type ValidationKeys struct {
PasswordAlreadyChanged string PasswordAlreadyChanged string
UserDisabled string UserDisabled string
NoAuthToken string NoAuthToken string
NotFound string
InUse string
} }
type ValidationFields struct { type ValidationFields struct {
@@ -65,6 +67,8 @@ var Responses = struct {
UserDisabled: "server.validation.user_disabled", UserDisabled: "server.validation.user_disabled",
PasswordAlreadyChanged: "server.validation.password_already_changed", PasswordAlreadyChanged: "server.validation.password_already_changed",
NoAuthToken: "server.error.no_auth_token", NoAuthToken: "server.error.no_auth_token",
NotFound: "server.error.not_found",
inUse: "server.error.in_use",
}, },
Fields: ValidationFields{ Fields: ValidationFields{
General: "general", General: "general",