Files
AzuTear 6b3b0360e7
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 1m1s
CI - Build & Verify / Deploy to award.noveria.net (push) Successful in 1m30s
Add winner archive, host image upload and live demo data
Deliver the demo-ready feature set and seed data so the live site can be
presented end to end:

- Winner archive: ArchivedWinner domain, admin CRUD endpoints/view/manager
  and public archive surface, backed by AddArchivedWinners migration.
- Host presentation: host image upload and artist name on SiteSettings with
  public image endpoint and supporting migrations.
- Clip submissions: idempotent table-ensure migration plus current-season
  demo clips for review workflows.
- Demo seed data: sponsors, share links and 2025 archived winners, with a
  guarded RemoveDemoSeasons cleanup; all seeds guard against real data.
- EnsureRuntimeSchemaParity migration to align runtime schema defensively.
- Admin/home UI refinements; remove unused team role permissions modal and
  dead share-quick-links code.

All seed and schema migrations are idempotent (IF NOT EXISTS / ON CONFLICT)
and skip when real season data is present.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:47:52 +02:00

78 lines
4.8 KiB
C#

namespace Backend.Domain;
public sealed class SiteSettings
{
public int Id { get; set; }
public string HostDisplayName { get; set; } = string.Empty;
public string HostTagline { get; set; } = string.Empty;
public string HostArtistName { get; set; } = string.Empty;
public byte[]? HostImageData { get; set; }
public string? HostImageContentType { get; set; }
public DateTimeOffset? HostImageUpdatedAt { get; set; }
public string NewsletterUrl { get; set; } = string.Empty;
public string ShareXUrl { get; set; } = string.Empty;
public string ShareDiscordUrl { get; set; } = string.Empty;
public string PrivacyEmail { get; set; } = string.Empty;
public string PrivacyPolicyContent { get; set; } = string.Empty;
public string? PrivacyPolicyUpdatedBy { get; set; }
public DateTimeOffset? PrivacyPolicyUpdatedAt { get; set; }
public string ImprintUrl { get; set; } = string.Empty;
public string ImprintContent { get; set; } = string.Empty;
public string ContactUrl { get; set; } = string.Empty;
public string ContactContent { get; set; } = string.Empty;
public string SponsorsUrl { get; set; } = string.Empty;
public string SponsorsContent { get; set; } = string.Empty;
public string ShowactsUrl { get; set; } = string.Empty;
public string ShowactsContent { get; set; } = string.Empty;
public string StreamBannerEyebrow { get; set; } = "Das grosse Finale";
public string StreamBannerTitle { get; set; } = "Award-Show Finale";
public string StreamBannerText { get; set; } = string.Empty;
public string StreamBannerLiveButtonLabel { get; set; } = "Jetzt live · Zum Stream";
public string StreamBannerLiveButtonUrl { get; set; } = string.Empty;
public string StreamBannerLockedButtonLabel { get; set; } = "Stream noch gesperrt";
public bool StreamBannerUseCompletedContent { get; set; }
public string StreamBannerCompletedEyebrow { get; set; } = "Danke fürs Mitfiebern";
public string StreamBannerCompletedTitle { get; set; } = "Award-Show abgeschlossen";
public string StreamBannerCompletedText { get; set; } = "Die grosse Award-Show ist vorbei. Danke an alle, die live dabei waren.";
public string StreamBannerCompletedButtonLabel { get; set; } = "Highlights ansehen";
public string StreamBannerCompletedButtonUrl { get; set; } = string.Empty;
public string AwardsSectionTitle { get; set; } = string.Empty;
public string AwardsSectionDescription { get; set; } = string.Empty;
public string SubcategoriesSectionTitle { get; set; } = string.Empty;
public string SubcategoriesSectionDescription { get; set; } = string.Empty;
public string SocialLinksJson { get; set; } = "[]";
public string FaqJson { get; set; } = "[]";
public string RiskRulesJson { get; set; } = "[]";
public string WorkflowRulesJson { get; set; } = "[]";
public string TrackingRulesJson { get; set; } = "[]";
public string ViewerStatsProviderBaseUrl { get; set; } = string.Empty;
public string TrackingReviewNotes { get; set; } = string.Empty;
public string NominationLinkBlacklistJson { get; set; } = "[]";
public bool ClipSubmissionsEnabled { get; set; }
public bool ClipReviewEnabled { get; set; } = true;
public bool ClipAdminMenuVisible { get; set; } = true;
public string ClipSubmissionDisabledMessage { get; set; } = "Clip-Einreichungen sind aktuell geschlossen.";
public bool ShowactApplicationsEnabled { get; set; }
public DateOnly? ShowactApplicationStartsAt { get; set; }
public DateOnly? ShowactApplicationEndsAt { get; set; }
public string ShowactApplicationDisabledMessage { get; set; } = "Showact-Bewerbungen sind aktuell geschlossen.";
public string ShowactFormSchemaJson { get; set; } = "[]";
public bool SponsorsVisible { get; set; } = true;
public bool DemoLoginManagedByDatabase { get; set; }
public bool DemoLoginEnabled { get; set; }
public string DemoLoginEmail { get; set; } = string.Empty;
public string DemoLoginPasswordHash { get; set; } = string.Empty;
public string DemoLoginPasswordSalt { get; set; } = string.Empty;
public string DemoLoginTwitchUserId { get; set; } = "jayuhime_admin";
public string DemoLoginDisplayName { get; set; } = "Jayuhime Admin";
public bool TwitchAuthManagedByDatabase { get; set; }
public string TwitchClientId { get; set; } = string.Empty;
public string TwitchClientSecret { get; set; } = string.Empty;
public string TwitchRedirectUri { get; set; } = string.Empty;
public string TwitchScope { get; set; } = string.Empty;
public int SessionIdleTimeoutHours { get; set; } = 3;
public bool MaintenanceModeEnabled { get; set; }
public string MaintenanceTitle { get; set; } = "Sternenpause";
public string MaintenanceMessage { get; set; } = "Die Award-Galaxie wird gerade liebevoll poliert. Schau gleich wieder vorbei.";
}