Files
ai_dianshang/server/internal/repository/livestream.go
2025-11-28 15:18:10 +08:00

125 lines
3.4 KiB
Go

package repository
import (
"dianshang/internal/model"
"time"
"gorm.io/gorm"
)
type LiveStreamRepository interface {
GetList(page, pageSize int, title, platform string, status *int) ([]model.LiveStream, int64, error)
GetByID(id uint) (*model.LiveStream, error)
GetActiveLiveStreams() ([]model.LiveStream, error)
Create(stream *model.LiveStream) error
Update(id uint, stream *model.LiveStream) error
UpdateStatus(id uint, status int) error
Delete(id uint) error
BatchDelete(ids []uint) error
IncrementViewCount(id uint) error
}
type liveStreamRepository struct {
db *gorm.DB
}
func NewLiveStreamRepository(db *gorm.DB) LiveStreamRepository {
return &liveStreamRepository{db: db}
}
// GetList 获取投流源列表
func (r *liveStreamRepository) GetList(page, pageSize int, title, platform string, status *int) ([]model.LiveStream, int64, error) {
var streams []model.LiveStream
var total int64
query := r.db.Model(&model.LiveStream{})
// 标题筛选
if title != "" {
query = query.Where("title LIKE ?", "%"+title+"%")
}
// 平台筛选
if platform != "" {
query = query.Where("platform = ?", platform)
}
// 状态筛选
if status != nil {
query = query.Where("status = ?", *status)
}
// 统计总数
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
// 分页查询,按排序和创建时间排序
offset := (page - 1) * pageSize
if err := query.Order("sort DESC, created_at DESC").
Limit(pageSize).
Offset(offset).
Find(&streams).Error; err != nil {
return nil, 0, err
}
return streams, total, nil
}
// GetByID 根据ID获取投流源详情
func (r *liveStreamRepository) GetByID(id uint) (*model.LiveStream, error) {
var stream model.LiveStream
if err := r.db.First(&stream, id).Error; err != nil {
return nil, err
}
return &stream, nil
}
// GetActiveLiveStreams 获取所有启用且在有效期内的投流源
func (r *liveStreamRepository) GetActiveLiveStreams() ([]model.LiveStream, error) {
var streams []model.LiveStream
now := time.Now()
query := r.db.Where("status = ?", 1)
// 查询有效时间范围内的投流源
query = query.Where("(start_time IS NULL OR start_time <= ?) AND (end_time IS NULL OR end_time >= ?)", now, now)
if err := query.Order("sort DESC, created_at DESC").Find(&streams).Error; err != nil {
return nil, err
}
return streams, nil
}
// Create 创建投流源
func (r *liveStreamRepository) Create(stream *model.LiveStream) error {
return r.db.Create(stream).Error
}
// Update 更新投流源
func (r *liveStreamRepository) Update(id uint, stream *model.LiveStream) error {
return r.db.Model(&model.LiveStream{}).Where("id = ?", id).Updates(stream).Error
}
// UpdateStatus 更新投流源状态
func (r *liveStreamRepository) UpdateStatus(id uint, status int) error {
return r.db.Model(&model.LiveStream{}).Where("id = ?", id).Update("status", status).Error
}
// Delete 删除投流源
func (r *liveStreamRepository) Delete(id uint) error {
return r.db.Delete(&model.LiveStream{}, id).Error
}
// BatchDelete 批量删除投流源
func (r *liveStreamRepository) BatchDelete(ids []uint) error {
return r.db.Delete(&model.LiveStream{}, ids).Error
}
// IncrementViewCount 增加观看次数
func (r *liveStreamRepository) IncrementViewCount(id uint) error {
return r.db.Model(&model.LiveStream{}).Where("id = ?", id).
UpdateColumn("view_count", gorm.Expr("view_count + ?", 1)).Error
}