Update release notes and deploy workspace
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 59s
CI - Build & Verify / Deploy to award.noveria.net (push) Failing after 53s

This commit is contained in:
AzuTear
2026-06-29 17:49:54 +02:00
parent c466348d18
commit 441ef2b850
196 changed files with 9279 additions and 39292 deletions
@@ -0,0 +1,292 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Backend.Migrations;
public partial class AdjustDemoSubcategoriesAndArchive : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(
"""
DELETE FROM "RiskFlags" WHERE "SeasonId" IN (999, 1000, 1001);
DELETE FROM "Seasons" WHERE "Id" IN (999, 1000, 1001) AND "IsDemo" = TRUE;
DELETE FROM "StreamerIdentities" WHERE "Id" BETWEEN 3001 AND 3020;
INSERT INTO "Seasons" (
"Id", "Year", "Name", "IsDemo", "IsCurrent", "IsCommunityOnly", "CurrentPhase",
"NominationStartsAt", "NominationEndsAt", "VotingStartsAt", "VotingEndsAt",
"ReviewStartsAt", "ReviewEndsAt", "ShowDate", "ShowStartsAt",
"WinnersPublishedAt", "WinnersPublishedByTwitchId", "SubcategoryTemplatesJson", "WorkflowRulesJson"
)
VALUES
(999, 2024, 'VTuber Star Awards 2024 Demo Archiv', TRUE, FALSE, FALSE, 'Archiv',
DATE '2024-04-01', DATE '2024-04-28', DATE '2024-05-10', DATE '2024-05-24',
DATE '2024-04-29', DATE '2024-05-09', DATE '2024-06-22', TIME '20:00',
TIMESTAMPTZ '2024-06-23 10:00:00+00', 'demo_owner',
'[{"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}]',
'[]'),
(1000, 2025, 'VTuber Star Awards 2025 Demo Archiv', TRUE, FALSE, FALSE, 'Archiv',
DATE '2025-04-01', DATE '2025-04-28', DATE '2025-05-10', DATE '2025-05-24',
DATE '2025-04-29', DATE '2025-05-09', DATE '2025-06-21', TIME '20:00',
TIMESTAMPTZ '2025-06-22 10:00:00+00', 'demo_owner',
'[{"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}]',
'[]'),
(1001, 2026, 'VTuber Star Awards 2026 Demo', TRUE, TRUE, FALSE, 'Voting',
DATE '2026-05-18', DATE '2026-06-16', DATE '2026-06-24', DATE '2026-07-19',
DATE '2026-06-17', DATE '2026-06-23', DATE '2026-08-08', TIME '20:00',
NULL, NULL,
'[{"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}]',
'[]');
WITH tiers(ord, name, 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)
),
active_groups(ord, name, slug) AS (
VALUES
(1, 'Gaming', 'gaming'),
(2, 'Music', 'music'),
(3, 'Art & Design', 'art-design'),
(4, 'Community', 'community')
),
archive_2025_groups(ord, name, slug) AS (
VALUES
(1, 'Gaming', 'gaming'),
(2, 'Music', 'music'),
(3, 'Community', 'community')
),
archive_2024_groups(ord, name, slug) AS (
VALUES
(1, 'Gaming', 'gaming'),
(2, 'Music', 'music')
)
INSERT INTO "Categories" (
"Id", "SeasonId", "GroupName", "Name", "Slug", "Description", "SortOrder", "MaxNomineesPerUser", "ViewerRangeMin", "ViewerRangeMax"
)
SELECT 1100 + ((g.ord - 1) * 3) + t.ord, 1001, g.name, t.name, g.slug || '-' || t.slug,
g.name || '-Creator im ' || t.name || '-Tier.', ((g.ord - 1) * 30) + (t.ord * 10), 2, t.min_viewers, t.max_viewers
FROM active_groups g CROSS JOIN tiers t
UNION ALL
SELECT 1200 + ((g.ord - 1) * 3) + t.ord, 1000, g.name, t.name, 'archive-2025-' || g.slug || '-' || t.slug,
'Archiv-Unterkategorie.', ((g.ord - 1) * 30) + (t.ord * 10), 2, t.min_viewers, t.max_viewers
FROM archive_2025_groups g CROSS JOIN tiers t
UNION ALL
SELECT 1300 + ((g.ord - 1) * 3) + t.ord, 999, g.name, t.name, 'archive-2024-' || g.slug || '-' || t.slug,
'Archiv-Unterkategorie.', ((g.ord - 1) * 30) + (t.ord * 10), 2, t.min_viewers, t.max_viewers
FROM archive_2024_groups g CROSS JOIN tiers t;
INSERT INTO "StreamerIdentities" ("Id", "Platform", "Login", "NormalizedKey", "DisplayName", "ProfileUrl", "LastResolvedAt")
VALUES
(3001, 'Twitch', 'aki_lumina', 'twitch:aki_lumina', 'Aki Lumina', 'https://twitch.tv/aki_lumina', TIMESTAMPTZ '2026-06-27 12:00:00+00'),
(3002, 'Twitch', 'mira_orbit', 'twitch:mira_orbit', 'Mira Orbit', 'https://twitch.tv/mira_orbit', TIMESTAMPTZ '2026-06-27 12:02:00+00'),
(3003, 'Twitch', 'nova_nym', 'twitch:nova_nym', 'Nova Nym', 'https://twitch.tv/nova_nym', TIMESTAMPTZ '2026-06-27 12:04:00+00'),
(3004, 'Twitch', 'luna_koi', 'twitch:luna_koi', 'Luna Koi', 'https://twitch.tv/luna_koi', TIMESTAMPTZ '2026-06-27 12:06:00+00'),
(3005, 'Twitch', 'runa_bits', 'twitch:runa_bits', 'Runa Bits', 'https://twitch.tv/runa_bits', TIMESTAMPTZ '2026-06-27 12:08:00+00'),
(3006, 'Twitch', 'sora_slate', 'twitch:sora_slate', 'Sora Slate', 'https://twitch.tv/sora_slate', TIMESTAMPTZ '2026-06-27 12:10:00+00');
WITH active_names(name, slug) AS (
VALUES
('Aki Lumina', 'aki_lumina'), ('Miki Mint', 'miki_mint'), ('Nova Nym', 'nova_nym'),
('Mira Orbit', 'mira_orbit'), ('Taro Tactics', 'taro_tactics'), ('Yuna Quest', 'yuna_quest'),
('Nova Nym Prime', 'nova_nym_prime'), ('Rin Replay', 'rin_replay'), ('Kira Comet', 'kira_comet'),
('Melo Moon', 'melo_moon'), ('Echo Rill', 'echo_rill'), ('Vivi Verse', 'vivi_verse'),
('Luna Koi', 'luna_koi'), ('Hana Hertz', 'hana_hertz'), ('Nyra Novel', 'nyra_novel'),
('Vera Volt', 'vera_volt'), ('Kai Myth', 'kai_myth'), ('Mina Maze', 'mina_maze'),
('Iris Ink', 'iris_ink'), ('Pia Palette', 'pia_palette'), ('Theo Thimble', 'theo_thimble'),
('Neon Nori', 'neon_nori'), ('Slate Sen', 'slate_sen'), ('Momo Motion', 'momo_motion'),
('Chroma Vale', 'chroma_vale'), ('Riku Render', 'riku_render'), ('Faye Flux', 'faye_flux'),
('Runa Bits', 'runa_bits'), ('Bibi Beacon', 'bibi_beacon'), ('Ori Opal', 'ori_opal'),
('Sora Slate', 'sora_slate'), ('Cleo Campfire', 'cleo_campfire'), ('Juno Jamboree', 'juno_jamboree'),
('Ember Vail', 'ember_vail'), ('Riku Relay', 'riku_relay'), ('Nami Node', 'nami_node')
),
numbered_active AS (
SELECT row_number() OVER () AS rn, name, slug FROM active_names
)
INSERT INTO "Candidates" (
"Id", "SeasonId", "CategoryId", "StreamerIdentityId", "DisplayName", "ChannelSlug", "Platform",
"NominationTally", "AcceptanceStatus", "AcceptanceNote", "ClipCompilationUrl", "ClipCompilationTitle", "ClipCompilationPlatform", "ClipEmbedStatus"
)
SELECT 2000 + rn, 1001, 1101 + ((rn - 1) / 3)::int,
CASE WHEN rn <= 6 THEN (3000 + rn)::integer ELSE NULL::integer END,
name, slug, 'Twitch',
3 + ((rn * 2) % 11),
CASE WHEN rn % 6 = 0 THEN 'pending' ELSE 'approved' END,
CASE WHEN rn IN (1, 10, 16, 25, 34) THEN 'Demo-Highlight fuer Review gepflegt.' ELSE NULL END,
CASE rn
WHEN 1 THEN 'https://youtu.be/demo-aki-rise'
WHEN 7 THEN 'https://clips.twitch.tv/demo-nova-finale'
WHEN 10 THEN 'https://youtu.be/demo-melo-live'
WHEN 16 THEN 'https://youtu.be/demo-vera-stage'
WHEN 25 THEN 'https://youtu.be/demo-chroma-design'
WHEN 34 THEN 'https://clips.twitch.tv/demo-ember-moment'
ELSE NULL
END,
CASE rn
WHEN 1 THEN 'Aki Lumina Hidden Star Reel'
WHEN 7 THEN 'Nova Nym Shining Clip'
WHEN 10 THEN 'Melo Moon Live Set'
WHEN 16 THEN 'Vera Volt Stage Reel'
WHEN 25 THEN 'Chroma Vale Design Reel'
WHEN 34 THEN 'Ember Vail Finale Clip'
ELSE NULL
END,
CASE WHEN rn IN (7, 34) THEN 'Twitch' WHEN rn IN (1, 10, 16, 25) THEN 'YouTube' ELSE NULL END,
CASE WHEN rn IN (1, 7, 10, 16, 25, 34) THEN 'available' ELSE 'unchecked' END
FROM numbered_active;
WITH archive_2025_names(name, slug) AS (
VALUES
('Archiv Aster', 'archiv_aster'), ('Archiv Beryl', 'archiv_beryl'), ('Archiv Coda', 'archiv_coda'),
('Archiv Drift', 'archiv_drift'), ('Archiv Elara', 'archiv_elara'), ('Archiv Finch', 'archiv_finch'),
('Archiv Lyra', 'archiv_lyra'), ('Archiv Muse', 'archiv_muse'), ('Archiv Nia', 'archiv_nia')
),
archive_2024_names(name, slug) AS (
VALUES
('Archiv Poppy', 'archiv_poppy'), ('Archiv Quartz', 'archiv_quartz'), ('Archiv Rune', 'archiv_rune'),
('Archiv Sol', 'archiv_sol'), ('Archiv Tide', 'archiv_tide'), ('Archiv Uma', 'archiv_uma')
),
numbered_2025 AS (
SELECT row_number() OVER () AS rn, name, slug FROM archive_2025_names
),
numbered_2024 AS (
SELECT row_number() OVER () AS rn, name, slug FROM archive_2024_names
)
INSERT INTO "Candidates" (
"Id", "SeasonId", "CategoryId", "StreamerIdentityId", "DisplayName", "ChannelSlug", "Platform",
"NominationTally", "AcceptanceStatus", "AcceptanceNote", "ClipCompilationUrl", "ClipCompilationTitle", "ClipCompilationPlatform", "ClipEmbedStatus"
)
SELECT 2100 + rn, 1000, 1200 + rn, NULL::integer, name, slug, 'Twitch', 7 + rn, 'approved', NULL,
CASE WHEN rn IN (3, 6, 9) THEN 'https://clips.twitch.tv/demo-' || slug ELSE 'https://youtu.be/demo-' || slug END,
name || ' Winner Reel',
CASE WHEN rn IN (3, 6, 9) THEN 'Twitch' ELSE 'YouTube' END,
'available'
FROM numbered_2025
UNION ALL
SELECT 2200 + rn, 999, 1300 + rn, NULL::integer, name, slug, 'Twitch', 6 + rn, 'approved', NULL,
CASE WHEN rn IN (3, 6) THEN 'https://clips.twitch.tv/demo-' || slug ELSE 'https://youtu.be/demo-' || slug END,
name || ' Winner Reel',
CASE WHEN rn IN (3, 6) THEN 'Twitch' ELSE 'YouTube' END,
'available'
FROM numbered_2024;
INSERT INTO "Nominations" (
"Id", "SeasonId", "CategoryId", "CategoryGroupName", "SubmittedByTwitchId", "CandidateId", "StreamerIdentityId", "SuggestedCategoryId",
"CandidateText", "StreamUrl", "ResolvedChannel", "ResolvedPlatform", "AvgViewers", "HoursStreamed", "HoursWatched", "PeakViewers", "FollowersGained",
"TrackerStatus", "TrackerCheckedAt", "TrackingReviewStatus", "TrackingFlagsJson", "TrackingReviewNote", "TrackingReviewedByTwitchId", "TrackingReviewedAt",
"Status", "ReviewNote", "ReviewedByTwitchId", "CreatedAt", "ReviewedAt"
)
VALUES
(4001, 1001, 1101, 'Gaming', 'viewer_1001', 2001, 3001, NULL, 'Aki Lumina', 'https://twitch.tv/aki_lumina', 'aki_lumina', 'Twitch', 14, 42, 2600, 48, 210, 'resolved', TIMESTAMPTZ '2026-06-18 09:20:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:10:00+00', 'approved', 'Hidden tier passt.', 'reviewer_demo', TIMESTAMPTZ '2026-06-02 18:30:00+00', TIMESTAMPTZ '2026-06-18 10:10:00+00'),
(4002, 1001, 1102, 'Gaming', 'viewer_1002', 2004, 3002, NULL, 'Mira Orbit', 'https://twitch.tv/mira_orbit', 'mira_orbit', 'Twitch', 38, 58, 5900, 96, 510, 'resolved', TIMESTAMPTZ '2026-06-18 09:24:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:15:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-03 20:15:00+00', TIMESTAMPTZ '2026-06-18 10:15:00+00'),
(4003, 1001, 1103, 'Gaming', 'viewer_1003', 2007, 3003, NULL, 'Nova Nym Prime', 'https://twitch.tv/nova_nym_prime', 'nova_nym_prime', 'Twitch', 116, 44, 9100, 420, 1200, 'resolved', TIMESTAMPTZ '2026-06-18 09:30:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:22:00+00', 'approved', 'Shining tier passt.', 'reviewer_demo', TIMESTAMPTZ '2026-06-04 14:45:00+00', TIMESTAMPTZ '2026-06-18 10:22:00+00'),
(4004, 1001, 1104, 'Music', 'viewer_1004', 2010, NULL, NULL, 'Melo Moon', 'https://twitch.tv/melo_moon', 'melo_moon', 'Twitch', 18, 35, 2800, 52, 240, 'resolved', TIMESTAMPTZ '2026-06-18 09:40:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:30:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-05 21:05:00+00', TIMESTAMPTZ '2026-06-18 10:30:00+00'),
(4005, 1001, 1105, 'Music', 'viewer_1005', 2013, 3004, NULL, 'Luna Koi', 'https://twitch.tv/luna_koi', 'luna_koi', 'Twitch', 45, 51, 6100, 110, 620, 'resolved', TIMESTAMPTZ '2026-06-18 09:45:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:36:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-06 19:25:00+00', TIMESTAMPTZ '2026-06-18 10:36:00+00'),
(4006, 1001, 1106, 'Music', 'viewer_1006', 2016, NULL, NULL, 'Vera Volt', 'https://twitch.tv/vera_volt', 'vera_volt', 'Twitch', 88, 35, 7400, 210, 430, 'resolved', TIMESTAMPTZ '2026-06-18 09:48:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 10:41:00+00', 'approved', 'Live-Musik-Set pruefbar.', 'reviewer_demo', TIMESTAMPTZ '2026-06-07 17:55:00+00', TIMESTAMPTZ '2026-06-18 10:41:00+00'),
(4007, 1001, 1107, 'Art & Design', 'viewer_1007', 2019, NULL, NULL, 'Iris Ink', 'https://twitch.tv/iris_ink', 'iris_ink', 'Twitch', 16, 31, 2100, 41, 180, 'resolved', TIMESTAMPTZ '2026-06-18 09:52:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:00:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-08 18:10:00+00', TIMESTAMPTZ '2026-06-18 11:00:00+00'),
(4008, 1001, 1108, 'Art & Design', 'viewer_1008', 2022, NULL, NULL, 'Neon Nori', 'https://twitch.tv/neon_nori', 'neon_nori', 'Twitch', 52, 65, 31800, 130, 920, 'resolved', TIMESTAMPTZ '2026-06-18 09:58:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:06:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-09 16:20:00+00', TIMESTAMPTZ '2026-06-18 11:06:00+00'),
(4009, 1001, 1109, 'Art & Design', 'viewer_1009', 2025, NULL, NULL, 'Chroma Vale', 'https://twitch.tv/chroma_vale', 'chroma_vale', 'Twitch', 177, 54, 24200, 440, 610, 'resolved', TIMESTAMPTZ '2026-06-18 10:02:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:12:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-10 20:40:00+00', TIMESTAMPTZ '2026-06-18 11:12:00+00'),
(4010, 1001, 1110, 'Community', 'viewer_1010', 2028, 3005, NULL, 'Runa Bits', 'https://twitch.tv/runa_bits', 'runa_bits', 'Twitch', 12, 49, 1700, 29, 120, 'resolved', TIMESTAMPTZ '2026-06-18 10:08:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:18:00+00', 'approved', 'Community-Event mit Planungsdoku.', 'reviewer_demo', TIMESTAMPTZ '2026-06-11 15:50:00+00', TIMESTAMPTZ '2026-06-18 11:18:00+00'),
(4011, 1001, 1111, 'Community', 'viewer_1011', 2031, 3006, NULL, 'Sora Slate', 'https://twitch.tv/sora_slate', 'sora_slate', 'Twitch', 44, 37, 11800, 92, 340, 'resolved', TIMESTAMPTZ '2026-06-18 10:14:00+00', 'clear', '[]', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:24:00+00', 'approved', NULL, 'reviewer_demo', TIMESTAMPTZ '2026-06-12 19:05:00+00', TIMESTAMPTZ '2026-06-18 11:24:00+00'),
(4012, 1001, 1112, 'Community', 'viewer_1012', 2034, NULL, NULL, 'Ember Vail', 'https://twitch.tv/ember_vail', 'ember_vail', 'Twitch', NULL, NULL, NULL, NULL, NULL, 'no_data', TIMESTAMPTZ '2026-06-18 10:18:00+00', 'needs_review', '[{"key":"no_tracker_data","label":"Keine Tracker-Daten","severity":"medium","description":"TwitchTracker hat keinen belastbaren Summary-Wert geliefert.","requiresManualReview":true,"blocksApproval":false,"adminNoteRequiredOnOverride":false}]', 'Manueller Review noetig.', NULL, NULL, 'pending', 'Tracker-Daten nachfordern.', NULL, TIMESTAMPTZ '2026-06-13 22:15:00+00', NULL);
INSERT INTO "VoteBallots" ("Id", "SeasonId", "SubmittedByTwitchId", "Status", "SubmittedAt")
VALUES
(5001, 1001, 'vote_user_001', 'submitted', TIMESTAMPTZ '2026-06-25 18:10:00+00'),
(5002, 1001, 'vote_user_002', 'submitted', TIMESTAMPTZ '2026-06-25 18:16:00+00'),
(5003, 1001, 'vote_user_003', 'submitted', TIMESTAMPTZ '2026-06-25 19:05:00+00'),
(5004, 1001, 'vote_user_004', 'submitted', TIMESTAMPTZ '2026-06-26 12:45:00+00'),
(5005, 1001, 'vote_user_005', 'submitted', TIMESTAMPTZ '2026-06-26 20:30:00+00'),
(5006, 1001, 'vote_user_006', 'submitted', TIMESTAMPTZ '2026-06-27 09:20:00+00'),
(5007, 1001, 'vote_user_007', 'draft', TIMESTAMPTZ '2026-06-27 14:15:00+00'),
(5008, 1001, 'vote_user_008', 'submitted', TIMESTAMPTZ '2026-06-28 21:05:00+00');
INSERT INTO "VoteEntries" ("Id", "BallotId", "CategoryId", "CandidateId")
VALUES
(5101, 5001, 1101, 2001), (5102, 5001, 1104, 2010), (5103, 5001, 1107, 2019), (5104, 5001, 1110, 2028),
(5105, 5002, 1102, 2004), (5106, 5002, 1105, 2013), (5107, 5002, 1108, 2022), (5108, 5002, 1111, 2031),
(5109, 5003, 1103, 2007), (5110, 5003, 1106, 2016), (5111, 5003, 1109, 2025), (5112, 5003, 1112, 2034),
(5113, 5004, 1101, 2002), (5114, 5004, 1104, 2011), (5115, 5004, 1107, 2020), (5116, 5004, 1110, 2029),
(5117, 5005, 1102, 2005), (5118, 5005, 1105, 2014), (5119, 5005, 1108, 2023), (5120, 5005, 1111, 2032),
(5121, 5006, 1103, 2008), (5122, 5006, 1106, 2017), (5123, 5006, 1109, 2026), (5124, 5006, 1112, 2035),
(5125, 5007, 1101, 2003), (5126, 5007, 1104, 2012),
(5127, 5008, 1102, 2004), (5128, 5008, 1105, 2013), (5129, 5008, 1108, 2022), (5130, 5008, 1111, 2031);
INSERT INTO "Results" ("Id", "SeasonId", "CategoryId", "CandidateId", "CategoryName")
SELECT 6000 + "Id" - 1200, 1000, "Id", 2100 + "Id" - 1200, "Name" FROM "Categories" WHERE "SeasonId" = 1000
UNION ALL
SELECT 6100 + "Id" - 1300, 999, "Id", 2200 + "Id" - 1300, "Name" FROM "Categories" WHERE "SeasonId" = 999;
INSERT INTO "ClipSubmissions" (
"Id", "SeasonId", "CategoryId", "CandidateId", "SubmittedByTwitchId", "ClipUrl", "Title", "Creator", "Platform",
"Status", "ReviewNote", "ReviewedByTwitchId", "CreatedFromIp", "CreatedAt", "ReviewedAt"
)
VALUES
(7001, 1001, 1103, 2007, 'viewer_2001', 'https://clips.twitch.tv/demo-nova-finale', 'Nova turns the boss fight', 'viewer_2001', 'Twitch', 'approved', 'Kontext passt.', 'clip_reviewer', '127.0.0.1', TIMESTAMPTZ '2026-06-20 18:12:00+00', TIMESTAMPTZ '2026-06-21 09:00:00+00'),
(7002, 1001, 1106, 2016, 'viewer_2002', 'https://youtu.be/demo-vera-stage', 'Vera sings the finale bridge', 'viewer_2002', 'YouTube', 'approved', NULL, 'clip_reviewer', '127.0.0.1', TIMESTAMPTZ '2026-06-20 20:25:00+00', TIMESTAMPTZ '2026-06-21 09:08:00+00'),
(7003, 1001, 1112, 2034, 'viewer_2003', 'https://clips.twitch.tv/demo-ember-moment', 'Ember opens the community event', 'viewer_2003', 'Twitch', 'pending', 'Timing pruefen.', NULL, '127.0.0.1', TIMESTAMPTZ '2026-06-21 11:40:00+00', NULL),
(7004, 1001, 1109, 2025, 'viewer_2004', 'https://youtu.be/demo-chroma-design', 'Chroma explains the overlay rebuild', 'viewer_2004', 'YouTube', 'approved', NULL, 'clip_reviewer', '127.0.0.1', TIMESTAMPTZ '2026-06-21 15:10:00+00', TIMESTAMPTZ '2026-06-22 08:45:00+00'),
(7005, 1001, 1111, 2031, 'viewer_2005', 'https://clips.twitch.tv/demo-sora-community', 'Sora lets chat design the scene', 'viewer_2005', 'Twitch', 'pending', NULL, NULL, '127.0.0.1', TIMESTAMPTZ '2026-06-22 19:55:00+00', NULL),
(7006, 1000, 1203, 2103, 'archiv_viewer_1', 'https://clips.twitch.tv/demo-archiv-coda', 'Archiv Coda finale clip', 'archiv_viewer_1', 'Twitch', 'approved', NULL, 'clip_reviewer', '127.0.0.1', TIMESTAMPTZ '2025-06-10 19:00:00+00', TIMESTAMPTZ '2025-06-11 09:00:00+00'),
(7007, 999, 1303, 2203, 'archiv_viewer_2', 'https://clips.twitch.tv/demo-archiv-rune', 'Archiv Rune classic moment', 'archiv_viewer_2', 'Twitch', 'approved', NULL, 'clip_reviewer', '127.0.0.1', TIMESTAMPTZ '2024-06-10 19:00:00+00', TIMESTAMPTZ '2024-06-11 09:00:00+00');
INSERT INTO "ShowactApplications" (
"Id", "SeasonId", "ArtistName", "ContactEmail", "ContactDiscord", "PlatformUrl", "PerformanceType", "Description",
"TechnicalNotes", "ReferenceUrl", "FieldResponsesJson", "Status", "ReviewNote", "ReviewedByTwitchId", "CreatedFromIp", "UserAgent", "CreatedAt", "ReviewedAt"
)
VALUES
(8001, 1001, 'Melo Moon', 'melo@example.invalid', 'melo_moon', 'https://twitch.tv/melo_moon', 'Live-Gesang', 'Akustisches Opening-Medley mit zwei kurzen Songs.', 'Benoetigt Instrumentalspur und Monitoring.', 'https://youtu.be/demo-melo-live', '{"performanceLength":"6 Minuten","contentRating":"family friendly"}', 'approved', 'Passt als Opener.', 'show_reviewer', '127.0.0.1', 'DemoBrowser/1.0', TIMESTAMPTZ '2026-06-19 13:10:00+00', TIMESTAMPTZ '2026-06-20 10:00:00+00'),
(8002, 1001, 'Neon Nori', 'nori@example.invalid', 'neon_nori', 'https://twitch.tv/neon_nori', 'Visual Interlude', 'Kurze Motion-Overlay-Performance zwischen zwei Award-Bloecken.', 'OBS-Szene mit WebM-Loop, kein Mikro.', 'https://youtu.be/demo-nori-motion', '{"performanceLength":"3 Minuten","contentRating":"keine Hinweise"}', 'pending', NULL, NULL, '127.0.0.1', 'DemoBrowser/1.0', TIMESTAMPTZ '2026-06-20 16:40:00+00', NULL),
(8003, 1000, 'Archiv Lyra', 'lyra@example.invalid', 'archiv_lyra', 'https://twitch.tv/archiv_lyra', 'Archiv Musik', 'Gewinner-Showcase aus dem Vorjahr.', 'VOD vorhanden.', 'https://youtu.be/demo-archiv-lyra', '{"performanceLength":"4 Minuten","contentRating":"family friendly"}', 'approved', 'Archiv-Showact.', 'show_reviewer', '127.0.0.1', 'DemoBrowser/1.0', TIMESTAMPTZ '2025-06-01 12:05:00+00', TIMESTAMPTZ '2025-06-02 09:30:00+00'),
(8004, 999, 'Archiv Sol', 'sol@example.invalid', 'archiv_sol', 'https://twitch.tv/archiv_sol', 'Archiv Musik', 'Aelteres Archiv-Showcase fuer den Archiv-Endpunkt.', 'VOD vorhanden.', 'https://youtu.be/demo-archiv-sol', '{"performanceLength":"4 Minuten","contentRating":"family friendly"}', 'approved', 'Archiv-Showact.', 'show_reviewer', '127.0.0.1', 'DemoBrowser/1.0', TIMESTAMPTZ '2024-06-01 12:05:00+00', TIMESTAMPTZ '2024-06-02 09:30:00+00');
INSERT INTO "Sponsors" (
"Id", "SeasonId", "Name", "WebsiteUrl", "LogoUrl", "Description", "Tier", "SortOrder", "IsVisible", "CreatedAt", "UpdatedAt"
)
VALUES
(9001, 1001, 'CloudBeacon Hosting', 'https://example.invalid/cloudbeacon', '/demo/sponsors/cloudbeacon-hosting.svg', 'Server- und Bot-Hosting fuer Community-Projekte.', 'Main Partner', 10, TRUE, TIMESTAMPTZ '2026-06-01 10:00:00+00', NULL),
(9002, 1001, 'NekoPixel Energy', 'https://example.invalid/nekopixel', '/demo/sponsors/nekopixel-energy.svg', 'Fiktiver Energy-Drink fuer lange Stream-Naechte.', 'Gold Partner', 20, TRUE, TIMESTAMPTZ '2026-06-01 10:05:00+00', NULL),
(9003, 1001, 'PrismLoop Audio', 'https://example.invalid/prismloop', '/demo/sponsors/prismloop-audio.svg', 'Audio-Tools und Soundpacks fuer Creator:innen.', 'Gold Partner', 30, TRUE, TIMESTAMPTZ '2026-06-01 10:10:00+00', NULL),
(9004, 1001, 'HoshiForge Studio', 'https://example.invalid/hoshiforge', '/demo/sponsors/hoshiforge-studio.svg', 'Branding, Overlays und kleine Motion-Pakete.', 'Community Partner', 40, TRUE, TIMESTAMPTZ '2026-06-01 10:15:00+00', NULL),
(9005, 1001, 'ChibiCanvas Market', 'https://example.invalid/chibicanvas', '/demo/sponsors/chibicanvas-market.svg', 'Asset-Marktplatz fuer Panels, Emotes und Stream-Grafiken.', 'Community Partner', 50, TRUE, TIMESTAMPTZ '2026-06-01 10:20:00+00', NULL);
INSERT INTO "RiskFlags" (
"Id", "SeasonId", "TwitchUserId", "Source", "Type", "Severity", "Status", "Summary", "CreatedFromIp", "UserAgent",
"MetadataJson", "ReviewNote", "ReviewedByTwitchId", "CreatedAt", "ReviewedAt"
)
VALUES
(10001, 1001, 'viewer_1012', 'tracking-review', 'no_tracker_data', 'medium', 'open', 'TwitchTracker lieferte keine belastbaren Daten fuer Ember Vail.', '127.0.0.1', 'DemoBrowser/1.0', '{"seasonId":1001,"nominationId":4012}', 'Manuelle Community-Pruefung vor Finale.', 'reviewer_demo', TIMESTAMPTZ '2026-06-18 11:02:00+00', TIMESTAMPTZ '2026-06-18 11:08:00+00'),
(10002, 1001, 'vote_user_007', 'voting', 'draft_ballot', 'low', 'resolved', 'Draft-Ballot ohne Submission, sichtbar fuer Dashboard-Randfall.', '127.0.0.1', 'DemoBrowser/1.0', '{"seasonId":1001,"ballotId":5007}', 'Nur Demo-Randfall.', 'reviewer_demo', TIMESTAMPTZ '2026-06-27 14:20:00+00', TIMESTAMPTZ '2026-06-27 15:00:00+00'),
(10003, 1000, 'archiv_viewer_1', 'archive-cleanup', 'archived_clip', 'low', 'resolved', 'Archiv-Clip 2025 wurde geprueft.', '127.0.0.1', 'DemoBrowser/1.0', '{"seasonId":1000,"clipId":7006}', 'Archiv okay.', 'reviewer_demo', TIMESTAMPTZ '2025-06-11 09:10:00+00', TIMESTAMPTZ '2025-06-11 09:25:00+00'),
(10004, 999, 'archiv_viewer_2', 'archive-cleanup', 'archived_clip', 'low', 'resolved', 'Archiv-Clip 2024 wurde geprueft.', '127.0.0.1', 'DemoBrowser/1.0', '{"seasonId":999,"clipId":7007}', 'Archiv okay.', 'reviewer_demo', TIMESTAMPTZ '2024-06-11 09:10:00+00', TIMESTAMPTZ '2024-06-11 09:25:00+00');
SELECT setval(pg_get_serial_sequence('"Seasons"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Seasons"), 1));
SELECT setval(pg_get_serial_sequence('"Categories"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Categories"), 1));
SELECT setval(pg_get_serial_sequence('"StreamerIdentities"', 'Id'), COALESCE((SELECT MAX("Id") FROM "StreamerIdentities"), 1));
SELECT setval(pg_get_serial_sequence('"Candidates"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Candidates"), 1));
SELECT setval(pg_get_serial_sequence('"Nominations"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Nominations"), 1));
SELECT setval(pg_get_serial_sequence('"VoteBallots"', 'Id'), COALESCE((SELECT MAX("Id") FROM "VoteBallots"), 1));
SELECT setval(pg_get_serial_sequence('"VoteEntries"', 'Id'), COALESCE((SELECT MAX("Id") FROM "VoteEntries"), 1));
SELECT setval(pg_get_serial_sequence('"Results"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Results"), 1));
SELECT setval(pg_get_serial_sequence('"ClipSubmissions"', 'Id'), COALESCE((SELECT MAX("Id") FROM "ClipSubmissions"), 1));
SELECT setval(pg_get_serial_sequence('"ShowactApplications"', 'Id'), COALESCE((SELECT MAX("Id") FROM "ShowactApplications"), 1));
SELECT setval(pg_get_serial_sequence('"Sponsors"', 'Id'), COALESCE((SELECT MAX("Id") FROM "Sponsors"), 1));
SELECT setval(pg_get_serial_sequence('"RiskFlags"', 'Id'), COALESCE((SELECT MAX("Id") FROM "RiskFlags"), 1));
"""
);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(
"""
DELETE FROM "RiskFlags" WHERE "SeasonId" IN (999, 1000, 1001);
DELETE FROM "Seasons" WHERE "Id" IN (999, 1000, 1001) AND "IsDemo" = TRUE;
DELETE FROM "StreamerIdentities" WHERE "Id" BETWEEN 3001 AND 3020;
"""
);
}
}