diff --git a/routers/api/v1/picture/like.go b/routers/api/v1/picture/like.go new file mode 100644 index 0000000..2e9f87b --- /dev/null +++ b/routers/api/v1/picture/like.go @@ -0,0 +1,64 @@ +package picture + +import ( + "time" + + "git.umbach.dev/app-idea/rest-api/modules/config" + "git.umbach.dev/app-idea/rest-api/modules/database" + "git.umbach.dev/app-idea/rest-api/modules/structs" + "git.umbach.dev/app-idea/rest-api/routers/api/v1/user" + "github.com/gofiber/fiber/v2" + log "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +func Like(c *fiber.Ctx) error { + state := c.Params("state") + db := database.DB + + user, err := user.GetUserBySessionId(c.Cookies(config.Cfg.Settings.Cookies.SessionId)) + + if err != nil { + return c.SendStatus(fiber.StatusInternalServerError) + } + + if state == "1" { + // create if like + db.Create(&structs.PictureLike{UserId: user.Id, PictureId: c.Params("pictureId"), LikedAt: time.Now()}) + } else { + // delete if unlike + db.Where("user_id = ?", user.Id).Where("picture_id = ?", c.Params("pictureId")).Delete(&structs.PictureLike{}) + } + + err = db.Transaction(func(tx *gorm.DB) error { + picture := &structs.Picture{} + + if err := tx.First(&picture, "picture_id = ?", c.Params("pictureId")).Error; err != nil { + log.Infoln("here1", err) + return err + } + + if state == "1" { + // like + err = tx.Model(&picture).Where("picture_id = ?", c.Params("pictureId")).Update("likes", picture.Likes+1).Error + } else { + // unlike + err = tx.Model(&picture).Where("picture_id = ?", c.Params("pictureId")).Update("likes", picture.Likes-1).Error + + } + + if err != nil { + log.Debugln("err update picture likes:", err) + return err + } + + return nil + }) + + if err != nil { + log.Infoln("err picture like transaction", err) + return c.SendStatus(fiber.StatusInternalServerError) + } + + return c.SendStatus(fiber.StatusOK) +}