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", }) } // ListLogs handles GET /api/v1/audit func (h *AuditHandler) ListLogs(c *fiber.Ctx) error { limit := c.QueryInt("limit", 50) offset := c.QueryInt("offset", 0) logs, err := h.repo.FindAll(c.Context(), limit, offset) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": "Failed to retrieve audit logs", }) } return c.JSON(fiber.Map{ "items": logs, "limit": limit, "offset": offset, }) }