server: Go 服务器(REST+WSS 网关+JWT+Argon2+配对+素材直链+任务状态机);修复并发下线 send-on-closed-channel、下发查询 SQL 优先级、配对码原子占用、上传体积上限、JWT 默认密钥告警
This commit is contained in:
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user