From 57c9a162f6ed9755fd00e8ac85d3fd2bd12a58d7 Mon Sep 17 00:00:00 2001 From: ata <17314593+asdxzaaaaa@user.noreply.gitee.com> Date: Fri, 10 Jul 2026 10:06:15 +0000 Subject: [PATCH] Add internal/repository/app.go --- internal/repository/app.go | 92 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 internal/repository/app.go diff --git a/internal/repository/app.go b/internal/repository/app.go new file mode 100644 index 0000000..c6df231 --- /dev/null +++ b/internal/repository/app.go @@ -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 +}