package repository import ( "gotest/internal/model" "gorm.io/gorm" ) // AppRepository 应用数据访问层 type AppRepository struct { db *gorm.DB } // NewAppRepository 创建应用仓库实例 func NewAppRepository(db *gorm.DB) *AppRepository { return &AppRepository{db: db} } // ListCategories 获取应用分类列表 func (r *AppRepository) ListCategories() ([]model.AppCategory, error) { var categories []model.AppCategory if err := r.db.Order("sort ASC, id ASC").Find(&categories).Error; err != nil { return nil, err } return categories, nil } // ListApps 获取应用列表,支持分类过滤、关键词搜索和排序 func (r *AppRepository) ListApps(categoryID uint, keyword string, sort string, page, pageSize int) ([]model.App, int64, error) { var apps []model.App var total int64 query := r.db.Where("status = 1") if categoryID > 0 { query = query.Where("category_id = ?", categoryID) } if keyword != "" { query = query.Where("name LIKE ? OR tags LIKE ? OR developer LIKE ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") } if err := query.Model(&model.App{}).Count(&total).Error; err != nil { return nil, 0, err } switch sort { case "rating": query = query.Order("rating DESC") case "downloads": query = query.Order("downloads DESC") case "newest": query = query.Order("update_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(&apps).Error; err != nil { return nil, 0, err } return apps, total, nil } // GetApp 根据 ID 获取应用详情 func (r *AppRepository) GetApp(id uint) (*model.App, error) { var app model.App if err := r.db.First(&app, id).Error; err != nil { return nil, err } return &app, nil } // ListFeaturedApps 获取精选应用 func (r *AppRepository) ListFeaturedApps(limit int) ([]model.App, error) { var apps []model.App if err := r.db.Where("status = 1 AND is_featured = true").Order("downloads DESC").Limit(limit).Find(&apps).Error; err != nil { return nil, err } return apps, nil } // ListNewApps 获取新上架应用 func (r *AppRepository) ListNewApps(limit int) ([]model.App, error) { var apps []model.App if err := r.db.Where("status = 1 AND is_new = true").Order("update_date DESC").Limit(limit).Find(&apps).Error; err != nil { return nil, err } return apps, nil }