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
@@ -0,0 +1,145 @@
using Backend.Domain;
using Microsoft.EntityFrameworkCore;
namespace Backend.Data;
public static partial class SeedDataBootstrapper
{
private static async Task EnsureCategoriesAsync(AwardsDbContext db, Season season)
{
var seasonCategories = await db.Categories
.Where(item => item.SeasonId == season.Id)
.ToArrayAsync();
foreach (var category in seasonCategories)
{
if (!SeedCatalog.LegacyCategorySlugMap.TryGetValue(category.Slug, out var targetSlug))
{
continue;
}
var target = SeedCatalog.CategorySeeds.First(item => item.Slug == targetSlug);
category.GroupName = target.GroupName;
category.Name = target.Name;
category.Slug = target.Slug;
category.Description = target.Description;
category.SortOrder = target.SortOrder;
category.MaxNomineesPerUser = 3;
}
await db.SaveChangesAsync();
var existing = await db.Categories
.Where(item => item.SeasonId == season.Id)
.Select(item => item.Slug)
.ToArrayAsync();
var existingSlugs = existing.ToHashSet(StringComparer.OrdinalIgnoreCase);
foreach (var seed in SeedCatalog.CategorySeeds)
{
if (existingSlugs.Contains(seed.Slug))
{
continue;
}
db.Categories.Add(new Category
{
SeasonId = season.Id,
GroupName = seed.GroupName,
Name = seed.Name,
Slug = seed.Slug,
Description = seed.Description,
SortOrder = seed.SortOrder,
MaxNomineesPerUser = 3,
});
}
await db.SaveChangesAsync();
}
private static async Task EnsureCandidatesAsync(AwardsDbContext db, Season season, CandidateSeed[] seeds)
{
var categories = await db.Categories
.Where(item => item.SeasonId == season.Id)
.ToDictionaryAsync(item => item.Slug, StringComparer.OrdinalIgnoreCase);
var existing = await db.Candidates
.Where(item => item.SeasonId == season.Id)
.Select(item => new { item.CategoryId, item.DisplayName, item.ChannelSlug })
.ToArrayAsync();
var existingKeys = existing
.Select(item => $"{item.CategoryId}|{item.DisplayName}|{item.ChannelSlug}".ToLowerInvariant())
.ToHashSet();
foreach (var seed in seeds)
{
if (!categories.TryGetValue(seed.CategorySlug, out var category))
{
continue;
}
var key = $"{category.Id}|{seed.DisplayName}|{seed.ChannelSlug}".ToLowerInvariant();
if (existingKeys.Contains(key))
{
continue;
}
db.Candidates.Add(new Candidate
{
SeasonId = season.Id,
CategoryId = category.Id,
DisplayName = seed.DisplayName,
ChannelSlug = seed.ChannelSlug,
Platform = seed.Platform,
});
}
await db.SaveChangesAsync();
}
private static async Task EnsureWinnersAsync(AwardsDbContext db, Season season, WinnerSeed[] seeds)
{
var categories = await db.Categories
.Where(item => item.SeasonId == season.Id)
.ToDictionaryAsync(item => item.Slug, StringComparer.OrdinalIgnoreCase);
var candidates = await db.Candidates
.Where(item => item.SeasonId == season.Id)
.ToArrayAsync();
var existingResults = await db.Results
.Where(item => item.SeasonId == season.Id)
.ToArrayAsync();
foreach (var result in existingResults)
{
if (categories.Values.FirstOrDefault(item => item.Id == result.CategoryId) is { } category
&& result.CategoryName != category.Name)
{
result.CategoryName = category.Name;
}
}
var existingResultCategoryIds = existingResults.Select(item => item.CategoryId).ToHashSet();
foreach (var seed in seeds)
{
if (!categories.TryGetValue(seed.CategorySlug, out var category) || existingResultCategoryIds.Contains(category.Id))
{
continue;
}
var candidate = candidates.FirstOrDefault(item =>
item.CategoryId == category.Id
&& string.Equals(item.DisplayName, seed.DisplayName, StringComparison.OrdinalIgnoreCase));
if (candidate is null)
{
continue;
}
db.Results.Add(new AwardResult
{
SeasonId = season.Id,
CategoryId = category.Id,
CandidateId = candidate.Id,
CategoryName = category.Name,
});
}
}
}