236 lines
7.3 KiB
Go
236 lines
7.3 KiB
Go
package radio
|
|
|
|
import (
|
|
"errors"
|
|
"sundynix-go/global"
|
|
"sundynix-go/model/radio"
|
|
radioReq "sundynix-go/model/radio/request"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type InteractionService struct{}
|
|
|
|
var InteractionServiceApp = new(InteractionService)
|
|
|
|
// AddHistory 添加收听历史
|
|
func (s *InteractionService) AddHistory(userId string, req radioReq.AddHistory) error {
|
|
// 1. 获取节目信息以拿到 ChannelId (用于日志冗余方便统计)
|
|
var program radio.RadioProgram
|
|
if err := global.DB.Select("id, channel_id").Where("id = ?", req.ProgramId).First(&program).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 2. 写入/更新用户书签 (RadioHistory)
|
|
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,
|
|
}
|
|
if err := global.DB.Create(&history).Error; err != nil {
|
|
return err
|
|
}
|
|
} else if err == nil {
|
|
if err := global.DB.Model(&history).Updates(map[string]interface{}{
|
|
"progress": req.Progress,
|
|
"duration": req.Duration,
|
|
}).Error; err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
return err
|
|
}
|
|
|
|
// 3. 贪婪学习:如果节目表时长为0,且前端传回了有效时长,则自动补全元数据
|
|
if req.Duration > 0 && program.Duration == 0 {
|
|
global.DB.Model(&radio.RadioProgram{}).Where("id = ?", req.ProgramId).Update("duration", req.Duration)
|
|
}
|
|
|
|
// 4. 异步写入不可删除的日志表 (RadioListenLog) 用于趋势统计
|
|
go func() {
|
|
listenLog := radio.RadioListenLog{
|
|
UserId: userId,
|
|
ProgramId: req.ProgramId,
|
|
ChannelId: program.ChannelId,
|
|
Progress: req.Progress,
|
|
Duration: req.Duration,
|
|
}
|
|
global.DB.Create(&listenLog)
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetHistoryList 获取收听历史列表
|
|
func (s *InteractionService) GetHistoryList(userId string, info radioReq.GetHistoryList) ([]radio.RadioHistory, int64, error) {
|
|
db := global.DB.Model(&radio.RadioHistory{}).Where("user_id = ?", userId).Preload("RadioProgram")
|
|
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
|
|
}
|
|
|
|
// GetLikeList 获取点赞列表
|
|
func (s *InteractionService) GetLikeList(userId string, req radioReq.GetLikeList) ([]radio.RadioLike, int64, error) {
|
|
db := global.DB.Model(&radio.RadioLike{}).Where("user_id = ?", userId).Preload("RadioProgram")
|
|
var list []radio.RadioLike
|
|
var total int64
|
|
|
|
err := db.Count(&total).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
offset := (req.Current - 1) * req.PageSize
|
|
err = db.Offset(offset).Limit(req.PageSize).Order("created_at DESC").Find(&list).Error
|
|
return list, total, err
|
|
}
|
|
|
|
// 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).Preload("RadioProgram")
|
|
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
|
|
}
|
|
|
|
func (s *InteractionService) DeleteHistory(userId, programId string) error {
|
|
return global.DB.Where("user_id = ? AND program_id = ?", userId, programId).Delete(&radio.RadioHistory{}).Error
|
|
}
|
|
|
|
func (s *InteractionService) DeleteAllHistory(userId string) error {
|
|
return global.DB.Where("user_id = ?", userId).Delete(&radio.RadioHistory{}).Error
|
|
}
|
|
|
|
func (s *InteractionService) RemoveAllFavorite(userId string) error {
|
|
return global.DB.Where("user_id = ?", userId).Delete(&radio.RadioFavorite{}).Error
|
|
}
|
|
|
|
func (s *InteractionService) RemoveAllLike(userId string) error {
|
|
return global.DB.Where("user_id = ?", userId).Delete(&radio.RadioLike{}).Error
|
|
}
|