server: Go 服务器(REST+WSS 网关+JWT+Argon2+配对+素材直链+任务状态机);修复并发下线 send-on-closed-channel、下发查询 SQL 优先级、配对码原子占用、上传体积上限、JWT 默认密钥告警

This commit is contained in:
Qiufeng
2026-08-20 20:38:21 +08:00
parent bf25d8beac
commit cc8845dcec
44 changed files with 4995 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
package handlers
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"everypublish/server/internal/api/response"
"everypublish/server/internal/models"
)
// WorkspaceHandler 工作空间处理器
type WorkspaceHandler struct {
DB *gorm.DB
}
type workspaceReq struct {
Name string `json:"name" binding:"required"`
}
// Create 创建工作空间(创建者为 owner)
func (h *WorkspaceHandler) Create(c *gin.Context) {
var req workspaceReq
if err := c.ShouldBindJSON(&req); err != nil {
response.Fail(c, http.StatusBadRequest, 1001, "参数不合法")
return
}
var ws models.Workspace
err := h.DB.Transaction(func(tx *gorm.DB) error {
ws = models.Workspace{Name: req.Name, OwnerID: c.GetUint64("uid"), Plan: "free", Status: "active"}
if err := tx.Create(&ws).Error; err != nil {
return err
}
member := models.Member{WorkspaceID: ws.ID, UserID: c.GetUint64("uid"), Role: "owner"}
return tx.Create(&member).Error
})
if err != nil {
response.Fail(c, http.StatusInternalServerError, 5000, "创建失败")
return
}
response.Audit(c, "workspace.create", "workspace:"+itoa(ws.ID), gin.H{"name": req.Name})
response.OK(c, ws)
}
// List 我所在的工作空间
func (h *WorkspaceHandler) List(c *gin.Context) {
var members []models.Member
h.DB.Where("user_id = ?", c.GetUint64("uid")).Find(&members)
ids := make([]uint64, 0, len(members))
for _, m := range members {
ids = append(ids, m.WorkspaceID)
}
var list []models.Workspace
if len(ids) > 0 {
h.DB.Where("id in ?", ids).Order("id asc").Find(&list)
}
response.OK(c, gin.H{"list": list})
}
// Update 修改工作空间资料(owner/admin)
func (h *WorkspaceHandler) Update(c *gin.Context) {
if !isAdminRole(c.GetString("mrole")) {
response.Fail(c, http.StatusForbidden, 1003, "仅管理员可修改工作空间")
return
}
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
if err != nil {
response.Fail(c, http.StatusBadRequest, 1001, "参数不合法")
return
}
var req workspaceReq
if err = c.ShouldBindJSON(&req); err != nil {
response.Fail(c, http.StatusBadRequest, 1001, "参数不合法")
return
}
if err = h.DB.Model(&models.Workspace{}).Where("id = ?", id).Update("name", req.Name).Error; err != nil {
response.Fail(c, http.StatusInternalServerError, 5000, "更新失败")
return
}
response.Audit(c, "workspace.update", "workspace:"+itoa(id), gin.H{"name": req.Name})
response.OK(c, nil)
}