init: radio init commit

This commit is contained in:
Blizzard
2026-02-28 15:56:26 +08:00
parent fc585fa4df
commit d79beb4663
63 changed files with 2540 additions and 6399 deletions
+176
View File
@@ -0,0 +1,176 @@
package radio
import (
"errors"
"sundynix-go/global"
"sundynix-go/model/radio"
radioReq "sundynix-go/model/radio/request"
"gorm.io/gorm"
)
type InteractionService struct{}
// AddHistory 添加收听历史
func (s *InteractionService) AddHistory(userId string, req radioReq.AddHistory) error {
// 先查找是否已存在记录
var history radio.RadioHistory
err := global.DB.Where("user_id = ? AND program_id = ?", userId, req.ProgramId).First(&history).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
// 不存在,创建新记录
history = radio.RadioHistory{
UserId: userId,
ProgramId: req.ProgramId,
Progress: req.Progress,
Duration: req.Duration,
}
return global.DB.Create(&history).Error
}
if err != nil {
return err
}
// 存在,更新进度
return global.DB.Model(&history).Updates(map[string]interface{}{
"progress": req.Progress,
"duration": req.Duration,
}).Error
}
// GetHistoryList 获取收听历史列表
func (s *InteractionService) GetHistoryList(userId string, info radioReq.GetHistoryList) ([]radio.RadioHistory, int64, error) {
db := global.DB.Model(&radio.RadioHistory{}).Where("user_id = ?", userId)
var list []radio.RadioHistory
var total int64
err := db.Count(&total).Error
if err != nil {
return nil, 0, err
}
offset := (info.Current - 1) * info.PageSize
err = db.Offset(offset).Limit(info.PageSize).Order("created_at DESC").Find(&list).Error
return list, total, err
}
// ToggleLike 切换点赞状态
func (s *InteractionService) ToggleLike(userId, programId string) (bool, error) {
var like radio.RadioLike
err := global.DB.Where("user_id = ? AND program_id = ?", userId, programId).First(&like).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
// 未点赞,添加点赞
like = radio.RadioLike{
UserId: userId,
ProgramId: programId,
}
if err := global.DB.Create(&like).Error; err != nil {
return false, err
}
// 增加节目点赞数
global.DB.Model(&radio.RadioProgram{}).Where("id = ?", programId).
UpdateColumn("like_count", gorm.Expr("like_count + ?", 1))
return true, nil
}
if err != nil {
return false, err
}
// 已点赞,取消点赞
if err := global.DB.Delete(&like).Error; err != nil {
return false, err
}
// 减少节目点赞数
global.DB.Model(&radio.RadioProgram{}).Where("id = ?", programId).
UpdateColumn("like_count", gorm.Expr("like_count - ?", 1))
return false, nil
}
// IsLiked 检查是否已点赞
func (s *InteractionService) IsLiked(userId, programId string) (bool, error) {
var count int64
err := global.DB.Model(&radio.RadioLike{}).Where("user_id = ? AND program_id = ?", userId, programId).Count(&count).Error
return count > 0, err
}
// AddFavorite 添加收藏
func (s *InteractionService) AddFavorite(userId, programId string) error {
// 检查是否已收藏
var existing radio.RadioFavorite
err := global.DB.Where("user_id = ? AND program_id = ?", userId, programId).First(&existing).Error
if err == nil {
return errors.New("已经收藏过该节目")
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
favorite := radio.RadioFavorite{
UserId: userId,
ProgramId: programId,
}
return global.DB.Create(&favorite).Error
}
// RemoveFavorite 取消收藏
func (s *InteractionService) RemoveFavorite(userId, programId string) error {
return global.DB.Where("user_id = ? AND program_id = ?", userId, programId).Delete(&radio.RadioFavorite{}).Error
}
// GetFavoriteList 获取收藏列表
func (s *InteractionService) GetFavoriteList(userId string, info radioReq.GetFavoriteList) ([]radio.RadioFavorite, int64, error) {
db := global.DB.Model(&radio.RadioFavorite{}).Where("user_id = ?", userId)
var list []radio.RadioFavorite
var total int64
err := db.Count(&total).Error
if err != nil {
return nil, 0, err
}
offset := (info.Current - 1) * info.PageSize
err = db.Offset(offset).Limit(info.PageSize).Order("created_at DESC").Find(&list).Error
return list, total, err
}
// IsFavorited 检查是否已收藏
func (s *InteractionService) IsFavorited(userId, programId string) (bool, error) {
var count int64
err := global.DB.Model(&radio.RadioFavorite{}).Where("user_id = ? AND program_id = ?", userId, programId).Count(&count).Error
return count > 0, err
}
// AddComment 添加评论
func (s *InteractionService) AddComment(userId string, req radioReq.AddComment) error {
comment := radio.RadioComment{
ProgramId: req.ProgramId,
UserId: userId,
ParentId: req.ParentId,
Content: req.Content,
}
return global.DB.Create(&comment).Error
}
// DeleteComment 删除评论
func (s *InteractionService) DeleteComment(userId, commentId string) error {
return global.DB.Where("id = ? AND user_id = ?", commentId, userId).Delete(&radio.RadioComment{}).Error
}
// GetCommentList 获取评论列表
func (s *InteractionService) GetCommentList(programId string, info radioReq.GetCommentList) ([]radio.RadioComment, int64, error) {
db := global.DB.Model(&radio.RadioComment{}).Where("program_id = ?", programId)
var list []radio.RadioComment
var total int64
err := db.Count(&total).Error
if err != nil {
return nil, 0, err
}
offset := (info.Current - 1) * info.PageSize
err = db.Offset(offset).Limit(info.PageSize).Order("created_at DESC").Find(&list).Error
return list, total, err
}