96 lines
2.5 KiB
Go
96 lines
2.5 KiB
Go
package report
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/rs/zerolog"
|
|
"github.com/samber/lo"
|
|
"github.com/samber/mo"
|
|
"runtime"
|
|
"seanime/internal/constants"
|
|
"seanime/internal/database/models"
|
|
"seanime/internal/library/anime"
|
|
)
|
|
|
|
type Repository struct {
|
|
logger *zerolog.Logger
|
|
|
|
savedIssueReport mo.Option[*IssueReport]
|
|
}
|
|
|
|
func NewRepository(logger *zerolog.Logger) *Repository {
|
|
return &Repository{
|
|
logger: logger,
|
|
savedIssueReport: mo.None[*IssueReport](),
|
|
}
|
|
}
|
|
|
|
type SaveIssueReportOptions struct {
|
|
LogsDir string `json:"logsDir"`
|
|
UserAgent string `json:"userAgent"`
|
|
ClickLogs []*ClickLog `json:"clickLogs"`
|
|
NetworkLogs []*NetworkLog `json:"networkLogs"`
|
|
ReactQueryLogs []*ReactQueryLog `json:"reactQueryLogs"`
|
|
ConsoleLogs []*ConsoleLog `json:"consoleLogs"`
|
|
LocalFiles []*anime.LocalFile `json:"localFiles"`
|
|
Settings *models.Settings `json:"settings"`
|
|
DebridSettings *models.DebridSettings `json:"debridSettings"`
|
|
IsAnimeLibraryIssue bool `json:"isAnimeLibraryIssue"`
|
|
ServerStatus interface{} `json:"serverStatus"`
|
|
}
|
|
|
|
func (r *Repository) SaveIssueReport(opts SaveIssueReportOptions) error {
|
|
|
|
var toRedact []string
|
|
if opts.Settings != nil {
|
|
toRedact = opts.Settings.GetSensitiveValues()
|
|
}
|
|
if opts.DebridSettings != nil {
|
|
toRedact = append(toRedact, opts.DebridSettings.GetSensitiveValues()...)
|
|
}
|
|
toRedact = lo.Filter(toRedact, func(s string, _ int) bool {
|
|
return s != ""
|
|
})
|
|
|
|
issueReport, err := NewIssueReport(
|
|
opts.UserAgent,
|
|
constants.Version,
|
|
runtime.GOOS,
|
|
runtime.GOARCH,
|
|
opts.LogsDir,
|
|
opts.IsAnimeLibraryIssue,
|
|
opts.ServerStatus,
|
|
toRedact,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create issue report: %w", err)
|
|
}
|
|
|
|
issueReport.ClickLogs = opts.ClickLogs
|
|
issueReport.NetworkLogs = opts.NetworkLogs
|
|
issueReport.ReactQueryLogs = opts.ReactQueryLogs
|
|
issueReport.ConsoleLogs = opts.ConsoleLogs
|
|
if opts.IsAnimeLibraryIssue {
|
|
for _, localFile := range opts.LocalFiles {
|
|
if localFile.Locked {
|
|
continue
|
|
}
|
|
issueReport.UnlockedLocalFiles = append(issueReport.UnlockedLocalFiles, &UnlockedLocalFile{
|
|
Path: localFile.Path,
|
|
MediaId: localFile.MediaId,
|
|
})
|
|
}
|
|
}
|
|
|
|
r.savedIssueReport = mo.Some(issueReport)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *Repository) GetSavedIssueReport() (*IssueReport, bool) {
|
|
if r.savedIssueReport.IsAbsent() {
|
|
return nil, false
|
|
}
|
|
|
|
return r.savedIssueReport.MustGet(), true
|
|
}
|