Files
seanime-docker/seanime-2.9.10/internal/handlers/report.go
2025-09-20 14:08:38 +01:00

94 lines
2.6 KiB
Go

package handlers
import (
"bytes"
"encoding/json"
"fmt"
"seanime/internal/database/db_bridge"
"seanime/internal/library/anime"
"seanime/internal/report"
"time"
"github.com/labstack/echo/v4"
)
// HandleSaveIssueReport
//
// @summary saves the issue report in memory.
// @route /api/v1/report/issue [POST]
// @returns bool
func (h *Handler) HandleSaveIssueReport(c echo.Context) error {
type body struct {
ClickLogs []*report.ClickLog `json:"clickLogs"`
NetworkLogs []*report.NetworkLog `json:"networkLogs"`
ReactQueryLogs []*report.ReactQueryLog `json:"reactQueryLogs"`
ConsoleLogs []*report.ConsoleLog `json:"consoleLogs"`
IsAnimeLibraryIssue bool `json:"isAnimeLibraryIssue"`
}
var b body
if err := c.Bind(&b); err != nil {
return h.RespondWithError(c, err)
}
var localFiles []*anime.LocalFile
if b.IsAnimeLibraryIssue {
// Get local files
var err error
localFiles, _, err = db_bridge.GetLocalFiles(h.App.Database)
if err != nil {
return h.RespondWithError(c, err)
}
}
status := h.NewStatus(c)
if err := h.App.ReportRepository.SaveIssueReport(report.SaveIssueReportOptions{
LogsDir: h.App.Config.Logs.Dir,
UserAgent: c.Request().Header.Get("User-Agent"),
ClickLogs: b.ClickLogs,
NetworkLogs: b.NetworkLogs,
ReactQueryLogs: b.ReactQueryLogs,
ConsoleLogs: b.ConsoleLogs,
Settings: h.App.Settings,
DebridSettings: h.App.SecondarySettings.Debrid,
IsAnimeLibraryIssue: b.IsAnimeLibraryIssue,
LocalFiles: localFiles,
ServerStatus: status,
}); err != nil {
return h.RespondWithError(c, err)
}
return h.RespondWithData(c, true)
}
// HandleDownloadIssueReport
//
// @summary generates and downloads the issue report file.
// @route /api/v1/report/issue/download [GET]
// @returns report.IssueReport
func (h *Handler) HandleDownloadIssueReport(c echo.Context) error {
issueReport, ok := h.App.ReportRepository.GetSavedIssueReport()
if !ok {
return h.RespondWithError(c, fmt.Errorf("no issue report found"))
}
marshaledIssueReport, err := json.Marshal(issueReport)
if err != nil {
return h.RespondWithError(c, fmt.Errorf("failed to marshal issue report: %w", err))
}
buffer := bytes.Buffer{}
buffer.Write(marshaledIssueReport)
// Generate filename with current timestamp
filename := fmt.Sprintf("issue_report_%s.json", time.Now().Format("2006-01-02_15-04-05"))
c.Response().Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
c.Response().Header().Set("Content-Type", "application/json")
return c.Stream(200, "application/json", &buffer)
}