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) }