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 id != c.GetUint64("wsid") { response.Fail(c, http.StatusNotFound, 1004, "工作空间不存在") 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) }