diff --git a/internal/repository/music.go b/internal/repository/music.go new file mode 100644 index 0000000..be444af --- /dev/null +++ b/internal/repository/music.go @@ -0,0 +1,92 @@ +package repository + +import ( + "gotest/internal/model" + + "gorm.io/gorm" +) + +// MusicRepository 音乐数据访问层 +type MusicRepository struct { + db *gorm.DB +} + +// NewMusicRepository 创建音乐仓库实例 +func NewMusicRepository(db *gorm.DB) *MusicRepository { + return &MusicRepository{db: db} +} + +// ListCategories 获取音乐分类列表 +func (r *MusicRepository) ListCategories() ([]model.MusicCategory, error) { + var categories []model.MusicCategory + if err := r.db.Order("sort ASC, id ASC").Find(&categories).Error; err != nil { + return nil, err + } + return categories, nil +} + +// ListSongs 获取歌曲列表,支持分类过滤、关键词搜索和排序 +func (r *MusicRepository) ListSongs(categoryID uint, keyword string, sort string, page, pageSize int) ([]model.Song, int64, error) { + var songs []model.Song + var total int64 + + query := r.db.Where("status = 1") + if categoryID > 0 { + query = query.Where("category_id = ?", categoryID) + } + if keyword != "" { + query = query.Where("title LIKE ? OR artist LIKE ? OR album LIKE ? OR tags LIKE ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") + } + + if err := query.Model(&model.Song{}).Count(&total).Error; err != nil { + return nil, 0, err + } + + switch sort { + case "plays": + query = query.Order("play_count DESC") + case "likes": + query = query.Order("like_count DESC") + case "newest": + query = query.Order("release_date DESC") + default: + query = query.Order("sort ASC, id DESC") + } + + if page > 0 && pageSize > 0 { + offset := (page - 1) * pageSize + query = query.Offset(offset).Limit(pageSize) + } + + if err := query.Find(&songs).Error; err != nil { + return nil, 0, err + } + return songs, total, nil +} + +// GetSong 根据 ID 获取歌曲详情 +func (r *MusicRepository) GetSong(id uint) (*model.Song, error) { + var song model.Song + if err := r.db.First(&song, id).Error; err != nil { + return nil, err + } + return &song, nil +} + +// ListHotSongs 获取热门歌曲 +func (r *MusicRepository) ListHotSongs(limit int) ([]model.Song, error) { + var songs []model.Song + if err := r.db.Where("status = 1 AND is_hot = true").Order("play_count DESC").Limit(limit).Find(&songs).Error; err != nil { + return nil, err + } + return songs, nil +} + +// ListNewSongs 获取新歌 +func (r *MusicRepository) ListNewSongs(limit int) ([]model.Song, error) { + var songs []model.Song + if err := r.db.Where("status = 1 AND is_new = true").Order("release_date DESC").Limit(limit).Find(&songs).Error; err != nil { + return nil, err + } + return songs, nil +}