2026-05-02 13:02:38 +08:00

61 lines
1.7 KiB
Go

package shared
import (
"hyapp-admin-server/internal/middleware"
"hyapp-admin-server/internal/model"
"github.com/gin-gonic/gin"
)
type OperationEvent struct {
RequestID string
UserID uint
Username string
Action string
Resource string
ResourceID string
Method string
Path string
IP string
UserAgent string
Status string
HTTPStatus int
RiskLevel string
LatencyMS int64
Detail string
}
type OperationLogger interface {
CreateOperationLog(log model.OperationLog) error
LogOperation(event OperationEvent) error
}
func OperationLog(c *gin.Context, logger OperationLogger, action string, resource string, status string, detail string) {
OperationLogWithResourceID(c, logger, action, resource, c.Param("id"), status, detail)
}
// OperationLogWithResourceID is the explicit audit entry point for routes whose target id
// does not use the shared ":id" path parameter name.
func OperationLogWithResourceID(c *gin.Context, logger OperationLogger, action string, resource string, resourceID string, status string, detail string) {
if logger == nil {
return
}
// MarkAuditLogged keeps middleware from creating a second generic row for this write.
middleware.MarkAuditLogged(c)
_ = logger.LogOperation(OperationEvent{
RequestID: middleware.CurrentRequestID(c),
UserID: middleware.CurrentUserID(c),
Username: middleware.CurrentUsername(c),
Action: action,
Resource: resource,
ResourceID: resourceID,
Method: c.Request.Method,
Path: c.Request.URL.Path,
IP: c.ClientIP(),
UserAgent: c.Request.UserAgent(),
Status: status,
HTTPStatus: c.Writer.Status(),
Detail: detail,
})
}