feat(*): 工作台界面 - 优化插件中心、管理侧栏及画布与短剧列表
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"infinite-canvas/backend/internal/service"
|
||||
|
||||
@@ -29,12 +31,33 @@ func RegisterProjectRoutes(r *gin.RouterGroup, svc *service.Service) {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
projects, err := svc.ListProjects(user.ID)
|
||||
pageParam, hasPage := c.GetQuery("page")
|
||||
pageSizeParam, hasPageSize := c.GetQuery("page_size")
|
||||
if !hasPage && !hasPageSize {
|
||||
projects, err := svc.ListProjects(user.ID)
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
ok(c, gin.H{"projects": projects})
|
||||
return
|
||||
}
|
||||
page, err := parsePositiveQueryInt(pageParam, 1)
|
||||
if err != nil {
|
||||
fail(c, http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
pageSize, err := parsePositiveQueryInt(pageSizeParam, 50)
|
||||
if err != nil {
|
||||
fail(c, http.StatusBadRequest, err)
|
||||
return
|
||||
}
|
||||
projects, err := svc.ListProjectsPage(user.ID, page, pageSize)
|
||||
if err != nil {
|
||||
failService(c, err)
|
||||
return
|
||||
}
|
||||
ok(c, gin.H{"projects": projects})
|
||||
ok(c, projects)
|
||||
})
|
||||
r.POST("/projects", func(c *gin.Context) {
|
||||
user, err := currentUser(c, svc)
|
||||
@@ -713,3 +736,14 @@ func RegisterProjectRoutes(r *gin.RouterGroup, svc *service.Service) {
|
||||
ok(c, gin.H{"asset": asset})
|
||||
})
|
||||
}
|
||||
|
||||
func parsePositiveQueryInt(value string, fallback int) (int, error) {
|
||||
if value == "" {
|
||||
return fallback, nil
|
||||
}
|
||||
parsed, err := strconv.Atoi(value)
|
||||
if err != nil || parsed < 1 {
|
||||
return 0, fmt.Errorf("query parameter must be a positive integer")
|
||||
}
|
||||
return parsed, nil
|
||||
}
|
||||
|
||||
@@ -982,6 +982,19 @@ func (r *Repository) Projects(userID string) ([]model.Project, error) {
|
||||
return projects, err
|
||||
}
|
||||
|
||||
func (r *Repository) ProjectsPage(userID string, page int, pageSize int) ([]model.Project, int64, error) {
|
||||
var projects []model.Project
|
||||
var total int64
|
||||
query := r.db.Model(&model.Project{}).Where("user_id = ?", userID)
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
if err := query.Order("updated_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&projects).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return projects, total, nil
|
||||
}
|
||||
|
||||
func (r *Repository) ProjectForUser(userID string, id string) (*model.Project, error) {
|
||||
var project model.Project
|
||||
if err := r.db.First(&project, "id = ? AND user_id = ?", id, userID).Error; err != nil {
|
||||
|
||||
@@ -69,6 +69,14 @@ type ProjectSummary struct {
|
||||
CompletedUnitCount int `json:"completedUnitCount"`
|
||||
}
|
||||
|
||||
type ProjectListPage struct {
|
||||
Projects []ProjectSummary `json:"projects"`
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"pageSize"`
|
||||
Total int64 `json:"total"`
|
||||
HasMore bool `json:"hasMore"`
|
||||
}
|
||||
|
||||
type ProjectDetail struct {
|
||||
Project model.Project `json:"project"`
|
||||
Units []model.ProjectUnit `json:"units"`
|
||||
@@ -87,6 +95,22 @@ func (s *Service) ListProjects(userID string) ([]ProjectSummary, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.summarizeProjects(userID, projects)
|
||||
}
|
||||
|
||||
func (s *Service) ListProjectsPage(userID string, page int, pageSize int) (ProjectListPage, error) {
|
||||
projects, total, err := s.repo.ProjectsPage(userID, page, pageSize)
|
||||
if err != nil {
|
||||
return ProjectListPage{}, err
|
||||
}
|
||||
result, err := s.summarizeProjects(userID, projects)
|
||||
if err != nil {
|
||||
return ProjectListPage{}, err
|
||||
}
|
||||
return ProjectListPage{Projects: result, Page: page, PageSize: pageSize, Total: total, HasMore: int64(page*pageSize) < total}, nil
|
||||
}
|
||||
|
||||
func (s *Service) summarizeProjects(userID string, projects []model.Project) ([]ProjectSummary, error) {
|
||||
result := make([]ProjectSummary, 0, len(projects))
|
||||
for _, project := range projects {
|
||||
units, unitsErr := s.repo.ProjectUnitSummaries(project.ID)
|
||||
|
||||
Reference in New Issue
Block a user