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) }