mengstack-api/internal/modules/org/interfaces/handler.go
MengStack Dev b13427e76c feat(org,audit): M4 组织管理 + 审计日志
org 模块:
- tenants 表 (UUID PK, name, slug, status, settings)
- 完整 CRUD API: /api/v1/org/tenants
- 多租户隔离

audit 模块:
- audit_logs 表 (actor, action, resource, IP, 时间)
- 查询 API: /api/v1/audit/logs (支持分页+筛选)
- 按 tenant_id/user_id/action/resource 过滤
2026-10-03 00:58:49 +08:00

85 lines
1.6 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}
}
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)
}
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)
}
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)
}
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)
}
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)
}