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 过滤
54 lines
1.1 KiB
Go
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)
|
|
}
|