Files
vtuber-awards/Backend/Contracts/AdminSeasonContracts.cs
T
AzuTear b53c7fb736 Add viewer-range categories, nomination tracking, dynamic showact form, session timeout, share URLs, and workflow-per-season
Features:
- Category viewer ranges + subcategory templates (admin group modal, tree workspace)
- Nomination enrichment via TwitchTracker API (NominationEnrichmentService,
  TwitchTrackerViewerStatsProvider) with admin tracking rules editor
- Nomination group tracker: CategoryGroupName as primary identifier,
  CategoryId stays as nullable legacy field; StreamerIdentity table
- Dynamic showact application form builder (AdminShowactFormBuilder,
  ShowactApplicationSchedule)
- Session idle timeout setting (AdminSessionTimeoutCard)
- Share URLs for X and Discord (SiteSettings, public extras)
- Workflow rules now stored per season (falls back to global SiteSettings)
- New admin routes: settings/access, settings/workflows, tracking-rules
- New admin review workspace with subcategory tabs
- AdminCategoriesView rebuilt with group/subcategory modals

Migrations (all additive):
- AddShareUrls, AddShowactDynamicForm, AddCategoryViewerRanges,
  AddSessionIdleTimeoutSettings, AddSeasonSubcategoryTemplates,
  AddNominationGroupTrackerIdentity, AddShowactApplicationSchedule,
  AddSeasonWorkflowRulesJson

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 23:32:21 +02:00

149 lines
3.9 KiB
C#

namespace Backend.Contracts;
public sealed record AdminSeasonListItemDto(
int Id,
int Year,
string Name,
string CurrentPhase,
bool IsCurrent,
int CategoryCount);
public sealed record AdminCategoryItemDto(
int Id,
string GroupName,
string Name,
string Slug,
string Description,
int SortOrder,
int MaxNomineesPerUser,
int? ViewerRangeMin,
int? ViewerRangeMax,
int CandidateCount);
public sealed record AdminSubcategoryTemplateDto(
string Name,
string Slug,
int SortOrder,
int? ViewerRangeMin,
int? ViewerRangeMax);
public sealed record AdminCandidateItemDto(
int Id,
int CategoryId,
int? StreamerIdentityId,
string DisplayName,
string ChannelSlug,
string Platform,
int NominationTally,
string AcceptanceStatus,
string? AcceptanceNote,
string? ClipCompilationUrl,
string? ClipCompilationTitle,
string? ClipCompilationPlatform,
string ClipEmbedStatus);
public sealed record AdminAwardResultItemDto(
int Id,
int CategoryId,
string CategoryName,
int CandidateId,
int? StreamerIdentityId,
string CandidateDisplayName,
string CandidateChannelSlug,
string CandidatePlatform);
public sealed record AdminSeasonDetailResponse(
int Id,
int Year,
string Name,
string ShowStreamUrl,
string CurrentPhase,
bool IsCurrent,
bool IsCommunityOnly,
DateOnly NominationStartsAt,
DateOnly NominationEndsAt,
DateOnly VotingStartsAt,
DateOnly VotingEndsAt,
DateOnly ReviewStartsAt,
DateOnly ReviewEndsAt,
DateOnly ShowDate,
TimeOnly ShowStartsAt,
IEnumerable<AdminSubcategoryTemplateDto> SubcategoryTemplates,
IEnumerable<AdminCategoryItemDto> Categories,
IEnumerable<AdminCandidateItemDto> Candidates,
IEnumerable<AdminNominationReviewItemDto> PendingNominations,
IEnumerable<AdminNominationReviewGroupDto> PendingNominationGroups,
IEnumerable<AdminNominationReviewItemDto> ReviewedNominations,
string TrackingReviewNotes,
bool ShowTrackingReviewNotes,
IEnumerable<AdminAwardResultItemDto> Results,
IEnumerable<AdminClipSubmissionItemDto> ClipSubmissions);
public sealed record CreateSeasonRequest(
int Year,
string Name,
string ShowStreamUrl,
string CurrentPhase,
bool IsCurrent,
bool IsCommunityOnly,
DateOnly NominationStartsAt,
DateOnly NominationEndsAt,
DateOnly VotingStartsAt,
DateOnly VotingEndsAt,
DateOnly ReviewStartsAt,
DateOnly ReviewEndsAt,
DateOnly ShowDate,
TimeOnly ShowStartsAt,
int? CopyStructureFromSeasonId = null);
public sealed record UpdateSeasonRequest(
int Year,
string Name,
string ShowStreamUrl,
string CurrentPhase,
bool IsCurrent,
bool IsCommunityOnly,
DateOnly NominationStartsAt,
DateOnly NominationEndsAt,
DateOnly VotingStartsAt,
DateOnly VotingEndsAt,
DateOnly ReviewStartsAt,
DateOnly ReviewEndsAt,
DateOnly ShowDate,
TimeOnly ShowStartsAt);
public sealed record UpsertCategoryRequest(
string GroupName,
string Name,
string Slug,
string Description,
int SortOrder,
int MaxNomineesPerUser,
int? ViewerRangeMin,
int? ViewerRangeMax);
public sealed record UpdateSeasonSubcategoryTemplatesRequest(
AdminSubcategoryTemplateDto[] Templates);
public sealed record UpsertCategoryGroupRequest(
string GroupName,
string Description,
int SortOrder,
int MaxNomineesPerUser);
public sealed record UpsertCandidateRequest(
int CategoryId,
string DisplayName,
string ChannelSlug,
string Platform,
string? AcceptanceStatus = null,
string? AcceptanceNote = null,
string? ClipCompilationUrl = null,
string? ClipCompilationTitle = null,
string? ClipCompilationPlatform = null,
string? ClipEmbedStatus = null);
public sealed record SetAwardResultRequest(
int CategoryId,
int CandidateId);