feat: port remaining Vue UI surfaces with full backend support

Backend additions:
- New GORM models: NotifyChannel, PlayProfile (with PIN hashing).
- NotifyChannelService: multi-channel CRUD + unified dispatcher
  supporting Telegram / Bark / WeChat / Webhook with optional
  per-channel event filtering.
- PlayProfileService: per-user 'viewing personas' with
  content-rating gates, library scoping, PIN protection, and
  player defaults (autoplay, skip-intro, audio/subtitle prefs).
- New endpoints:
    GET    /admin/notify/channels           list
    POST   /admin/notify/channels           create
    PUT    /admin/notify/channels/:id       update
    DELETE /admin/notify/channels/:id       delete
    POST   /admin/notify/channels/:id/test  send test
    GET    /play-profiles                   list (admin: ?all=true)
    POST   /play-profiles                   create
    PUT    /play-profiles/:id               update
    DELETE /play-profiles/:id               delete
    GET    /media/recent                    home page rail
    GET    /media/stats                     library composition
    GET    /watch-history                   list
    GET    /watch-history/stats             aggregate
    GET    /watch-history/continue          continue-watching rail
    DELETE /watch-history[?media_id=]       clear
    DELETE /watch-history/:id               remove one
    GET    /discover/sections               available rails
    GET    /discover/feed?sections=a,b      multi-section TMDb fetch
    GET    /system/info                     name/version/runtime
    GET    /system/status                   uptime/cpu/mem/disk
    GET    /system/scheduler                read-only scheduler view
    GET    /stats/overview                  counts only
    GET    /stats/trend                     daily plays
    GET    /stats/top-content               most played
    GET    /stats/libraries                 per-library size
    GET    /stats/monitor                   live hardware

Frontend additions:
- New API helpers: notify_channels, play_profiles, history,
  stats_extra, media_extra, discover_extra, system.
- ProfileManagementPage (/play-profiles): full CRUD form with
  PIN management, library scoping, language preferences.
- NotifyChannelsPage (/notify-channels, admin): typed config
  forms per channel type + per-channel test action.
- SettingsPage (/settings, admin): grouped key/value editor
  covering General, Organize/Scrape, Adult, qBittorrent.
- Layout sidebar links and App.tsx routes wired for all three.
This commit is contained in:
Kiro Agent
2026-05-16 09:01:09 +00:00
parent 261d342fa1
commit 7095d9ebec
27 changed files with 3015 additions and 12 deletions
+82
View File
@@ -140,3 +140,85 @@ export interface StatsSnapshot {
hardware: Hardware
generated_at: string
}
// ─── Notify Channels ────────────────────────────────────────────────────────
export interface NotifyChannel {
id: string
name: string
channel_type: 'telegram' | 'wechat' | 'bark' | 'webhook'
config: Record<string, string>
enabled: boolean
events: string[]
created_at: string
updated_at: string
}
// ─── Play Profiles ──────────────────────────────────────────────────────────
export interface PlayProfile {
id: string
user_id: string
name: string
is_default: boolean
content_rating_limit?: string
allow_adult: boolean
require_pin: boolean
preferred_subtitle_lang?: string
preferred_audio_lang?: string
autoplay_next: boolean
skip_intro: boolean
allowed_library_ids: string[]
total_watch_time: number
last_active_at?: string
created_at: string
updated_at: string
}
// ─── History helpers ────────────────────────────────────────────────────────
export interface HistoryItem {
id: string
user_id: string
media_id: string
position_ms: number
duration_ms: number
watched_at: string
completed: boolean
media?: Media
}
export interface HistoryStats {
total: number
completed: number
watched_ms: number
watched_hours: number
last_watched?: string
}
// ─── Discover ───────────────────────────────────────────────────────────────
export interface DiscoverSection {
key: string
label: string
}
export interface DiscoverItem {
TMDbID?: number
Title?: string
Overview?: string
Rating?: number
Year?: number
PosterURL?: string
BackdropURL?: string
// Match struct (Go) is exported with capitalised JSON keys; the API
// returns lower-cased aliases below for convenience.
tmdb_id?: number
title?: string
overview?: string
rating?: number
year?: number
poster_url?: string
backdrop_url?: string
}