Files

85 lines
2.2 KiB
Go

package handlers
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/toyffee/party-mix/internal/models"
"gorm.io/gorm"
)
func GetVersions(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
userID := currentUserID(c)
var rows []models.UserVersion
if err := db.Where("user_id = ?", userID).Find(&rows).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
result := make(map[string]gin.H, len(rows))
for _, r := range rows {
result[r.TrackTitle] = gin.H{
"title": r.VersionTitle,
"artist": r.VersionArtist,
"duration": r.VersionDuration,
}
}
c.JSON(http.StatusOK, result)
}
}
type saveVersionReq struct {
TrackTitle string `json:"track_title" binding:"required"`
VersionTitle string `json:"title" binding:"required"`
VersionArtist string `json:"artist"`
VersionDuration string `json:"duration"`
}
func SaveVersion(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
userID := currentUserID(c)
var req saveVersionReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
var row models.UserVersion
err := db.Where("user_id = ? AND track_title = ?", userID, req.TrackTitle).First(&row).Error
if err != nil {
row = models.UserVersion{
ID: uuid.NewString(),
UserID: userID,
TrackTitle: req.TrackTitle,
CreatedAt: time.Now(),
}
}
row.VersionTitle = req.VersionTitle
row.VersionArtist = req.VersionArtist
row.VersionDuration = req.VersionDuration
if err := db.Save(&row).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.Status(http.StatusNoContent)
}
}
type deleteVersionReq struct {
TrackTitle string `json:"track_title" binding:"required"`
}
func DeleteVersion(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
userID := currentUserID(c)
var req deleteVersionReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
db.Where("user_id = ? AND track_title = ?", userID, req.TrackTitle).Delete(&models.UserVersion{})
c.Status(http.StatusNoContent)
}
}