Files
nl-blogs/server/repositories/column_repository.go
2026-01-16 17:03:34 +08:00

223 lines
5.3 KiB
Go

package repositories
import (
"database/sql"
"log"
"time"
"github.com/niangaodev/art-code/config"
"github.com/niangaodev/art-code/models"
)
// GetColumns 获取所有专栏
func GetColumns() ([]models.Column, error) {
query := "SELECT id, name, description, cover, is_active, sort_order, created_at, updated_at, deleted_at FROM columns WHERE deleted_at = 0 ORDER BY sort_order ASC, created_at DESC"
rows, err := config.DB.Query(query)
if err != nil {
log.Printf("Error querying columns: %v", err)
return nil, err
}
defer rows.Close()
var columns []models.Column
for rows.Next() {
var col models.Column
var description sql.NullString // Use NullString
var cover sql.NullString // Use NullString
if err := rows.Scan(
&col.ID,
&col.Name,
&description,
&cover,
&col.IsActive,
&col.SortOrder,
&col.CreatedAt,
&col.UpdatedAt,
&col.DeletedAt,
); err != nil {
log.Printf("Error scanning column: %v", err)
continue
}
if description.Valid {
col.Description = description.String
}
if cover.Valid {
col.Cover = cover.String
}
columns = append(columns, col)
}
return columns, nil
}
// GetColumnByID 根据ID获取专栏
func GetColumnByID(id uint) (*models.Column, error) {
query := "SELECT id, name, description, cover, is_active, sort_order, created_at, updated_at, deleted_at FROM columns WHERE id = ? AND deleted_at = 0"
row := config.DB.QueryRow(query, id)
var col models.Column
var description sql.NullString // Use NullString
var cover sql.NullString // Use NullString
if err := row.Scan(
&col.ID,
&col.Name,
&description,
&cover,
&col.IsActive,
&col.SortOrder,
&col.CreatedAt,
&col.UpdatedAt,
&col.DeletedAt,
); err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
log.Printf("Error scanning column by ID: %v", err)
return nil, err
}
if description.Valid {
col.Description = description.String
}
if cover.Valid {
col.Cover = cover.String
}
return &col, nil
}
// CreateColumn 创建专栏
func CreateColumn(col *models.Column) error {
now := time.Now().Unix()
query := `
INSERT INTO columns (name, description, cover, is_active, sort_order, created_at, updated_at, deleted_at)
VALUES (?, ?, ?, ?, ?, ?, ?, 0)
`
result, err := config.DB.Exec(
query,
col.Name,
col.Description,
col.Cover,
col.IsActive,
col.SortOrder,
now,
now,
)
if err != nil {
log.Printf("Error creating column: %v", err)
return err
}
id, err := result.LastInsertId()
if err != nil {
return err
}
col.ID = uint(id)
col.CreatedAt = now
col.UpdatedAt = now
return nil
}
// UpdateColumn 更新专栏
func UpdateColumn(col *models.Column) error {
now := time.Now().Unix()
query := `
UPDATE columns SET name = ?, description = ?, cover = ?, is_active = ?, sort_order = ?, updated_at = ?
WHERE id = ? AND deleted_at = 0
`
_, err := config.DB.Exec(
query,
col.Name,
col.Description,
col.Cover,
col.IsActive,
col.SortOrder,
now,
col.ID,
)
if err != nil {
log.Printf("Error updating column: %v", err)
return err
}
return nil
}
// DeleteColumn 删除专栏
func DeleteColumn(id uint) error {
now := time.Now().Unix()
query := "UPDATE columns SET deleted_at = ? WHERE id = ?"
_, err := config.DB.Exec(query, now, id)
if err != nil {
log.Printf("Error deleting column: %v", err)
return err
}
return nil
}
// GetPostsByColumnID 获取专栏下的文章
func GetPostsByColumnID(columnID uint) ([]models.Post, error) {
query := `
SELECT p.id, p.title, p.category_id, c.name as category_name, p.excerpt, p.content, p.read_count, p.is_published, p.created_at, p.updated_at, p.deleted_at
FROM posts p
JOIN column_posts cp ON p.id = cp.post_id
LEFT JOIN categories c ON p.category_id = c.id
WHERE cp.column_id = ? AND p.deleted_at = 0 AND p.is_published = 1
ORDER BY cp.sort_order ASC, p.created_at DESC
`
rows, err := config.DB.Query(query, columnID)
if err != nil {
log.Printf("Error querying posts by column ID: %v", err)
return nil, err
}
defer rows.Close()
var posts []models.Post
for rows.Next() {
var post models.Post
var categoryName sql.NullString
if err := rows.Scan(
&post.ID,
&post.Title,
&post.CategoryID,
&categoryName,
&post.Excerpt,
&post.Content,
&post.ReadCount,
&post.IsPublished,
&post.CreatedAt,
&post.UpdatedAt,
&post.DeletedAt,
); err != nil {
log.Printf("Error scanning post: %v", err)
continue
}
if categoryName.Valid {
post.Category = &models.Category{ID: post.CategoryID, Name: categoryName.String}
}
posts = append(posts, post)
}
return posts, nil
}
// AddPostToColumn 添加文章到专栏
func AddPostToColumn(columnID, postID, sortOrder uint) error {
now := time.Now().Unix()
// Check if exists first to avoid duplicates or use INSERT IGNORE/REPLACE if simple
// Assuming unique key on (column_id, post_id)
query := `
INSERT INTO column_posts (column_id, post_id, sort_order, created_at)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE sort_order = VALUES(sort_order)
`
_, err := config.DB.Exec(query, columnID, postID, sortOrder, now)
return err
}
// RemovePostFromColumn 从专栏移除文章
func RemovePostFromColumn(columnID, postID uint) error {
query := "DELETE FROM column_posts WHERE column_id = ? AND post_id = ?"
_, err := config.DB.Exec(query, columnID, postID)
return err
}