146 lines
4.9 KiB
C#
146 lines
4.9 KiB
C#
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,
|
|
});
|
|
}
|
|
}
|
|
}
|