89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
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)
|
||
}
|