Refactor app architecture and clean local artifacts

This commit is contained in:
AzuTear
2026-06-24 23:43:14 +02:00
parent 17134b3b82
commit fef1d36fe8
274 changed files with 37724 additions and 6065 deletions
-115
View File
@@ -1,115 +0,0 @@
namespace Backend.Contracts;
public sealed record AdminMetricDto(string Label, int Value, string Note);
public sealed record AdminActivityDto(string Label, string Age);
public sealed record AdminTopCategoryDto(string Category, int Votes);
public sealed record AdminRiskFlagDto(
int Id,
string Source,
string Type,
string Severity,
string Status,
string Summary,
string? TwitchUserId,
string CreatedFromIp,
DateTimeOffset CreatedAt,
string MetadataJson);
public sealed record AdminAuditEntryDto(
int Id,
string AdminTwitchUserId,
string ActionType,
string EntityType,
string EntityId,
string Summary,
DateTimeOffset CreatedAt);
public sealed record AdminDashboardResponse(
IEnumerable<AdminMetricDto> Metrics,
IEnumerable<AdminActivityDto> Activities,
IEnumerable<AdminTopCategoryDto> TopCategories,
IEnumerable<AdminRiskFlagDto> RiskFlags,
IEnumerable<AdminAuditEntryDto> AuditEntries);
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 CandidateCount);
public sealed record AdminCandidateItemDto(
int Id,
int CategoryId,
string DisplayName,
string ChannelSlug,
string Platform);
public sealed record AdminNominationReviewItemDto(
int Id,
int CategoryId,
string CategoryName,
string SubmittedByTwitchId,
string CandidateText,
DateTimeOffset CreatedAt);
public sealed record AdminClipSubmissionItemDto(
int Id,
int? CategoryId,
string SubmittedByTwitchId,
string ClipUrl,
string Title,
string Creator,
string Platform,
string Status,
DateTimeOffset CreatedAt);
public sealed record AdminSeasonDetailResponse(
int Id,
int Year,
string Name,
string CurrentPhase,
bool IsCurrent,
IEnumerable<AdminCategoryItemDto> Categories,
IEnumerable<AdminCandidateItemDto> Candidates,
IEnumerable<AdminNominationReviewItemDto> PendingNominations,
IEnumerable<AdminClipSubmissionItemDto> ClipSubmissions);
public sealed record UpdateSeasonRequest(
string CurrentPhase,
bool IsCurrent);
public sealed record UpsertCategoryRequest(
string GroupName,
string Name,
string Slug,
string Description,
int SortOrder,
int MaxNomineesPerUser);
public sealed record UpsertCandidateRequest(
int CategoryId,
string DisplayName,
string ChannelSlug,
string Platform);
public sealed record ApproveNominationRequest(
string? DisplayName,
string? ChannelSlug,
string? Platform);
public sealed record ResolveRiskFlagRequest(string Status);
@@ -0,0 +1,14 @@
namespace Backend.Contracts;
public sealed record AdminMetricDto(string Label, int Value, string Note);
public sealed record AdminActivityDto(string Label, string Age);
public sealed record AdminTopCategoryDto(string Category, int Votes);
public sealed record AdminDashboardResponse(
IEnumerable<AdminMetricDto> Metrics,
IEnumerable<AdminActivityDto> Activities,
IEnumerable<AdminTopCategoryDto> TopCategories,
IEnumerable<AdminRiskFlagDto> RiskFlags,
IEnumerable<AdminAuditEntryDto> AuditEntries);
@@ -0,0 +1,118 @@
namespace Backend.Contracts;
public sealed record AdminRiskFlagDto(
int Id,
string Source,
string Type,
string Severity,
string Status,
string Summary,
string? TwitchUserId,
string CreatedFromIp,
DateTimeOffset CreatedAt,
string MetadataJson,
string? ReviewNote,
string? ReviewedByTwitchId,
DateTimeOffset? ReviewedAt,
AdminRiskEntityLinkDto[] EntityLinks);
public sealed record AdminRiskEntityLinkDto(
string Label,
string EntityType,
string EntityId,
string To);
public sealed record AdminRiskCountDto(string Key, int Count);
public sealed record AdminRiskFlagsResponse(
AdminRiskFlagDto[] Items,
int TotalCount,
int ReturnedCount,
int Offset,
int Limit,
bool HasMore,
AdminRiskCountDto[] SeverityCounts,
AdminRiskCountDto[] StatusCounts);
public sealed record AdminAuditEntryDto(
int Id,
string AdminTwitchUserId,
string ActionType,
string EntityType,
string EntityId,
string Summary,
DateTimeOffset CreatedAt,
string MetadataJson,
string CreatedFromIp,
string UserAgent);
public sealed record AdminAuditEntriesResponse(
AdminAuditEntryDto[] Items,
int TotalCount,
int ReturnedCount,
string? NextCursor,
int Limit);
public sealed record AdminNominationReviewItemDto(
int Id,
int CategoryId,
string CategoryName,
string SubmittedByTwitchId,
string CandidateText,
string? StreamUrl,
string Status,
DateTimeOffset CreatedAt,
int? CandidateId,
string? CandidateDisplayName,
string? ReviewNote,
string? ReviewedByTwitchId,
DateTimeOffset? ReviewedAt);
public sealed record AdminClipSubmissionItemDto(
int Id,
int? CategoryId,
int? CandidateId,
string SubmittedByTwitchId,
string ClipUrl,
string Title,
string Creator,
string Platform,
string Status,
DateTimeOffset CreatedAt,
string? ReviewNote,
string? ReviewedByTwitchId,
DateTimeOffset? ReviewedAt);
public sealed record ApproveNominationRequest(
string? DisplayName,
string? ChannelSlug,
string? Platform,
string? ReviewNote);
public sealed record RejectNominationRequest(string? ReviewNote);
public sealed record UpdateClipStatusRequest(
string Status,
string? ReviewNote);
public sealed record ResolveRiskFlagRequest(
string Status,
string? ReviewNote);
public sealed record BulkResolveRiskFlagsRequest(
int[] RiskFlagIds,
string Status,
string? ReviewNote);
public sealed record AdminRiskRuleDto(
string Key,
string Label,
bool Enabled,
int Threshold,
int WindowMinutes,
string Severity,
string Description);
public sealed record AdminRiskRulesResponse(AdminRiskRuleDto[] Rules);
public sealed record UpdateRiskRulesRequest(AdminRiskRuleDto[] Rules);
+109
View File
@@ -0,0 +1,109 @@
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 CandidateCount);
public sealed record AdminCandidateItemDto(
int Id,
int CategoryId,
string DisplayName,
string ChannelSlug,
string Platform);
public sealed record AdminAwardResultItemDto(
int Id,
int CategoryId,
string CategoryName,
int CandidateId,
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<AdminCategoryItemDto> Categories,
IEnumerable<AdminCandidateItemDto> Candidates,
IEnumerable<AdminNominationReviewItemDto> PendingNominations,
IEnumerable<AdminNominationReviewItemDto> ReviewedNominations,
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);
public sealed record UpsertCandidateRequest(
int CategoryId,
string DisplayName,
string ChannelSlug,
string Platform);
public sealed record SetAwardResultRequest(
int CategoryId,
int CandidateId);
@@ -0,0 +1,48 @@
namespace Backend.Contracts;
public sealed record AdminSiteSettingsResponse(
string HostDisplayName,
string HostTagline,
string NewsletterUrl,
string PrivacyEmail,
string PrivacyPolicyContent,
string? PrivacyPolicyUpdatedBy,
DateTimeOffset? PrivacyPolicyUpdatedAt,
string ImprintUrl,
string ContactUrl,
string SponsorsUrl,
IEnumerable<PublicSocialLinkDto> SocialLinks,
IEnumerable<FaqItemDto> Faq);
public sealed record UpdateSiteSettingsRequest(
string HostDisplayName,
string HostTagline,
string NewsletterUrl,
string PrivacyEmail,
string PrivacyPolicyContent,
string ImprintUrl,
string ContactUrl,
string SponsorsUrl,
PublicSocialLinkDto[] SocialLinks,
FaqItemDto[] Faq);
public sealed record AdminOperationalSettingsResponse(
bool DemoLoginManagedByDatabase,
bool DemoLoginEnabled,
string DemoLoginEmail,
bool DemoLoginPasswordSet,
string DemoLoginTwitchUserId,
string DemoLoginDisplayName,
bool MaintenanceModeEnabled,
string MaintenanceTitle,
string MaintenanceMessage);
public sealed record UpdateOperationalSettingsRequest(
bool DemoLoginEnabled,
string DemoLoginEmail,
string? DemoLoginPassword,
string DemoLoginTwitchUserId,
string DemoLoginDisplayName,
bool MaintenanceModeEnabled,
string MaintenanceTitle,
string MaintenanceMessage);
+5
View File
@@ -5,6 +5,11 @@ public sealed record LoginRequest(
string DisplayName,
string Role);
public sealed record DemoLoginRequest(
string? Login,
string? Email,
string? Password);
public sealed record AuthSessionDto(
string SessionToken,
string TwitchUserId,
-87
View File
@@ -1,87 +0,0 @@
namespace Backend.Contracts;
public sealed record TimelineItem(
string Key,
string Title,
DateOnly StartsAt,
DateOnly EndsAt,
string State);
public sealed record FeaturedCategoryDto(
int Id,
string GroupName,
string Name,
string Description,
int MaxNomineesPerUser);
public sealed record WinnerPreviewDto(
int Year,
string Category,
string WinnerName,
string WinnerSlug);
public sealed record FaqItemDto(string Question, string Answer);
public sealed record OverviewResponse(
int SeasonId,
int Year,
string Title,
DateOnly ShowDate,
string CurrentPhase,
bool IsCommunityOnly,
string LoginProvider,
IEnumerable<TimelineItem> Timeline,
IEnumerable<FeaturedCategoryDto> FeaturedCategories,
IEnumerable<WinnerPreviewDto> WinnersPreview,
IEnumerable<FaqItemDto> Faq);
public sealed record CandidateSummaryDto(
int Id,
string DisplayName,
string ChannelSlug,
string Platform);
public sealed record PublicCategoryDetailDto(
int Id,
string Name,
string GroupName,
string Description,
int MaxNomineesPerUser,
IEnumerable<CandidateSummaryDto> Candidates);
public sealed record SeasonCategoriesResponse(
int SeasonId,
int Year,
IEnumerable<PublicCategoryDetailDto> Categories);
public sealed record WinnerArchiveItemDto(
string Category,
string WinnerName,
string WinnerSlug);
public sealed record WinnerArchiveResponse(
int Year,
IEnumerable<WinnerArchiveItemDto> Items);
public sealed record CreateNominationRequest(
int Year,
int CategoryId,
string TwitchUserId,
string[] Nominees);
public sealed record VoteEntryRequest(
int CategoryId,
int CandidateId);
public sealed record CreateVoteRequest(
int SeasonId,
string TwitchUserId,
VoteEntryRequest[] Entries);
public sealed record CreateClipRequest(
int Year,
int? CategoryId,
string TwitchUserId,
string ClipUrl,
string Title,
string Creator);
@@ -0,0 +1,68 @@
namespace Backend.Contracts;
public sealed record TimelineItem(
string Key,
string Title,
DateOnly StartsAt,
DateOnly EndsAt,
string State);
public sealed record FeaturedCategoryDto(
int Id,
string GroupName,
string Name,
string Description,
int MaxNomineesPerUser);
public sealed record WinnerPreviewDto(
int Year,
string Category,
string WinnerName,
string WinnerSlug,
string WinnerPlatform,
string WinnerUrl);
public sealed record FaqItemDto(string Question, string Answer);
public sealed record PublicSocialLinkDto(
string Label,
string Platform,
string Url,
string? Icon = null,
bool ShowOnHost = true,
bool ShowOnCommunity = true);
public sealed record FooterLinkDto(
string Label,
string Url);
public sealed record PublicSiteContentDto(
string HostDisplayName,
string HostTagline,
string NewsletterUrl,
string PrivacyEmail,
string PrivacyPolicyContent,
IEnumerable<PublicSocialLinkDto> SocialLinks,
IEnumerable<FooterLinkDto> FooterLinks);
public sealed record PublicSiteStatusResponse(
bool DemoLoginEnabled,
bool MaintenanceModeEnabled,
string MaintenanceTitle,
string MaintenanceMessage);
public sealed record OverviewResponse(
int SeasonId,
int Year,
string Title,
DateOnly ShowDate,
TimeOnly ShowStartsAt,
string ShowStreamUrl,
string CurrentPhase,
bool IsCommunityOnly,
string LoginProvider,
IEnumerable<TimelineItem> Timeline,
IEnumerable<FeaturedCategoryDto> FeaturedCategories,
IEnumerable<WinnerPreviewDto> WinnersPreview,
PublicSiteContentDto SiteContent,
IEnumerable<FaqItemDto> Faq);
@@ -0,0 +1,23 @@
namespace Backend.Contracts;
public sealed record CandidateSummaryDto(
int Id,
string DisplayName,
string ChannelSlug,
string Platform,
string? ClipUrl,
string? ClipTitle,
string? ClipPlatform);
public sealed record PublicCategoryDetailDto(
int Id,
string Name,
string GroupName,
string Description,
int MaxNomineesPerUser,
IEnumerable<CandidateSummaryDto> Candidates);
public sealed record SeasonCategoriesResponse(
int SeasonId,
int Year,
IEnumerable<PublicCategoryDetailDto> Categories);
@@ -0,0 +1,28 @@
namespace Backend.Contracts;
public sealed record UserNominationStateDto(
int CategoryId,
string[] Nominees);
public sealed record UserVoteStateDto(
int CategoryId,
int CandidateId);
public sealed record UserClipSubmissionStateDto(
int Id,
int? CategoryId,
string ClipUrl,
string Title,
string Creator,
string Platform,
string Status,
DateTimeOffset CreatedAt,
string? ReviewNote,
DateTimeOffset? ReviewedAt);
public sealed record UserParticipationResponse(
int SeasonId,
int Year,
UserNominationStateDto[] Nominations,
UserVoteStateDto[] Votes,
UserClipSubmissionStateDto[] ClipSubmissions);
@@ -0,0 +1,12 @@
namespace Backend.Contracts;
public sealed record WinnerArchiveItemDto(
string Category,
string WinnerName,
string WinnerSlug,
string WinnerPlatform,
string WinnerUrl);
public sealed record WinnerArchiveResponse(
int Year,
IEnumerable<WinnerArchiveItemDto> Items);
+30
View File
@@ -0,0 +1,30 @@
namespace Backend.Contracts;
public sealed record NominationEntryRequest(
string Name,
string StreamUrl);
public sealed record CreateNominationRequest(
int Year,
int CategoryId,
string TwitchUserId,
string[]? Nominees,
NominationEntryRequest[]? Nominations);
public sealed record VoteEntryRequest(
int CategoryId,
int CandidateId);
public sealed record CreateVoteRequest(
int SeasonId,
string TwitchUserId,
VoteEntryRequest[] Entries);
public sealed record CreateClipRequest(
int Year,
int? CategoryId,
int? CandidateId,
string TwitchUserId,
string ClipUrl,
string Title,
string Creator);