61 lines
1.7 KiB
Go
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,
|
|
})
|
|
}
|