Add winner archive, host image upload and live demo data
Deliver the demo-ready feature set and seed data so the live site can be presented end to end: - Winner archive: ArchivedWinner domain, admin CRUD endpoints/view/manager and public archive surface, backed by AddArchivedWinners migration. - Host presentation: host image upload and artist name on SiteSettings with public image endpoint and supporting migrations. - Clip submissions: idempotent table-ensure migration plus current-season demo clips for review workflows. - Demo seed data: sponsors, share links and 2025 archived winners, with a guarded RemoveDemoSeasons cleanup; all seeds guard against real data. - EnsureRuntimeSchemaParity migration to align runtime schema defensively. - Admin/home UI refinements; remove unused team role permissions modal and dead share-quick-links code. All seed and schema migrations are idempotent (IF NOT EXISTS / ON CONFLICT) and skip when real season data is present. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,42 @@ public static partial class PublicEndpoints
|
||||
{
|
||||
private static async Task<IResult> GetWinnerArchive(int year, AwardsDbContext db)
|
||||
{
|
||||
var latestPublishedWinnerYear = await db.Results
|
||||
.AsNoTracking()
|
||||
.Where(result => result.Season.WinnersPublishedAt != null)
|
||||
.Select(result => (int?)result.Season.Year)
|
||||
.MaxAsync();
|
||||
|
||||
var archivedWinnerRows = await db.ArchivedWinners
|
||||
.AsNoTracking()
|
||||
.Where(item => item.Year == year)
|
||||
.OrderBy(item => item.Category)
|
||||
.ThenBy(item => item.Subcategory)
|
||||
.ThenBy(item => item.WinnerName)
|
||||
.ToArrayAsync();
|
||||
if (archivedWinnerRows.Length > 0)
|
||||
{
|
||||
var archivedItems = archivedWinnerRows
|
||||
.Select(item =>
|
||||
{
|
||||
var metadata = SeasonMappings.InferProfileMetadataFromUrl(item.WinnerUrl, item.WinnerName);
|
||||
return new WinnerArchiveItemDto(
|
||||
item.Subcategory,
|
||||
item.Category,
|
||||
item.WinnerName,
|
||||
metadata.Slug,
|
||||
metadata.Platform,
|
||||
item.WinnerUrl,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
})
|
||||
.ToArray();
|
||||
|
||||
return Results.Ok(new WinnerArchiveResponse(year, archivedItems));
|
||||
}
|
||||
|
||||
var season = await db.Seasons
|
||||
.AsNoTracking()
|
||||
.Where(item => item.Year == year)
|
||||
@@ -16,7 +52,7 @@ public static partial class PublicEndpoints
|
||||
.FirstOrDefaultAsync();
|
||||
if (season is null)
|
||||
{
|
||||
return Results.NotFound();
|
||||
return Results.Ok(new WinnerArchiveResponse(year, []));
|
||||
}
|
||||
|
||||
if (season.WinnersPublishedAt is null)
|
||||
@@ -24,11 +60,6 @@ public static partial class PublicEndpoints
|
||||
return Results.Ok(new WinnerArchiveResponse(year, []));
|
||||
}
|
||||
|
||||
var latestPublishedWinnerYear = await db.Results
|
||||
.AsNoTracking()
|
||||
.Where(result => result.Season.WinnersPublishedAt != null)
|
||||
.Select(result => (int?)result.Season.Year)
|
||||
.MaxAsync();
|
||||
if (latestPublishedWinnerYear == season.Year)
|
||||
{
|
||||
return Results.Ok(new WinnerArchiveResponse(year, []));
|
||||
|
||||
Reference in New Issue
Block a user