Files
urldb/handlers/resource_handler.go
2025-07-17 14:08:52 +08:00

262 lines
6.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handlers
import (
"net/http"
"strconv"
"github.com/ctwj/panResManage/db/converter"
"github.com/ctwj/panResManage/db/dto"
"github.com/ctwj/panResManage/db/entity"
"github.com/gin-gonic/gin"
)
// GetResources 获取资源列表
func GetResources(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
categoryID := c.Query("category_id")
panID := c.Query("pan_id")
search := c.Query("search")
var resources []entity.Resource
var total int64
var err error
// 设置响应头,启用缓存
c.Header("Cache-Control", "public, max-age=300") // 5分钟缓存
if search != "" && panID != "" {
// 平台内搜索
panIDUint, _ := strconv.ParseUint(panID, 10, 32)
resources, total, err = repoManager.ResourceRepository.SearchByPanID(search, uint(panIDUint), page, pageSize)
} else if search != "" {
// 全局搜索
resources, total, err = repoManager.ResourceRepository.Search(search, nil, page, pageSize)
} else if panID != "" {
// 按平台筛选
panIDUint, _ := strconv.ParseUint(panID, 10, 32)
resources, total, err = repoManager.ResourceRepository.FindByPanIDPaginated(uint(panIDUint), page, pageSize)
} else if categoryID != "" {
// 按分类筛选
categoryIDUint, _ := strconv.ParseUint(categoryID, 10, 32)
resources, total, err = repoManager.ResourceRepository.FindByCategoryIDPaginated(uint(categoryIDUint), page, pageSize)
} else {
// 使用分页查询,避免加载所有数据
resources, total, err = repoManager.ResourceRepository.FindWithRelationsPaginated(page, pageSize)
}
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{
"resources": converter.ToResourceResponseList(resources),
"total": total,
"page": page,
"page_size": pageSize,
})
}
// GetResourceByID 根据ID获取资源
func GetResourceByID(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
resource, err := repoManager.ResourceRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "资源不存在", http.StatusNotFound)
return
}
response := converter.ToResourceResponse(resource)
SuccessResponse(c, response)
}
// CheckResourceExists 检查资源是否存在测试FindExists函数
func CheckResourceExists(c *gin.Context) {
url := c.Query("url")
if url == "" {
ErrorResponse(c, "URL参数不能为空", http.StatusBadRequest)
return
}
excludeIDStr := c.Query("exclude_id")
var excludeID uint
if excludeIDStr != "" {
if id, err := strconv.ParseUint(excludeIDStr, 10, 32); err == nil {
excludeID = uint(id)
}
}
exists, err := repoManager.ResourceRepository.FindExists(url, excludeID)
if err != nil {
ErrorResponse(c, "检查失败: "+err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{
"url": url,
"exists": exists,
})
}
// CreateResource 创建资源
func CreateResource(c *gin.Context) {
var req dto.CreateResourceRequest
if err := c.ShouldBindJSON(&req); err != nil {
ErrorResponse(c, err.Error(), http.StatusBadRequest)
return
}
resource := &entity.Resource{
Title: req.Title,
Description: req.Description,
URL: req.URL,
PanID: req.PanID,
QuarkURL: req.QuarkURL,
FileSize: req.FileSize,
CategoryID: req.CategoryID,
IsValid: req.IsValid,
IsPublic: req.IsPublic,
}
err := repoManager.ResourceRepository.Create(resource)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
// 处理标签关联
if len(req.TagIDs) > 0 {
err = repoManager.ResourceRepository.UpdateWithTags(resource, req.TagIDs)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
}
SuccessResponse(c, gin.H{
"message": "资源创建成功",
"resource": converter.ToResourceResponse(resource),
})
}
// UpdateResource 更新资源
func UpdateResource(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
var req dto.UpdateResourceRequest
if err := c.ShouldBindJSON(&req); err != nil {
ErrorResponse(c, err.Error(), http.StatusBadRequest)
return
}
resource, err := repoManager.ResourceRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "资源不存在", http.StatusNotFound)
return
}
// 更新资源信息
if req.Title != "" {
resource.Title = req.Title
}
if req.Description != "" {
resource.Description = req.Description
}
if req.URL != "" {
resource.URL = req.URL
}
if req.PanID != nil {
resource.PanID = req.PanID
}
if req.QuarkURL != "" {
resource.QuarkURL = req.QuarkURL
}
if req.FileSize != "" {
resource.FileSize = req.FileSize
}
if req.CategoryID != nil {
resource.CategoryID = req.CategoryID
}
resource.IsValid = req.IsValid
resource.IsPublic = req.IsPublic
// 处理标签关联
if len(req.TagIDs) > 0 {
err = repoManager.ResourceRepository.UpdateWithTags(resource, req.TagIDs)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
} else {
err = repoManager.ResourceRepository.Update(resource)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
}
SuccessResponse(c, gin.H{"message": "资源更新成功"})
}
// DeleteResource 删除资源
func DeleteResource(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
err = repoManager.ResourceRepository.Delete(uint(id))
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{"message": "资源删除成功"})
}
// SearchResources 搜索资源
func SearchResources(c *gin.Context) {
query := c.Query("q")
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
var resources []entity.Resource
var total int64
var err error
if query == "" {
// 搜索关键词为空时,返回最新记录(分页)
resources, total, err = repoManager.ResourceRepository.FindWithRelationsPaginated(page, pageSize)
} else {
// 有搜索关键词时,执行搜索
resources, total, err = repoManager.ResourceRepository.Search(query, nil, page, pageSize)
}
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{
"resources": converter.ToResourceResponseList(resources),
"total": total,
"page": page,
"page_size": pageSize,
})
}