Some checks failed
CI / Build & Test (push) Failing after 33s
- 37 个端点全部添加 godoc Swagger 注解(RBAC 11 / Org 5 / Audit 1 / Settings 7 / Notification 7) - 重新生成 docs/(swagger.json/yaml/docs.go) - M8 质量横切:IP 限流、安全头、Body 限制、结构化日志增强、优雅关闭 - 新增 Dockerfile 多阶段构建 + .dockerignore - 新增 testutil 测试工具包 - 修复 testutil.go 编译错误
145 lines
4.1 KiB
Go
145 lines
4.1 KiB
Go
package interfaces
|
|
|
|
import (
|
|
"mengstack/internal/kernel/response"
|
|
"mengstack/internal/modules/org/application"
|
|
"mengstack/internal/modules/org/domain"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type Handler struct {
|
|
svc *application.Service
|
|
}
|
|
|
|
func NewHandler(svc *application.Service) *Handler {
|
|
return &Handler{svc: svc}
|
|
}
|
|
|
|
// CreateTenant godoc
|
|
// @Summary 创建租户
|
|
// @Description 创建新的租户(组织),需提供名称和 slug
|
|
// @Tags Org
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body domain.CreateTenantRequest true "租户信息"
|
|
// @Success 200 {object} response.Response{data=domain.TenantDTO}
|
|
// @Failure 400 {object} response.Response
|
|
// @Failure 409 {object} response.Response
|
|
// @Security Bearer
|
|
// @Security TenantID
|
|
// @Router /api/v1/org/tenants [post]
|
|
func (h *Handler) CreateTenant(c *gin.Context) {
|
|
var req domain.CreateTenantRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.Fail(c, response.NewBadRequest("invalid request body"))
|
|
return
|
|
}
|
|
|
|
dto, err := h.svc.CreateTenant(c.Request.Context(), req)
|
|
if err != nil {
|
|
response.HandleError(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, dto)
|
|
}
|
|
|
|
// ListTenants godoc
|
|
// @Summary 列出所有租户
|
|
// @Description 获取系统中的所有租户列表
|
|
// @Tags Org
|
|
// @Produce json
|
|
// @Success 200 {object} response.Response{data=[]domain.TenantDTO}
|
|
// @Failure 500 {object} response.Response
|
|
// @Security Bearer
|
|
// @Security TenantID
|
|
// @Router /api/v1/org/tenants [get]
|
|
func (h *Handler) ListTenants(c *gin.Context) {
|
|
dtos, err := h.svc.ListTenants(c.Request.Context())
|
|
if err != nil {
|
|
response.HandleError(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, dtos)
|
|
}
|
|
|
|
// GetTenant godoc
|
|
// @Summary 获取租户详情
|
|
// @Description 根据 ID 获取指定租户的详细信息
|
|
// @Tags Org
|
|
// @Produce json
|
|
// @Param id path string true "租户 ID (UUID)"
|
|
// @Success 200 {object} response.Response{data=domain.TenantDTO}
|
|
// @Failure 400 {object} response.Response
|
|
// @Failure 404 {object} response.Response
|
|
// @Security Bearer
|
|
// @Security TenantID
|
|
// @Router /api/v1/org/tenants/{id} [get]
|
|
func (h *Handler) GetTenant(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
dto, err := h.svc.GetTenant(c.Request.Context(), id)
|
|
if err != nil {
|
|
response.HandleError(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, dto)
|
|
}
|
|
|
|
// UpdateTenant godoc
|
|
// @Summary 更新租户
|
|
// @Description 更新租户的名称、slug 或状态
|
|
// @Tags Org
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "租户 ID (UUID)"
|
|
// @Param request body domain.UpdateTenantRequest true "更新内容"
|
|
// @Success 200 {object} response.Response{data=domain.TenantDTO}
|
|
// @Failure 400 {object} response.Response
|
|
// @Failure 404 {object} response.Response
|
|
// @Security Bearer
|
|
// @Security TenantID
|
|
// @Router /api/v1/org/tenants/{id} [put]
|
|
func (h *Handler) UpdateTenant(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
var req domain.UpdateTenantRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.Fail(c, response.NewBadRequest("invalid request body"))
|
|
return
|
|
}
|
|
|
|
dto, err := h.svc.UpdateTenant(c.Request.Context(), id, req)
|
|
if err != nil {
|
|
response.HandleError(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, dto)
|
|
}
|
|
|
|
// DeleteTenant godoc
|
|
// @Summary 删除租户
|
|
// @Description 删除指定租户及其所有关联数据
|
|
// @Tags Org
|
|
// @Param id path string true "租户 ID (UUID)"
|
|
// @Success 200 {object} response.Response
|
|
// @Failure 400 {object} response.Response
|
|
// @Failure 404 {object} response.Response
|
|
// @Security Bearer
|
|
// @Security TenantID
|
|
// @Router /api/v1/org/tenants/{id} [delete]
|
|
func (h *Handler) DeleteTenant(c *gin.Context) {
|
|
id := c.Param("id")
|
|
|
|
if err := h.svc.DeleteTenant(c.Request.Context(), id); err != nil {
|
|
response.HandleError(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, nil)
|
|
}
|