223 lines
5.3 KiB
Go
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
|
|
}
|