From 1d379775c6e022bf49503c6dd72feec4eb1bdd26 Mon Sep 17 00:00:00 2001 From: devkuros Date: Thu, 7 Apr 2022 09:06:52 +0700 Subject: [PATCH] add update & delete to seocial_media_repo.go --- middlewares/authorization.go | 35 ++++++++++++++++ models/socialmedias_models.go | 8 ++++ repositories/social_media_repo.go | 69 ++++++++++++++++++++++++++++++- routers/routers.go | 2 + 4 files changed, 113 insertions(+), 1 deletion(-) diff --git a/middlewares/authorization.go b/middlewares/authorization.go index c1b2b13..dcfcd55 100644 --- a/middlewares/authorization.go +++ b/middlewares/authorization.go @@ -125,3 +125,38 @@ func (pa *authorization) CommentAuthorizations() gin.HandlerFunc { c.Next() } } + +func (pa *authorization) SocialMediaAuthorizations() gin.HandlerFunc { + return func(c *gin.Context) { + socialMediaId, err := strconv.Atoi(c.Param("socialMediaId")) + if err != nil { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ + "error": "Bad Request", + "message": "invalid parameter", + }) + return + } + + userData := c.MustGet("userData").(jwt.MapClaims) + userID := uint(userData["id"].(float64)) + Social := models.SocialMedia{} + + err = pa.DB.Select("user_id").First(&Social, uint(socialMediaId)).Error + if err != nil { + c.AbortWithStatusJSON(http.StatusNotFound, gin.H{ + "error": "Data not found", + "message": "data not exist", + }) + return + } + + if Social.UserID != userID { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + "message": "please try again!", + }) + return + } + c.Next() + } +} diff --git a/models/socialmedias_models.go b/models/socialmedias_models.go index c081ca5..2a2c36a 100644 --- a/models/socialmedias_models.go +++ b/models/socialmedias_models.go @@ -15,6 +15,14 @@ type SocialMedia struct { User *User `json:"user" gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"` } +type GetSocialMediaBody struct { + ID uint `json:"id"` + Nama string `json:"name"` + SocialMediaUrl string `json:"social_media_url"` + UserID uint `json:"user_id"` + UpdatedAt time.Time `json:"updated_at"` +} + type UserSocialMediaBody struct { StatsSocialMedia struct { ID uint `json:"id"` diff --git a/repositories/social_media_repo.go b/repositories/social_media_repo.go index 50ae710..fc3f3ef 100644 --- a/repositories/social_media_repo.go +++ b/repositories/social_media_repo.go @@ -4,6 +4,7 @@ import ( "mygram/handlers" "mygram/models" "net/http" + "strconv" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" @@ -58,7 +59,7 @@ func (som *socialMediaRepo) GetSocialMedias(c *gin.Context) { return } - if err := som.DB.Select("photo_url").Where("user_id = ?", userID).First(&Photo).Error; err != nil { + if err := som.DB.Select("photo_url").Where("user_id = ?", userID).Last(&Photo).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{ "error": "Data not found", "message": err.Error(), @@ -110,3 +111,69 @@ func (som *socialMediaRepo) CreateSocialMedias(c *gin.Context) { "created_at": Social.CreatedAt, }) } + +func (som *socialMediaRepo) UpdateSocialMedias(c *gin.Context) { + userData := c.MustGet("userData").(jwt.MapClaims) + contentType := handlers.GetContentType(c) + + Social := models.SocialMedia{} + GetSocialBody := models.GetSocialMediaBody{} + + socialMediaId, _ := strconv.Atoi(c.Param("socialMediaId")) + userID := uint(userData["id"].(float64)) + + if contentType == socialMediatApp { + c.ShouldBindJSON(&Social) + } else { + c.ShouldBind(&Social) + } + + Social.UserID = userID + Social.ID = uint(socialMediaId) + + if err := som.DB.Model(&Social).Where("id = ?", socialMediaId).Updates(models.SocialMedia{Nama: Social.Nama, SocialMediaUrl: Social.SocialMediaUrl}).Error; err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "err": "Bad Request", + "message": err.Error(), + }) + return + } + + GetSocialBody.ID = Social.ID + GetSocialBody.Nama = Social.Nama + GetSocialBody.SocialMediaUrl = Social.SocialMediaUrl + GetSocialBody.UserID = Social.UserID + GetSocialBody.UpdatedAt = Social.UpdatedAt + + c.JSON(http.StatusOK, GetSocialBody) +} + +func (som *socialMediaRepo) DeleteSocialMedias(c *gin.Context) { + userData := c.MustGet("userData").(jwt.MapClaims) + contentType := handlers.GetContentType(c) + Social := models.SocialMedia{} + + socialMediaId, _ := strconv.Atoi(c.Param("socialMediaId")) + userID := uint(userData["id"].(float64)) + + if contentType == socialMediatApp { + c.ShouldBindJSON(&Social) + } else { + c.ShouldBind(&Social) + } + + Social.UserID = userID + Social.ID = uint(socialMediaId) + + if err := som.DB.Model(&Social).Where("id = ?", socialMediaId).Delete(&Social).Error; err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "err": "Bad Request", + "message": err.Error(), + }) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message": "your social media has been successfully deleted", + }) +} diff --git a/routers/routers.go b/routers/routers.go index bb8232e..673f354 100644 --- a/routers/routers.go +++ b/routers/routers.go @@ -54,6 +54,8 @@ func StartServer() *gin.Engine { socialMediaMiddleware.Use(middlewares.Authentication()) socialMediaMiddleware.POST("/", ctrlSocials.CreateSocialMedias) socialMediaMiddleware.GET("/", ctrlSocials.GetSocialMedias) + socialMediaMiddleware.PUT("/:socialMediaId", authorizations.SocialMediaAuthorizations(), ctrlSocials.UpdateSocialMedias) + socialMediaMiddleware.DELETE("/:socialMediaId", authorizations.SocialMediaAuthorizations(), ctrlSocials.DeleteSocialMedias) } return r