mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 02:32:57 +00:00
dev day #100 - WE ARE FUCKING DONE, hotfixes incoming but we did it in 100 days, lets fucking go guys, anyone reading this...i love you
This commit is contained in:
@@ -10,7 +10,6 @@ import (
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
|
||||
"fotbal-club/internal/models"
|
||||
"fotbal-club/internal/services"
|
||||
@@ -166,14 +165,37 @@ func (cc *CommentController) React(c *gin.Context) {
|
||||
}
|
||||
|
||||
uidv, _ := c.Get("userID")
|
||||
userID := uidv.(uint)
|
||||
var userID uint
|
||||
switch v := uidv.(type) {
|
||||
case uint:
|
||||
userID = v
|
||||
case int:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case int64:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case float64:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case string:
|
||||
if n, err := strconv.Atoi(strings.TrimSpace(v)); err == nil && n > 0 { userID = uint(n) }
|
||||
}
|
||||
if userID == 0 {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
|
||||
return
|
||||
}
|
||||
|
||||
// Atomic upsert: enforce single reaction per (comment_id, user_id)
|
||||
r := models.CommentReaction{CommentID: cm.ID, UserID: userID, Type: rt}
|
||||
if err := cc.DB.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "comment_id"}, {Name: "user_id"}},
|
||||
DoUpdates: clause.Assignments(map[string]interface{}{"type": rt, "updated_at": time.Now()}),
|
||||
}).Create(&r).Error; err != nil {
|
||||
// Robust upsert without relying on a DB unique constraint: delete then insert in a transaction
|
||||
if err := cc.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// Remove any previous reaction by this user on this comment
|
||||
if err := tx.Where("comment_id = ? AND user_id = ?", cm.ID, userID).Delete(&models.CommentReaction{}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// Insert the new reaction
|
||||
r := models.CommentReaction{CommentID: cm.ID, UserID: userID, Type: rt}
|
||||
if err := tx.Create(&r).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to react"})
|
||||
return
|
||||
}
|
||||
@@ -194,7 +216,24 @@ func (cc *CommentController) Unreact(c *gin.Context) {
|
||||
// Ensure reactions table exists (best-effort)
|
||||
_ = cc.DB.AutoMigrate(&models.CommentReaction{})
|
||||
uidv, _ := c.Get("userID")
|
||||
_ = cc.DB.Where("comment_id = ? AND user_id = ?", cm.ID, uidv.(uint)).Delete(&models.CommentReaction{}).Error
|
||||
var userID uint
|
||||
switch v := uidv.(type) {
|
||||
case uint:
|
||||
userID = v
|
||||
case int:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case int64:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case float64:
|
||||
if v > 0 { userID = uint(v) }
|
||||
case string:
|
||||
if n, err := strconv.Atoi(strings.TrimSpace(v)); err == nil && n > 0 { userID = uint(n) }
|
||||
}
|
||||
if userID == 0 {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
|
||||
return
|
||||
}
|
||||
_ = cc.DB.Where("comment_id = ? AND user_id = ?", cm.ID, userID).Delete(&models.CommentReaction{}).Error
|
||||
c.JSON(http.StatusOK, gin.H{"ok": true})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user