init: radio init commit
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package radio
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"sundynix-go/global"
|
||||
"sundynix-go/model/radio"
|
||||
radioReq "sundynix-go/model/radio/request"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type ChannelService struct{}
|
||||
|
||||
// GetChannelList 获取频道列表
|
||||
func (s *ChannelService) GetChannelList(userId string, info radioReq.GetChannelList) ([]radio.RadioChannel, int64, error) {
|
||||
db := global.DB.Model(&radio.RadioChannel{})
|
||||
var list []radio.RadioChannel
|
||||
var total int64
|
||||
|
||||
if info.CategoryId != "" {
|
||||
db = db.Where("category_id = ?", info.CategoryId)
|
||||
}
|
||||
if info.Name != "" {
|
||||
db = db.Where("name LIKE ?", "%"+info.Name+"%")
|
||||
}
|
||||
if info.Status > 0 {
|
||||
db = db.Where("status = ?", info.Status)
|
||||
}
|
||||
|
||||
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("sort ASC").Find(&list).Error
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// 批量查询用户订阅的频道,避免N+1问题
|
||||
if userId != "" {
|
||||
subService := &SubscriptionService{}
|
||||
subscribedChannelIds, _ := subService.GetUserSubscriptionHistory(userId)
|
||||
// 转换为map以便快速查找
|
||||
subscribedMap := make(map[string]bool)
|
||||
for _, cid := range subscribedChannelIds {
|
||||
subscribedMap[cid] = true
|
||||
}
|
||||
// 填充HasSubscribed字段
|
||||
for i := range list {
|
||||
if subscribedMap[list[i].Id] {
|
||||
list[i].HasSubscribed = 1
|
||||
} else {
|
||||
list[i].HasSubscribed = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list, total, nil
|
||||
}
|
||||
|
||||
// GetChannelById 获取频道详情
|
||||
func (s *ChannelService) GetChannelById(userId, id string) (radio.RadioChannel, error) {
|
||||
var channel radio.RadioChannel
|
||||
err := global.DB.Where("id = ?", id).Preload("Cover").First(&channel).Error
|
||||
if err != nil {
|
||||
return channel, err
|
||||
}
|
||||
|
||||
// 填充HasSubscribed字段
|
||||
if userId != "" {
|
||||
subService := &SubscriptionService{}
|
||||
hasSub, _ := subService.HasSubscription(userId, channel.Id)
|
||||
if hasSub {
|
||||
channel.HasSubscribed = 1
|
||||
} else {
|
||||
channel.HasSubscribed = 0
|
||||
}
|
||||
}
|
||||
|
||||
return channel, nil
|
||||
}
|
||||
|
||||
// SaveChannel 保存频道
|
||||
func (s *ChannelService) SaveChannel(req radioReq.SaveChannel) error {
|
||||
channel := radio.RadioChannel{
|
||||
CategoryId: req.CategoryId,
|
||||
Name: req.Name,
|
||||
Description: req.Description,
|
||||
CoverId: req.CoverId,
|
||||
Tags: req.Tags,
|
||||
IsVipOnly: req.IsVipOnly,
|
||||
Sort: req.Sort,
|
||||
Status: req.Status,
|
||||
}
|
||||
return global.DB.Create(&channel).Error
|
||||
}
|
||||
|
||||
// UpdateChannel 更新频道
|
||||
func (s *ChannelService) UpdateChannel(req radioReq.UpdateChannel) error {
|
||||
updates := map[string]interface{}{
|
||||
"category_id": req.CategoryId,
|
||||
"name": req.Name,
|
||||
"description": req.Description,
|
||||
"cover_id": req.CoverId,
|
||||
"tags": req.Tags,
|
||||
"is_vip_only": req.IsVipOnly,
|
||||
"sort": req.Sort,
|
||||
"status": req.Status,
|
||||
}
|
||||
return global.DB.Model(&radio.RadioChannel{}).Where("id = ?", req.Id).Updates(updates).Error
|
||||
}
|
||||
|
||||
// DeleteChannel 删除频道
|
||||
func (s *ChannelService) DeleteChannel(id string) error {
|
||||
return global.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 检查是否有节目使用此频道
|
||||
var count int64
|
||||
tx.Model(&radio.RadioProgram{}).Where("channel_id = ?", id).Count(&count)
|
||||
if count > 0 {
|
||||
return errors.New("该频道下存在节目,无法删除")
|
||||
}
|
||||
return tx.Where("id = ?", id).Delete(&radio.RadioChannel{}).Error
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user