Files
vtuber-awards/Backend/Migrations/20260629185000_SeedCurrentSeasonDemoVotingData.cs
T
AzuTear 76ac60d3fd
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 59s
CI - Build & Verify / Deploy to award.noveria.net (push) Successful in 1m34s
Fix admin demo review and landing regressions
2026-06-30 08:18:14 +02:00

207 lines
9.4 KiB
C#

using Backend.Data;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Backend.Migrations;
[DbContext(typeof(AwardsDbContext))]
[Migration("20260629185000_SeedCurrentSeasonDemoVotingData")]
public partial class SeedCurrentSeasonDemoVotingData : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(
"""
DO $vtsa_current_demo$
DECLARE
target_season_id integer;
subcategory_templates text := '[{"name":"Hidden Star","slug":"hidden-star","sortOrder":1,"viewerRangeMin":1,"viewerRangeMax":20},{"name":"Rising Star","slug":"rising-star","sortOrder":2,"viewerRangeMin":21,"viewerRangeMax":60},{"name":"Shining Star","slug":"shining-star","sortOrder":3,"viewerRangeMin":61,"viewerRangeMax":null}]';
BEGIN
SELECT "Id"
INTO target_season_id
FROM "Seasons"
WHERE "IsCurrent" = TRUE
ORDER BY "Year" DESC
LIMIT 1;
IF target_season_id IS NULL THEN
SELECT "Id"
INTO target_season_id
FROM "Seasons"
WHERE "Year" = 2030
ORDER BY "Id" DESC
LIMIT 1;
END IF;
IF target_season_id IS NULL THEN
RETURN;
END IF;
UPDATE "Seasons"
SET "SubcategoryTemplatesJson" = subcategory_templates
WHERE "Id" = target_season_id;
WITH award_groups(ord, group_name, group_slug, description, name_prefix) AS (
VALUES
(1, 'Main Awards', 'main-awards', 'Die groessten Allround-Auszeichnungen der aktuellen Season.', 'Astra'),
(2, 'Discovery', 'discovery', 'Neue Stimmen, Debuets und Creator, die in dieser Season besonders sichtbar geworden sind.', 'Nova'),
(3, 'Creative', 'creative', 'Model, Design, Rigging, Art und visuelle Praesentation im Stream.', 'Velvet'),
(4, 'Performance', 'performance', 'Gesang, Musik, Buehnenpraesenz und besondere Live-Momente.', 'Melo'),
(5, 'Gaming', 'gaming', 'Gameplay, Skill, Chaos, Speedruns und starke Gaming-Unterhaltung.', 'Pixel'),
(6, 'Entertainment', 'entertainment', 'Talk, Comedy, Watchalongs, Challenges und kreative Streamformate.', 'Taro'),
(7, 'Community', 'community', 'Creator, die ihre Community sichtbar verbinden, einladen und aktiv einbeziehen.', 'Lumi'),
(8, 'Collab', 'collab', 'Gemeinsame Streams, Duo-Dynamik und Projekte, die zusammen staerker wirken.', 'Orbit')
),
tiers(ord, tier_name, tier_slug, min_viewers, max_viewers) AS (
VALUES
(1, 'Hidden Star', 'hidden-star', 1, 20),
(2, 'Rising Star', 'rising-star', 21, 60),
(3, 'Shining Star', 'shining-star', 61, NULL)
)
INSERT INTO "Categories" (
"SeasonId",
"GroupName",
"Name",
"Slug",
"Description",
"SortOrder",
"MaxNomineesPerUser",
"ViewerRangeMin",
"ViewerRangeMax"
)
SELECT
target_season_id,
award_groups.group_name,
tiers.tier_name,
award_groups.group_slug || '-' || tiers.tier_slug,
award_groups.description,
(award_groups.ord * 100) + (tiers.ord * 10),
3,
tiers.min_viewers,
tiers.max_viewers
FROM award_groups
CROSS JOIN tiers
ON CONFLICT ("SeasonId", "Slug") DO UPDATE
SET
"GroupName" = EXCLUDED."GroupName",
"Name" = EXCLUDED."Name",
"Description" = EXCLUDED."Description",
"SortOrder" = EXCLUDED."SortOrder",
"MaxNomineesPerUser" = EXCLUDED."MaxNomineesPerUser",
"ViewerRangeMin" = EXCLUDED."ViewerRangeMin",
"ViewerRangeMax" = EXCLUDED."ViewerRangeMax";
WITH award_groups(ord, group_name, group_slug, name_prefix) AS (
VALUES
(1, 'Main Awards', 'main-awards', 'Astra'),
(2, 'Discovery', 'discovery', 'Nova'),
(3, 'Creative', 'creative', 'Velvet'),
(4, 'Performance', 'performance', 'Melo'),
(5, 'Gaming', 'gaming', 'Pixel'),
(6, 'Entertainment', 'entertainment', 'Taro'),
(7, 'Community', 'community', 'Lumi'),
(8, 'Collab', 'collab', 'Orbit')
),
tiers(ord, tier_name, tier_slug) AS (
VALUES
(1, 'Hidden Star', 'hidden-star'),
(2, 'Rising Star', 'rising-star'),
(3, 'Shining Star', 'shining-star')
),
slots(ord, name_suffix, platform) AS (
VALUES
(1, 'Aster', 'Twitch'),
(2, 'Vega', 'YouTube')
),
candidate_rows AS (
SELECT
categories."Id" AS category_id,
award_groups.ord AS group_ord,
tiers.ord AS tier_ord,
slots.ord AS slot_ord,
award_groups.name_prefix || ' ' || slots.name_suffix || ' (' || tiers.tier_name || ')' AS display_name,
regexp_replace(
lower('vtsa_demo_current_' || award_groups.name_prefix || '_' || tiers.tier_slug || '_' || slots.name_suffix),
'[^a-z0-9]+',
'_',
'g'
) AS channel_slug,
slots.platform
FROM award_groups
CROSS JOIN tiers
CROSS JOIN slots
INNER JOIN "Categories" categories
ON categories."SeasonId" = target_season_id
AND categories."Slug" = award_groups.group_slug || '-' || tiers.tier_slug
)
INSERT INTO "Candidates" (
"SeasonId",
"CategoryId",
"StreamerIdentityId",
"DisplayName",
"ChannelSlug",
"Platform",
"NominationTally",
"AcceptanceStatus",
"AcceptanceNote",
"ClipCompilationUrl",
"ClipCompilationTitle",
"ClipCompilationPlatform",
"ClipEmbedStatus"
)
SELECT
target_season_id,
candidate_rows.category_id,
NULL,
candidate_rows.display_name,
candidate_rows.channel_slug,
candidate_rows.platform,
4 + (candidate_rows.group_ord * 2) + candidate_rows.tier_ord + candidate_rows.slot_ord,
'approved',
'Demo-Kandidat fuer den aktuellen Live-Voting-Test.',
CASE
WHEN candidate_rows.slot_ord = 1 THEN 'https://youtu.be/demo-' || candidate_rows.channel_slug
ELSE NULL
END,
CASE
WHEN candidate_rows.slot_ord = 1 THEN candidate_rows.display_name || ' Highlight Reel'
ELSE NULL
END,
CASE
WHEN candidate_rows.slot_ord = 1 THEN 'YouTube'
ELSE NULL
END,
CASE
WHEN candidate_rows.slot_ord = 1 THEN 'available'
ELSE 'unchecked'
END
FROM candidate_rows
WHERE NOT EXISTS (
SELECT 1
FROM "Candidates" existing
WHERE existing."SeasonId" = target_season_id
AND lower(existing."ChannelSlug") = lower(candidate_rows.channel_slug)
AND existing."CategoryId" = candidate_rows.category_id
);
PERFORM setval(pg_get_serial_sequence('"Categories"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Categories"), 1));
PERFORM setval(pg_get_serial_sequence('"Candidates"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Candidates"), 1));
END;
$vtsa_current_demo$;
"""
);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(
"""
DELETE FROM "Candidates"
WHERE "ChannelSlug" LIKE 'vtsa_demo_current_%';
"""
);
}
}