Files
2026-08-14 13:32:14 +12:00

85 lines
4.1 KiB
Go

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
}