package repositories import ( "log" "time" "github.com/niangaodev/art-code/config" "github.com/niangaodev/art-code/models" "gorm.io/gorm" ) // GetColumns 获取所有专栏 func GetColumns() ([]models.Column, error) { var columns []models.Column err := config.DB.Model(&models.Column{}). Where("deleted_at = ?", 0). Order("sort_order ASC, created_at DESC"). Find(&columns).Error if err != nil { log.Printf("Error querying columns: %v", err) return nil, err } return columns, nil } // GetColumnByID 根据ID获取专栏 func GetColumnByID(id uint) (*models.Column, error) { var col models.Column err := config.DB.Model(&models.Column{}). Where("id = ? AND deleted_at = ?", id, 0). First(&col).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } log.Printf("Error getting column by ID: %v", err) return nil, err } return &col, nil } // GetColumnStats 获取专栏统计信息(文章数量和最近更新时间) func GetColumnStats(columnID uint) (int64, int64, error) { var postCount int64 // 统计文章数量 err := config.DB.Model(&models.Post{}). Joins("JOIN column_posts cp ON posts.id = cp.post_id"). Where("cp.column_id = ? AND posts.deleted_at = ? AND posts.is_published = ?", columnID, 0, 1). Count(&postCount).Error if err != nil { log.Printf("Error counting posts for column: %v", err) return 0, 0, err } // 获取最近更新时间 var lastUpdated int64 if postCount > 0 { err = config.DB.Model(&models.Post{}). Select("COALESCE(MAX(posts.updated_at), 0)"). Joins("JOIN column_posts cp ON posts.id = cp.post_id"). Where("cp.column_id = ? AND posts.deleted_at = ? AND posts.is_published = ?", columnID, 0, 1). Scan(&lastUpdated).Error if err != nil { log.Printf("Error getting last updated time for column: %v", err) // 如果查询失败,使用专栏的更新时间 var col models.Column if err2 := config.DB.Model(&models.Column{}). Select("updated_at"). Where("id = ?", columnID). First(&col).Error; err2 == nil { lastUpdated = col.UpdatedAt } } } else { // 如果没有文章,使用专栏的更新时间 var col models.Column if err := config.DB.Model(&models.Column{}). Select("updated_at"). Where("id = ?", columnID). First(&col).Error; err == nil { lastUpdated = col.UpdatedAt } } return postCount, lastUpdated, nil } // BuildColumnResponse 构建专栏响应(包含统计信息) func BuildColumnResponse(col *models.Column) map[string]interface{} { postCount, lastUpdated, _ := GetColumnStats(col.ID) return map[string]interface{}{ "id": col.ID, "name": col.Name, "description": col.Description, "cover": col.Cover, "isActive": col.IsActive, "sortOrder": col.SortOrder, "createdAt": col.CreatedAt, "updatedAt": col.UpdatedAt, "deletedAt": col.DeletedAt, "postCount": postCount, "lastUpdated": lastUpdated, } } // CreateColumn 创建专栏 func CreateColumn(col *models.Column) error { err := config.DB.Create(col).Error if err != nil { log.Printf("Error creating column: %v", err) return err } return nil } // UpdateColumn 更新专栏 func UpdateColumn(col *models.Column) error { err := config.DB.Model(&models.Column{}). Where("id = ? AND deleted_at = ?", col.ID, 0). Updates(map[string]interface{}{ "name": col.Name, "description": col.Description, "cover": col.Cover, "is_active": col.IsActive, "sort_order": col.SortOrder, "updated_at": time.Now().Unix(), }).Error if err != nil { log.Printf("Error updating column: %v", err) return err } return nil } // DeleteColumn 删除专栏 func DeleteColumn(id uint) error { err := config.DB.Model(&models.Column{}). Where("id = ?", id). Update("deleted_at", time.Now().Unix()).Error if err != nil { log.Printf("Error deleting column: %v", err) return err } return nil } // GetPostsByColumnID 获取专栏下的文章 func GetPostsByColumnID(columnID uint) ([]models.Post, error) { var posts []models.Post err := config.DB.Model(&models.Post{}). Select("posts.*, categories.name as category_name"). Joins("JOIN column_posts cp ON posts.id = cp.post_id"). Joins("LEFT JOIN categories ON posts.category_id = categories.id"). Where("cp.column_id = ? AND posts.deleted_at = ? AND posts.is_published = ?", columnID, 0, 1). Order("cp.sort_order ASC, posts.created_at DESC"). Find(&posts).Error if err != nil { log.Printf("Error querying posts by column ID: %v", err) return nil, err } return posts, nil } // AddPostToColumn 添加文章到专栏 func AddPostToColumn(columnID, postID, sortOrder uint) error { columnPost := &models.ColumnPost{ ColumnID: columnID, PostID: postID, SortOrder: sortOrder, CreatedAt: time.Now().Unix(), } // 使用 Clauses 处理 ON DUPLICATE KEY UPDATE err := config.DB.Where("column_id = ? AND post_id = ?", columnID, postID). Assign(models.ColumnPost{SortOrder: sortOrder}). FirstOrCreate(columnPost).Error return err } // RemovePostFromColumn 从专栏移除文章 func RemovePostFromColumn(columnID, postID uint) error { err := config.DB.Where("column_id = ? AND post_id = ?", columnID, postID). Delete(&models.ColumnPost{}).Error return err }