diff --git a/internal/controllers/membershipController.go b/internal/controllers/membershipController.go index 07c3f35..263f9c0 100644 --- a/internal/controllers/membershipController.go +++ b/internal/controllers/membershipController.go @@ -37,7 +37,7 @@ func (mc *MembershipController) RegisterSubscription(c *gin.Context) { } if !utils.HasPrivilige(requestUser, constants.Priviliges.Update) { - utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to register subscription", http.StatusForbidden, "user", "server.error.unauthorized") + utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to register subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") return } @@ -75,7 +75,7 @@ func (mc *MembershipController) UpdateHandler(c *gin.Context) { } if !utils.HasPrivilige(requestUser, constants.Priviliges.Update) { - utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user", "server.error.unauthorized") + utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") return } @@ -104,7 +104,14 @@ func (mc *MembershipController) UpdateHandler(c *gin.Context) { } func (mc *MembershipController) DeleteSubscription(c *gin.Context) { - var membershipdata MembershipData + type deleteData struct { + Subscription struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"subscription"` + } + + var data deleteData requestUser, err := mc.UserController.ExtractUserFromContext(c) if err != nil { utils.RespondWithError(c, err, "Error extracting user from context in subscription UpdateHandler", http.StatusBadRequest, "general", "server.validation.no_auth_tokenw") @@ -112,16 +119,16 @@ func (mc *MembershipController) DeleteSubscription(c *gin.Context) { } if !utils.HasPrivilige(requestUser, constants.Priviliges.Update) { - utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user", "server.error.unauthorized") + utils.RespondWithError(c, errors.ErrNotAuthorized, "Not allowed to update subscription", http.StatusForbidden, "user.user", "server.error.unauthorized") return } - if err := c.ShouldBindJSON(&membershipdata); err != nil { + if err := c.ShouldBindJSON(&data); err != nil { utils.HandleValidationError(c, err) return } - if err := mc.Service.DeleteSubscription(&membershipdata.Subscription); 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") return } diff --git a/internal/controllers/membershipController_test.go b/internal/controllers/membershipController_test.go index ca2de7d..0f6d24a 100644 --- a/internal/controllers/membershipController_test.go +++ b/internal/controllers/membershipController_test.go @@ -7,6 +7,7 @@ import ( "testing" "GoMembership/internal/constants" + "GoMembership/internal/database" "GoMembership/internal/models" "GoMembership/pkg/logger" @@ -332,6 +333,13 @@ func getSubscriptionUpdateData() []UpdateSubscriptionTest { } func getSubscriptionDeleteData() []DeleteSubscriptionTest { + + var premiumSub, basicSub models.SubscriptionModel + database.DB.Where("name = ?", "Premium").First(&premiumSub) + database.DB.Where("name = ?", "Basic").First(&basicSub) + + logger.Error.Printf("premiumSub.ID: %v", premiumSub.ID) + logger.Error.Printf("basicSub.ID: %v", basicSub.ID) return []DeleteSubscriptionTest{ { Name: "Delete non-existent subscription should fail", @@ -341,17 +349,19 @@ func getSubscriptionDeleteData() []DeleteSubscriptionTest { Input: GenerateInputJSON( customizeSubscription(func(subscription MembershipData) MembershipData { subscription.Subscription.Name = "NonExistentSubscription" + subscription.Subscription.ID = basicSub.ID return subscription })), }, { Name: "Delete subscription without name should fail", - WantResponse: http.StatusBadRequest, + WantResponse: http.StatusExpectationFailed, WantDBData: map[string]interface{}{"name": ""}, Assert: false, Input: GenerateInputJSON( customizeSubscription(func(subscription MembershipData) MembershipData { subscription.Subscription.Name = "" + subscription.Subscription.ID = basicSub.ID return subscription })), }, @@ -363,6 +373,7 @@ func getSubscriptionDeleteData() []DeleteSubscriptionTest { Input: GenerateInputJSON( customizeSubscription(func(subscription MembershipData) MembershipData { subscription.Subscription.Name = "Basic" + subscription.Subscription.ID = basicSub.ID return subscription })), }, @@ -374,6 +385,7 @@ func getSubscriptionDeleteData() []DeleteSubscriptionTest { Input: GenerateInputJSON( customizeSubscription(func(subscription MembershipData) MembershipData { subscription.Subscription.Name = "Premium" + subscription.Subscription.ID = premiumSub.ID return subscription })), }, diff --git a/internal/repositories/subscription_model_repository.go b/internal/repositories/subscription_model_repository.go index eb2259e..ea956db 100644 --- a/internal/repositories/subscription_model_repository.go +++ b/internal/repositories/subscription_model_repository.go @@ -14,7 +14,7 @@ type SubscriptionModelsRepositoryInterface interface { GetSubscriptionModelNames() ([]string, error) GetSubscriptions(where map[string]interface{}) (*[]models.SubscriptionModel, error) // GetUsersBySubscription(id uint) (*[]models.SubscriptionModel, error) - DeleteSubscription(subscription *models.SubscriptionModel) error + DeleteSubscription(id *uint) error } type SubscriptionModelsRepository struct{} @@ -37,9 +37,9 @@ func (sr *SubscriptionModelsRepository) UpdateSubscription(subscription *models. return subscription, nil } -func (sr *SubscriptionModelsRepository) DeleteSubscription(subscription *models.SubscriptionModel) error { +func (sr *SubscriptionModelsRepository) DeleteSubscription(id *uint) error { - result := database.DB.Delete(&models.SubscriptionModel{}, subscription.ID) + result := database.DB.Delete(&models.SubscriptionModel{}, id) if result.Error != nil { return result.Error } diff --git a/internal/routes/routes.go b/internal/routes/routes.go index 3fdd699..bb340dc 100644 --- a/internal/routes/routes.go +++ b/internal/routes/routes.go @@ -38,7 +38,7 @@ func RegisterRoutes(router *gin.Engine, userController *controllers.UserControll membershipRouter.GET("/subscriptions", membershipcontroller.GetSubscriptions) membershipRouter.PATCH("/subscriptions", membershipcontroller.UpdateHandler) membershipRouter.POST("/subscriptions", membershipcontroller.RegisterSubscription) - + membershipRouter.DELETE("/subscriptions", membershipcontroller.DeleteSubscription) } licenceRouter := router.Group("/backend/licence") diff --git a/internal/services/membership_service.go b/internal/services/membership_service.go index e9db8d8..dc5f026 100644 --- a/internal/services/membership_service.go +++ b/internal/services/membership_service.go @@ -13,7 +13,7 @@ type MembershipServiceInterface interface { FindMembershipByUserID(userID uint) (*models.Membership, error) RegisterSubscription(subscription *models.SubscriptionModel) (uint, error) UpdateSubscription(subscription *models.SubscriptionModel) (*models.SubscriptionModel, error) - DeleteSubscription(subscription *models.SubscriptionModel) error + DeleteSubscription(id *uint, name *string) error GetSubscriptionModelNames() ([]string, error) GetSubscriptionByName(modelname *string) (*models.SubscriptionModel, error) GetSubscriptions(where map[string]interface{}) (*[]models.SubscriptionModel, error) @@ -50,17 +50,21 @@ func (service *MembershipService) UpdateSubscription(subscription *models.Subscr } -func (service *MembershipService) DeleteSubscription(subscription *models.SubscriptionModel) error { - exists, err := repositories.GetSubscriptionByName(&subscription.Name) +func (service *MembershipService) DeleteSubscription(id *uint, name *string) error { + if *name == "" { + return errors.ErrNoData + } + exists, err := repositories.GetSubscriptionByName(name) if err != nil { return err } if exists == nil { return errors.ErrNotFound } - - subscription.ID = exists.ID - usersInSubscription, err := repositories.GetUsersBySubscription(subscription.ID) + if *id != exists.ID { + return errors.ErrInvalidSubscriptionData + } + usersInSubscription, err := repositories.GetUsersBySubscription(*id) if err != nil { return err @@ -68,7 +72,7 @@ func (service *MembershipService) DeleteSubscription(subscription *models.Subscr if len(*usersInSubscription) > 0 { return errors.ErrSubscriptionInUse } - return service.SubscriptionRepo.DeleteSubscription(subscription) + return service.SubscriptionRepo.DeleteSubscription(id) } func (service *MembershipService) FindMembershipByUserID(userID uint) (*models.Membership, error) {