package store import ( "context" "fmt" "time" ) type MediaReport struct { ID int64 `json:"id"` EmbyItemID string `json:"embyItemId"` MediaType string `json:"mediaType"` Title string `json:"title"` SeriesTitle string `json:"seriesTitle,omitempty"` SeasonNumber int `json:"seasonNumber,omitempty"` EpisodeNumber int `json:"episodeNumber,omitempty"` Reason string `json:"reason"` Comment string `json:"comment,omitempty"` ReportedByUserID string `json:"reportedByUserId"` ReportedByUsername string `json:"reportedByUsername"` ReportedByDevice string `json:"reportedByDevice,omitempty"` ReplacementRequested bool `json:"replacementRequested"` ReplacementStatus string `json:"replacementStatus,omitempty"` Status string `json:"status"` ArrItemID int `json:"arrItemId,omitempty"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` Actions []MediaReportAction `json:"actions,omitempty"` } type MediaReportAction struct { ID int64 `json:"id"` Action string `json:"action"` Detail string `json:"detail,omitempty"` Actor string `json:"actor,omitempty"` CreatedAt time.Time `json:"createdAt"` } func (s *Store) CreateMediaReport(ctx context.Context, report MediaReport) (MediaReport, error) { err := s.pool.QueryRow(ctx, `INSERT INTO media_reports (emby_item_id, media_type, title, series_title, season_number, episode_number, reason, comment, reported_by_user_id, reported_by_username, reported_by_device, replacement_requested) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) RETURNING id, status, created_at, updated_at`, report.EmbyItemID, report.MediaType, report.Title, report.SeriesTitle, report.SeasonNumber, report.EpisodeNumber, report.Reason, report.Comment, report.ReportedByUserID, report.ReportedByUsername, report.ReportedByDevice, report.ReplacementRequested, ).Scan(&report.ID, &report.Status, &report.CreatedAt, &report.UpdatedAt) if err != nil { return report, fmt.Errorf("store: create media report: %w", err) } _, err = s.pool.Exec(ctx, `INSERT INTO media_report_actions (report_id, action, actor) VALUES ($1, 'reported', $2)`, report.ID, report.ReportedByUsername) if err != nil { return report, fmt.Errorf("store: record media report action: %w", err) } return report, nil } func (s *Store) MediaReports(ctx context.Context) ([]MediaReport, error) { rows, err := s.pool.Query(ctx, `SELECT id, emby_item_id, media_type, title, series_title, season_number, episode_number, reason, comment, reported_by_user_id, reported_by_username, reported_by_device, replacement_requested, replacement_status, status, arr_item_id, created_at, updated_at FROM media_reports ORDER BY created_at DESC`) if err != nil { return nil, fmt.Errorf("store: list media reports: %w", err) } defer rows.Close() reports := []MediaReport{} for rows.Next() { var r MediaReport if err := rows.Scan(&r.ID, &r.EmbyItemID, &r.MediaType, &r.Title, &r.SeriesTitle, &r.SeasonNumber, &r.EpisodeNumber, &r.Reason, &r.Comment, &r.ReportedByUserID, &r.ReportedByUsername, &r.ReportedByDevice, &r.ReplacementRequested, &r.ReplacementStatus, &r.Status, &r.ArrItemID, &r.CreatedAt, &r.UpdatedAt); err != nil { return nil, fmt.Errorf("store: scan media report: %w", err) } reports = append(reports, r) } return reports, rows.Err() } func (s *Store) SetMediaReportStatus(ctx context.Context, id int64, status, actor string) error { _, err := s.pool.Exec(ctx, `UPDATE media_reports SET status=$2, updated_at=now() WHERE id=$1`, id, status) if err != nil { return fmt.Errorf("store: update media report: %w", err) } _, err = s.pool.Exec(ctx, `INSERT INTO media_report_actions (report_id, action, actor) VALUES ($1,$2,$3)`, id, status, actor) return err }