Add internal/repository/app.go
This commit is contained in:
92
internal/repository/app.go
Normal file
92
internal/repository/app.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user