Files
nl-blogs/server/repositories/column_repository.go
2026-01-19 16:14:08 +08:00

187 lines
5.2 KiB
Go

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
}