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

209 lines
4.9 KiB
Go

package repositories
import (
"database/sql"
"log"
"time"
"github.com/niangaodev/art-code/config"
"github.com/niangaodev/art-code/models"
)
// GetSnippets 获取所有代码片段
func GetSnippets() ([]models.Snippet, error) {
query := "SELECT id, title, code, type, description, view_count, created_at, updated_at, deleted_at FROM snippets WHERE deleted_at = 0 ORDER BY created_at DESC"
rows, err := config.DB.Query(query)
if err != nil {
log.Printf("Error querying snippets: %v", err)
return nil, err
}
defer rows.Close()
var snippets []models.Snippet
for rows.Next() {
var snippet models.Snippet
if err := rows.Scan(
&snippet.ID,
&snippet.Title,
&snippet.Code,
&snippet.Type,
&snippet.Description,
&snippet.ViewCount,
&snippet.CreatedAt,
&snippet.UpdatedAt,
&snippet.DeletedAt,
); err != nil {
log.Printf("Error scanning snippet: %v", err)
continue
}
snippets = append(snippets, snippet)
}
return snippets, nil
}
// GetSnippetByID 根据ID获取代码片段
func GetSnippetByID(id string) (*models.Snippet, error) {
query := "SELECT id, title, code, type, description, view_count, created_at, updated_at, deleted_at FROM snippets WHERE id = ? AND deleted_at = 0"
row := config.DB.QueryRow(query, id)
var snippet models.Snippet
if err := row.Scan(
&snippet.ID,
&snippet.Title,
&snippet.Code,
&snippet.Type,
&snippet.Description,
&snippet.ViewCount,
&snippet.CreatedAt,
&snippet.UpdatedAt,
&snippet.DeletedAt,
); err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
log.Printf("Error scanning snippet by ID: %v", err)
return nil, err
}
// 更新查看次数
updateViewCountQuery := "UPDATE snippets SET view_count = view_count + 1 WHERE id = ?"
if _, err := config.DB.Exec(updateViewCountQuery, id); err != nil {
log.Printf("Error updating snippet view count: %v", err)
}
return &snippet, nil
}
// BuildSnippetResponse 构建代码片段响应
func BuildSnippetResponse(snippet *models.Snippet) *models.SnippetResponse {
return &models.SnippetResponse{
ID: snippet.ID,
Title: snippet.Title,
Code: snippet.Code,
Type: snippet.Type,
}
}
// BuildSnippetsResponse 构建代码片段列表响应
func BuildSnippetsResponse(snippets []models.Snippet) []models.SnippetResponse {
var responses []models.SnippetResponse
for _, snippet := range snippets {
responses = append(responses, *BuildSnippetResponse(&snippet))
}
return responses
}
// CreateSnippet 创建代码片段
func CreateSnippet(snippet *models.Snippet) error {
now := time.Now().Unix()
query := `
INSERT INTO snippets (id, title, code, type, description, view_count, created_at, updated_at, deleted_at)
VALUES (?, ?, ?, ?, ?, 0, ?, ?, 0)
`
_, err := config.DB.Exec(
query,
snippet.ID,
snippet.Title,
snippet.Code,
snippet.Type,
snippet.Description,
now,
now,
)
if err != nil {
log.Printf("Error creating snippet: %v", err)
return err
}
return nil
}
// UpdateSnippet 更新代码片段
func UpdateSnippet(snippet *models.Snippet) error {
now := time.Now().Unix()
query := `
UPDATE snippets SET title = ?, code = ?, type = ?, description = ?, updated_at = ?
WHERE id = ? AND deleted_at = 0
`
_, err := config.DB.Exec(
query,
snippet.Title,
snippet.Code,
snippet.Type,
snippet.Description,
now,
snippet.ID,
)
if err != nil {
log.Printf("Error updating snippet: %v", err)
return err
}
return nil
}
// DeleteSnippet 删除代码片段 (Soft Delete)
func DeleteSnippet(id string) error {
now := time.Now().Unix()
query := "UPDATE snippets SET deleted_at = ? WHERE id = ?"
_, err := config.DB.Exec(query, now, id)
if err != nil {
log.Printf("Error deleting snippet: %v", err)
return err
}
return nil
}
// GetAdminSnippets 获取后台代码片段列表 (分页)
func GetAdminSnippets(page, pageSize int) ([]models.Snippet, int, error) {
offset := (page - 1) * pageSize
// 获取总数
var total int
countQuery := "SELECT COUNT(*) FROM snippets WHERE deleted_at = 0"
err := config.DB.QueryRow(countQuery).Scan(&total)
if err != nil {
log.Printf("Error getting snippet count: %v", err)
return nil, 0, err
}
// 获取列表
query := `
SELECT id, title, code, type, description, view_count, created_at, updated_at, deleted_at
FROM snippets
WHERE deleted_at = 0
ORDER BY created_at DESC
LIMIT ? OFFSET ?
`
rows, err := config.DB.Query(query, pageSize, offset)
if err != nil {
log.Printf("Error querying admin snippets: %v", err)
return nil, 0, err
}
defer rows.Close()
var snippets []models.Snippet
for rows.Next() {
var snippet models.Snippet
if err := rows.Scan(
&snippet.ID,
&snippet.Title,
&snippet.Code,
&snippet.Type,
&snippet.Description,
&snippet.ViewCount,
&snippet.CreatedAt,
&snippet.UpdatedAt,
&snippet.DeletedAt,
); err != nil {
log.Printf("Error scanning snippet: %v", err)
continue
}
snippets = append(snippets, snippet)
}
return snippets, total, nil
}