mengstack-api/internal/modules/audit/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

54 lines
1.1 KiB
Go

package interfaces
import (
"strconv"
"mengstack/internal/kernel/response"
"mengstack/internal/kernel/tenant"
"mengstack/internal/modules/audit/application"
auditdomain "mengstack/internal/modules/audit/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) ListLogs(c *gin.Context) {
tenantID, _ := tenant.FromContext(c.Request.Context())
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
query := auditdomain.AuditQuery{
TenantID: tenantID,
UserID: parseUintQuery(c, "user_id"),
Action: c.Query("action"),
Resource: c.Query("resource"),
Page: page,
PageSize: pageSize,
}
dtos, total, err := h.svc.Query(c.Request.Context(), query)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, gin.H{
"items": dtos,
"total": total,
"page": page,
})
}
func parseUintQuery(c *gin.Context, key string) uint {
v, _ := strconv.ParseUint(c.DefaultQuery(key, "0"), 10, 64)
return uint(v)
}