Refactor app architecture and clean local artifacts
This commit is contained in:
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user