forked from baron/baron-sso
49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"baron-sso-backend/internal/domain"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type AuditHandler struct {
|
|
repo domain.AuditRepository
|
|
}
|
|
|
|
func NewAuditHandler(repo domain.AuditRepository) *AuditHandler {
|
|
return &AuditHandler{repo: repo}
|
|
}
|
|
|
|
// CreateLog handles POST /api/v1/audit
|
|
func (h *AuditHandler) CreateLog(c *fiber.Ctx) error {
|
|
var req domain.AuditLog
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "Cannot parse JSON",
|
|
})
|
|
}
|
|
|
|
// Auto-fill metadata if missing
|
|
if req.IPAddress == "" {
|
|
req.IPAddress = c.IP()
|
|
}
|
|
if req.UserAgent == "" {
|
|
req.UserAgent = c.Get("User-Agent")
|
|
}
|
|
if req.Timestamp.IsZero() {
|
|
req.Timestamp = time.Now()
|
|
}
|
|
|
|
if err := h.repo.Create(&req); err != nil {
|
|
// Log internal error but don't expose details
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": "Failed to save audit log",
|
|
})
|
|
}
|
|
|
|
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
|
|
"message": "Audit log saved",
|
|
})
|
|
}
|