Improve admin candidate modal UX and add clip menu visibility toggle
- Widen AdminCandidateEditorModal to size lg for better readability - Rename "Clip-Compilation" section to "Clip / Compilation", update copy to reflect single clips too, drop upload hint and Clip-Plattform field, rename label to "Link" - Fix NativeSelect dropdown clipping inside overflow-y-auto modals by teleporting the menu to body with fixed positioning, flip-up logic, and dynamic maxHeight capped to viewport - Add ClipAdminMenuVisible setting (backend domain, contracts, endpoint, migration) with matching frontend types, defaults, form wiring, and toggle in the Clip-Workflow modal — hides the Clips nav item from the admin sidebar when disabled Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+1527
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,177 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Backend.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddCandidatePreparationFields : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "AcceptanceNote",
|
||||
table: "Candidates",
|
||||
type: "character varying(500)",
|
||||
maxLength: 500,
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "AcceptanceStatus",
|
||||
table: "Candidates",
|
||||
type: "character varying(30)",
|
||||
maxLength: 30,
|
||||
nullable: false,
|
||||
defaultValue: "open");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ClipCompilationPlatform",
|
||||
table: "Candidates",
|
||||
type: "character varying(40)",
|
||||
maxLength: 40,
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ClipCompilationTitle",
|
||||
table: "Candidates",
|
||||
type: "character varying(200)",
|
||||
maxLength: 200,
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ClipCompilationUrl",
|
||||
table: "Candidates",
|
||||
type: "character varying(500)",
|
||||
maxLength: 500,
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ClipEmbedStatus",
|
||||
table: "Candidates",
|
||||
type: "character varying(30)",
|
||||
maxLength: 30,
|
||||
nullable: false,
|
||||
defaultValue: "unchecked");
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 2,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 3,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 4,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 5,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 6,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 7,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 8,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 9,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 10,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 11,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 12,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "Candidates",
|
||||
keyColumn: "Id",
|
||||
keyValue: 13,
|
||||
columns: new[] { "AcceptanceNote", "AcceptanceStatus", "ClipCompilationPlatform", "ClipCompilationTitle", "ClipCompilationUrl", "ClipEmbedStatus" },
|
||||
values: new object[] { null, "open", null, null, null, "unchecked" });
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "AcceptanceNote",
|
||||
table: "Candidates");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "AcceptanceStatus",
|
||||
table: "Candidates");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ClipCompilationPlatform",
|
||||
table: "Candidates");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ClipCompilationTitle",
|
||||
table: "Candidates");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ClipCompilationUrl",
|
||||
table: "Candidates");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ClipEmbedStatus",
|
||||
table: "Candidates");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,35 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Backend.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddWorkflowRulesJson : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
ADD COLUMN IF NOT EXISTS "WorkflowRulesJson" text NOT NULL DEFAULT '[]';
|
||||
""");
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "SiteSettings",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
column: "WorkflowRulesJson",
|
||||
value: "[{\"key\":\"max_finalists_per_category\",\"label\":\"Finale Kandidat:innen pro Kategorie\",\"enabled\":true,\"limit\":4,\"mode\":\"block\",\"description\":\"Begrenzt, wie viele finale Kandidat:innen in einer Kategorie vorbereitet werden.\"},{\"key\":\"max_candidate_appearances\",\"label\":\"Kandidaturen pro Person\",\"enabled\":true,\"limit\":2,\"mode\":\"warn\",\"description\":\"Warnt oder blockiert, wenn dieselbe Person in zu vielen Kategorien final auftaucht.\"},{\"key\":\"max_winner_placements\",\"label\":\"Gewinnerpl\\u00E4tze pro Person\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn dieselbe Person mehrfach als Gewinner:in gesetzt wird.\"}]");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
DROP COLUMN IF EXISTS "WorkflowRulesJson";
|
||||
""");
|
||||
}
|
||||
}
|
||||
}
|
||||
+1552
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,55 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Backend.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddOptionalClipFeatureSettings : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
ADD COLUMN IF NOT EXISTS "ClipReviewEnabled" boolean NOT NULL DEFAULT true;
|
||||
""");
|
||||
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
ADD COLUMN IF NOT EXISTS "ClipSubmissionDisabledMessage" character varying(240) NOT NULL DEFAULT 'Clip-Einreichungen sind aktuell geschlossen.';
|
||||
""");
|
||||
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
ADD COLUMN IF NOT EXISTS "ClipSubmissionsEnabled" boolean NOT NULL DEFAULT false;
|
||||
""");
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "SiteSettings",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
columns: new[] { "ClipReviewEnabled", "ClipSubmissionDisabledMessage" },
|
||||
values: new object[] { true, "Clip-Einreichungen sind aktuell geschlossen." });
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
DROP COLUMN IF EXISTS "ClipReviewEnabled";
|
||||
""");
|
||||
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
DROP COLUMN IF EXISTS "ClipSubmissionDisabledMessage";
|
||||
""");
|
||||
|
||||
migrationBuilder.Sql("""
|
||||
ALTER TABLE "SiteSettings"
|
||||
DROP COLUMN IF EXISTS "ClipSubmissionsEnabled";
|
||||
""");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Backend.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddNominationLinkBlacklist : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "NominationLinkBlacklistJson",
|
||||
table: "SiteSettings",
|
||||
type: "text",
|
||||
nullable: false,
|
||||
defaultValue: "[]");
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "SiteSettings",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
column: "NominationLinkBlacklistJson",
|
||||
value: "[{\"Url\":\"https://kick.com/\"},{\"Url\":\"https://www.twitch.tv/\"},{\"Url\":\"https://www.youtube.com/\"}]");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "NominationLinkBlacklistJson",
|
||||
table: "SiteSettings");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,180 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Backend.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddClipAdminMenuVisible : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "ClipAdminMenuVisible",
|
||||
table: "SiteSettings",
|
||||
type: "boolean",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ShowactApplicationDisabledMessage",
|
||||
table: "SiteSettings",
|
||||
type: "character varying(240)",
|
||||
maxLength: 240,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "ShowactApplicationsEnabled",
|
||||
table: "SiteSettings",
|
||||
type: "boolean",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ShowactsContent",
|
||||
table: "SiteSettings",
|
||||
type: "text",
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "ShowactsUrl",
|
||||
table: "SiteSettings",
|
||||
type: "character varying(400)",
|
||||
maxLength: 400,
|
||||
nullable: false,
|
||||
defaultValue: "");
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "SponsorsVisible",
|
||||
table: "SiteSettings",
|
||||
type: "boolean",
|
||||
nullable: false,
|
||||
defaultValue: true);
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ShowactApplications",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
SeasonId = table.Column<int>(type: "integer", nullable: false),
|
||||
ArtistName = table.Column<string>(type: "character varying(120)", maxLength: 120, nullable: false),
|
||||
ContactEmail = table.Column<string>(type: "character varying(180)", maxLength: 180, nullable: false),
|
||||
ContactDiscord = table.Column<string>(type: "character varying(120)", maxLength: 120, nullable: false),
|
||||
PlatformUrl = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||
PerformanceType = table.Column<string>(type: "character varying(80)", maxLength: 80, nullable: false),
|
||||
Description = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: false),
|
||||
TechnicalNotes = table.Column<string>(type: "character varying(1000)", maxLength: 1000, nullable: false),
|
||||
ReferenceUrl = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||
Status = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: false),
|
||||
ReviewNote = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: true),
|
||||
ReviewedByTwitchId = table.Column<string>(type: "character varying(120)", maxLength: 120, nullable: true),
|
||||
CreatedFromIp = table.Column<string>(type: "character varying(80)", maxLength: 80, nullable: false),
|
||||
UserAgent = table.Column<string>(type: "character varying(400)", maxLength: 400, nullable: false),
|
||||
CreatedAt = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
|
||||
ReviewedAt = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ShowactApplications", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_ShowactApplications_Seasons_SeasonId",
|
||||
column: x => x.SeasonId,
|
||||
principalTable: "Seasons",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Sponsors",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
SeasonId = table.Column<int>(type: "integer", nullable: false),
|
||||
Name = table.Column<string>(type: "character varying(120)", maxLength: 120, nullable: false),
|
||||
WebsiteUrl = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||
LogoUrl = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||
Description = table.Column<string>(type: "character varying(500)", maxLength: 500, nullable: false),
|
||||
Tier = table.Column<string>(type: "character varying(80)", maxLength: 80, nullable: false),
|
||||
SortOrder = table.Column<int>(type: "integer", nullable: false),
|
||||
IsVisible = table.Column<bool>(type: "boolean", nullable: false),
|
||||
CreatedAt = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
|
||||
UpdatedAt = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Sponsors", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Sponsors_Seasons_SeasonId",
|
||||
column: x => x.SeasonId,
|
||||
principalTable: "Seasons",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "SiteSettings",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
columns: new[] { "ClipAdminMenuVisible", "ShowactApplicationDisabledMessage", "ShowactsContent", "ShowactsUrl", "SponsorsVisible", "WorkflowRulesJson" },
|
||||
values: new object[] { true, "Showact-Bewerbungen sind aktuell geschlossen.", "Informationen zu Showact-Bewerbungen, Ablauf und Kontakt fuer die Award-Show.", "https://vtuber-star-awards.de/showacts", true, "[{\"key\":\"max_finalists_per_category\",\"label\":\"Finale Kandidat:innen pro Kategorie\",\"enabled\":true,\"limit\":4,\"mode\":\"block\",\"description\":\"Begrenzt, wie viele finale Kandidat:innen in einer Kategorie vorbereitet werden.\"},{\"key\":\"max_candidate_appearances\",\"label\":\"Kandidaturen pro Person\",\"enabled\":true,\"limit\":2,\"mode\":\"warn\",\"description\":\"Warnt oder blockiert, wenn dieselbe Person in zu vielen Kategorien final auftaucht.\"},{\"key\":\"max_winner_placements\",\"label\":\"Gewinnerpl\\u00E4tze pro Person\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn dieselbe Person mehrfach als Gewinner:in gesetzt wird.\"},{\"key\":\"winner_requires_clip\",\"label\":\"Gewinner braucht Clip-Link\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn ein Gewinner ohne gepflegten YouTube-/Twitch-Clip gesetzt wird.\"}]" });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ShowactApplications_SeasonId_Status",
|
||||
table: "ShowactApplications",
|
||||
columns: new[] { "SeasonId", "Status" });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Sponsors_SeasonId_IsVisible_SortOrder",
|
||||
table: "Sponsors",
|
||||
columns: new[] { "SeasonId", "IsVisible", "SortOrder" });
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "ShowactApplications");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Sponsors");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ClipAdminMenuVisible",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ShowactApplicationDisabledMessage",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ShowactApplicationsEnabled",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ShowactsContent",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ShowactsUrl",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "SponsorsVisible",
|
||||
table: "SiteSettings");
|
||||
|
||||
migrationBuilder.UpdateData(
|
||||
table: "SiteSettings",
|
||||
keyColumn: "Id",
|
||||
keyValue: 1,
|
||||
column: "WorkflowRulesJson",
|
||||
value: "[{\"key\":\"max_finalists_per_category\",\"label\":\"Finale Kandidat:innen pro Kategorie\",\"enabled\":true,\"limit\":4,\"mode\":\"block\",\"description\":\"Begrenzt, wie viele finale Kandidat:innen in einer Kategorie vorbereitet werden.\"},{\"key\":\"max_candidate_appearances\",\"label\":\"Kandidaturen pro Person\",\"enabled\":true,\"limit\":2,\"mode\":\"warn\",\"description\":\"Warnt oder blockiert, wenn dieselbe Person in zu vielen Kategorien final auftaucht.\"},{\"key\":\"max_winner_placements\",\"label\":\"Gewinnerpl\\u00E4tze pro Person\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn dieselbe Person mehrfach als Gewinner:in gesetzt wird.\"}]");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,6 +169,17 @@ namespace Backend.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("AcceptanceNote")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<string>("AcceptanceStatus")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasMaxLength(30)
|
||||
.HasColumnType("character varying(30)")
|
||||
.HasDefaultValue("open");
|
||||
|
||||
b.Property<int>("CategoryId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
@@ -177,6 +188,25 @@ namespace Backend.Migrations
|
||||
.HasMaxLength(120)
|
||||
.HasColumnType("character varying(120)");
|
||||
|
||||
b.Property<string>("ClipCompilationPlatform")
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("character varying(40)");
|
||||
|
||||
b.Property<string>("ClipCompilationTitle")
|
||||
.HasMaxLength(200)
|
||||
.HasColumnType("character varying(200)");
|
||||
|
||||
b.Property<string>("ClipCompilationUrl")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<string>("ClipEmbedStatus")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasMaxLength(30)
|
||||
.HasColumnType("character varying(30)")
|
||||
.HasDefaultValue("unchecked");
|
||||
|
||||
b.Property<string>("DisplayName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(120)
|
||||
@@ -202,8 +232,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 1,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 1,
|
||||
ChannelSlug = "@hoshimimiyu",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Hoshimi Miyu",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -211,8 +243,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 2,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 1,
|
||||
ChannelSlug = "@kurainu",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Kurainu",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -220,8 +254,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 3,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 1,
|
||||
ChannelSlug = "@shiroch",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Shiro Ch.",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -229,8 +265,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 4,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 2,
|
||||
ChannelSlug = "@kurainu",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Kurainu 3D Live",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -238,8 +276,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 5,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 2,
|
||||
ChannelSlug = "@aoisakura",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Aoi Sakura Showcase",
|
||||
Platform = "YouTube",
|
||||
SeasonId = 1
|
||||
@@ -247,8 +287,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 6,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 3,
|
||||
ChannelSlug = "@pyonkichikingdom",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Pyonkichi Kingdom",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -256,8 +298,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 7,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 4,
|
||||
ChannelSlug = "@moonrelay",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Moonrelay",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 1
|
||||
@@ -265,8 +309,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 8,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 5,
|
||||
ChannelSlug = "@hoshimimiyu",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Hoshimi Miyu",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 2
|
||||
@@ -274,8 +320,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 9,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 6,
|
||||
ChannelSlug = "@kurainu",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Kurainu 3D Live",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 2
|
||||
@@ -283,8 +331,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 10,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 7,
|
||||
ChannelSlug = "@pyonkichikingdom",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Pyonkichi Kingdom",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 2
|
||||
@@ -292,8 +342,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 11,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 8,
|
||||
ChannelSlug = "@aoisakura",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Aoi Sakura",
|
||||
Platform = "YouTube",
|
||||
SeasonId = 3
|
||||
@@ -301,8 +353,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 12,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 9,
|
||||
ChannelSlug = "@starbyte",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Starbyte",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 3
|
||||
@@ -310,8 +364,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 13,
|
||||
AcceptanceStatus = "open",
|
||||
CategoryId = 10,
|
||||
ChannelSlug = "@tenshivox",
|
||||
ClipEmbedStatus = "unchecked",
|
||||
DisplayName = "Tenshi Vox",
|
||||
Platform = "Twitch",
|
||||
SeasonId = 4
|
||||
@@ -844,6 +900,93 @@ namespace Backend.Migrations
|
||||
});
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.ShowactApplication", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("ArtistName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(120)
|
||||
.HasColumnType("character varying(120)");
|
||||
|
||||
b.Property<string>("ContactDiscord")
|
||||
.IsRequired()
|
||||
.HasMaxLength(120)
|
||||
.HasColumnType("character varying(120)");
|
||||
|
||||
b.Property<string>("ContactEmail")
|
||||
.IsRequired()
|
||||
.HasMaxLength(180)
|
||||
.HasColumnType("character varying(180)");
|
||||
|
||||
b.Property<DateTimeOffset>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("CreatedFromIp")
|
||||
.IsRequired()
|
||||
.HasMaxLength(80)
|
||||
.HasColumnType("character varying(80)");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.IsRequired()
|
||||
.HasMaxLength(1000)
|
||||
.HasColumnType("character varying(1000)");
|
||||
|
||||
b.Property<string>("PerformanceType")
|
||||
.IsRequired()
|
||||
.HasMaxLength(80)
|
||||
.HasColumnType("character varying(80)");
|
||||
|
||||
b.Property<string>("PlatformUrl")
|
||||
.IsRequired()
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<string>("ReferenceUrl")
|
||||
.IsRequired()
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<string>("ReviewNote")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<DateTimeOffset?>("ReviewedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("ReviewedByTwitchId")
|
||||
.HasMaxLength(120)
|
||||
.HasColumnType("character varying(120)");
|
||||
|
||||
b.Property<int>("SeasonId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<string>("Status")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("character varying(20)");
|
||||
|
||||
b.Property<string>("TechnicalNotes")
|
||||
.IsRequired()
|
||||
.HasMaxLength(1000)
|
||||
.HasColumnType("character varying(1000)");
|
||||
|
||||
b.Property<string>("UserAgent")
|
||||
.IsRequired()
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("character varying(400)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("SeasonId", "Status");
|
||||
|
||||
b.ToTable("ShowactApplications");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.SiteSettings", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -852,6 +995,24 @@ namespace Backend.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<bool>("ClipAdminMenuVisible")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<bool>("ClipReviewEnabled")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("boolean")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<string>("ClipSubmissionDisabledMessage")
|
||||
.IsRequired()
|
||||
.HasMaxLength(240)
|
||||
.HasColumnType("character varying(240)");
|
||||
|
||||
b.Property<bool>("ClipSubmissionsEnabled")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("boolean")
|
||||
.HasDefaultValue(false);
|
||||
|
||||
b.Property<string>("ContactContent")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
@@ -933,6 +1094,12 @@ namespace Backend.Migrations
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("character varying(400)");
|
||||
|
||||
b.Property<string>("NominationLinkBlacklistJson")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("text")
|
||||
.HasDefaultValue("[]");
|
||||
|
||||
b.Property<string>("PrivacyEmail")
|
||||
.IsRequired()
|
||||
.HasMaxLength(160)
|
||||
@@ -953,6 +1120,27 @@ namespace Backend.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<string>("ShowactApplicationDisabledMessage")
|
||||
.IsRequired()
|
||||
.HasMaxLength(240)
|
||||
.HasColumnType("character varying(240)");
|
||||
|
||||
b.Property<bool>("ShowactApplicationsEnabled")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("boolean")
|
||||
.HasDefaultValue(false);
|
||||
|
||||
b.Property<string>("ShowactsContent")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("text")
|
||||
.HasDefaultValue("");
|
||||
|
||||
b.Property<string>("ShowactsUrl")
|
||||
.IsRequired()
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("character varying(400)");
|
||||
|
||||
b.Property<string>("SocialLinksJson")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
@@ -966,6 +1154,11 @@ namespace Backend.Migrations
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("character varying(400)");
|
||||
|
||||
b.Property<bool>("SponsorsVisible")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("boolean")
|
||||
.HasDefaultValue(true);
|
||||
|
||||
b.Property<bool>("TwitchAuthManagedByDatabase")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
@@ -989,6 +1182,12 @@ namespace Backend.Migrations
|
||||
.HasMaxLength(300)
|
||||
.HasColumnType("character varying(300)");
|
||||
|
||||
b.Property<string>("WorkflowRulesJson")
|
||||
.IsRequired()
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("text")
|
||||
.HasDefaultValue("[]");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("SiteSettings");
|
||||
@@ -997,6 +1196,10 @@ namespace Backend.Migrations
|
||||
new
|
||||
{
|
||||
Id = 1,
|
||||
ClipAdminMenuVisible = true,
|
||||
ClipReviewEnabled = true,
|
||||
ClipSubmissionDisabledMessage = "Clip-Einreichungen sind aktuell geschlossen.",
|
||||
ClipSubmissionsEnabled = false,
|
||||
ContactContent = "Kontakt zum Award-Team\nDu hast Fragen zur Nominierung, zum Voting, zu Clips oder zur Show? Schreib dem Team ueber die hinterlegte Kontaktseite.\n\nDatenschutzfragen\nFuer Datenschutzanfragen nutze bitte die Datenschutz-E-Mail aus diesem Footer.\n\nCommunity & Kooperationen\nSocial Links und Partneranfragen werden vom Admin-Team gepflegt und koordiniert.",
|
||||
ContactUrl = "https://vtuber-star-awards.de/kontakt",
|
||||
DemoLoginDisplayName = "Jayuhime Admin",
|
||||
@@ -1015,22 +1218,84 @@ namespace Backend.Migrations
|
||||
MaintenanceModeEnabled = false,
|
||||
MaintenanceTitle = "Sternenpause",
|
||||
NewsletterUrl = "https://vtuber-star-awards.de/newsletter",
|
||||
NominationLinkBlacklistJson = "[{\"Url\":\"https://kick.com/\"},{\"Url\":\"https://www.twitch.tv/\"},{\"Url\":\"https://www.youtube.com/\"}]",
|
||||
PrivacyEmail = "datenschutz@vtuber-star-awards.de",
|
||||
PrivacyPolicyContent = "Verantwortliche:r\nVTuber Star Awards, vertreten durch Jayuhime. Kontakt: datenschutz@vtuber-star-awards.de\n\nWelche Daten wir verarbeiten\nBei Teilnahme (Voting, Nominierung, Clip-Einreichung) verarbeiten wir ausschließlich deine Twitch-User-ID sowie den Zeitstempel deiner Aktion.\nFür Show-Erinnerungen speichern wir optional deine E-Mail-Adresse.\n\nRechtsgrundlage\nVerarbeitung auf Basis von Art. 6 Abs. 1 lit. b DSGVO. Für optionale Erinnerungen gilt Art. 6 Abs. 1 lit. a DSGVO.\n\nZweck der Verarbeitung\nDurchführung des VTuber Star Awards, Sicherstellung fairer Abstimmung, Spam-Prävention sowie Admin-Review von Einreichungen.\n\nLöschfristen\nAlle Teilnahmedaten werden spätestens 6 Monate nach der Award-Show automatisch gelöscht. E-Mail-Adressen werden nach der Show entfernt.\n\nDeine Rechte\nDu hast das Recht auf Auskunft, Löschung, Berichtigung, Widerspruch und Beschwerde bei der zuständigen Aufsichtsbehörde.\n\nWeitergabe an Dritte\nKeine Weitergabe zu Werbezwecken. Technische Dienstleister verarbeiten Daten ausschließlich im Rahmen der Auftragsverarbeitung.",
|
||||
PrivacyPolicyUpdatedAt = new DateTimeOffset(new DateTime(2026, 6, 23, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
|
||||
PrivacyPolicyUpdatedBy = "seed",
|
||||
RiskRulesJson = "[{\"key\":\"resubmitted_ballot\",\"label\":\"Ballot erneut gespeichert\",\"enabled\":true,\"threshold\":1,\"windowMinutes\":360,\"severity\":\"low\",\"description\":\"Erstellt einen Hinweis, wenn ein User sein Voting erneut speichert.\"},{\"key\":\"rapid_vote_updates\",\"label\":\"Voting-Burst\",\"enabled\":true,\"threshold\":3,\"windowMinutes\":10,\"severity\":\"high\",\"description\":\"Erstellt einen Hinweis, wenn ein User sehr schnell mehrere Voting-Aenderungen ausloest.\"},{\"key\":\"resubmitted_nomination\",\"label\":\"Nominierung erneut eingereicht\",\"enabled\":true,\"threshold\":1,\"windowMinutes\":360,\"severity\":\"low\",\"description\":\"Erstellt einen Hinweis, wenn ein User in derselben Kategorie erneut nominiert.\"},{\"key\":\"rapid_nomination_burst\",\"label\":\"Nominierungs-Burst\",\"enabled\":true,\"threshold\":10,\"windowMinutes\":10,\"severity\":\"high\",\"description\":\"Erstellt einen Hinweis, wenn ein User sehr viele Nominierungen in kurzer Zeit sendet.\"},{\"key\":\"duplicate_clip_submission\",\"label\":\"Doppelter Clip\",\"enabled\":true,\"threshold\":1,\"windowMinutes\":360,\"severity\":\"medium\",\"description\":\"Erstellt einen Hinweis, wenn ein User denselben Clip erneut einreicht.\"},{\"key\":\"rapid_clip_burst\",\"label\":\"Clip-Burst\",\"enabled\":true,\"threshold\":5,\"windowMinutes\":10,\"severity\":\"high\",\"description\":\"Erstellt einen Hinweis, wenn ein User sehr viele Clips in kurzer Zeit sendet.\"},{\"key\":\"rapid_login_ip\",\"label\":\"Login-Burst pro IP\",\"enabled\":true,\"threshold\":3,\"windowMinutes\":15,\"severity\":\"medium\",\"description\":\"Erstellt einen Hinweis, wenn mehrere neue Sessions von derselben IP entstehen.\"},{\"key\":\"rapid_demo_login_ip\",\"label\":\"Demo-Login-Burst pro IP\",\"enabled\":true,\"threshold\":3,\"windowMinutes\":15,\"severity\":\"medium\",\"description\":\"Erstellt einen Hinweis, wenn mehrere Demo-Admin-Sessions von derselben IP entstehen.\"}]",
|
||||
ShowactApplicationDisabledMessage = "Showact-Bewerbungen sind aktuell geschlossen.",
|
||||
ShowactApplicationsEnabled = false,
|
||||
ShowactsContent = "Informationen zu Showact-Bewerbungen, Ablauf und Kontakt fuer die Award-Show.",
|
||||
ShowactsUrl = "https://vtuber-star-awards.de/showacts",
|
||||
SocialLinksJson = "[{\"label\":\"Twitch\",\"platform\":\"twitch\",\"url\":\"https://twitch.tv/jayuhime\",\"icon\":\"twitch\",\"showOnHost\":true,\"showOnCommunity\":true},{\"label\":\"YouTube\",\"platform\":\"youtube\",\"url\":\"https://youtube.com/c/Jayuhime\",\"icon\":\"youtube\",\"showOnHost\":true,\"showOnCommunity\":true},{\"label\":\"X\",\"platform\":\"x\",\"url\":\"https://x.com/jayuhime\",\"icon\":\"x\",\"showOnHost\":true,\"showOnCommunity\":true},{\"label\":\"Instagram\",\"platform\":\"instagram\",\"url\":\"https://instagram.com/jayuhime\",\"icon\":\"instagram\",\"showOnHost\":true,\"showOnCommunity\":true},{\"label\":\"Discord\",\"platform\":\"discord\",\"url\":\"https://discord.gg/jayuhime\",\"icon\":\"discord\",\"showOnHost\":true,\"showOnCommunity\":true}]",
|
||||
SponsorsContent = "Sponsoren & Partner\nHier koennen Sponsor:innen, Medienpartner, Community-Partner und Supporter des VTuber Star Awards vorgestellt werden.\n\nPartner werden im Rahmen der Show und auf den oeffentlichen Kontaktflaechen genannt, sobald sie final bestaetigt sind.",
|
||||
SponsorsUrl = "https://vtuber-star-awards.de/partner",
|
||||
SponsorsVisible = true,
|
||||
TwitchAuthManagedByDatabase = false,
|
||||
TwitchClientId = "",
|
||||
TwitchClientSecret = "",
|
||||
TwitchRedirectUri = "",
|
||||
TwitchScope = ""
|
||||
TwitchScope = "",
|
||||
WorkflowRulesJson = "[{\"key\":\"max_finalists_per_category\",\"label\":\"Finale Kandidat:innen pro Kategorie\",\"enabled\":true,\"limit\":4,\"mode\":\"block\",\"description\":\"Begrenzt, wie viele finale Kandidat:innen in einer Kategorie vorbereitet werden.\"},{\"key\":\"max_candidate_appearances\",\"label\":\"Kandidaturen pro Person\",\"enabled\":true,\"limit\":2,\"mode\":\"warn\",\"description\":\"Warnt oder blockiert, wenn dieselbe Person in zu vielen Kategorien final auftaucht.\"},{\"key\":\"max_winner_placements\",\"label\":\"Gewinnerpl\\u00E4tze pro Person\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn dieselbe Person mehrfach als Gewinner:in gesetzt wird.\"},{\"key\":\"winner_requires_clip\",\"label\":\"Gewinner braucht Clip-Link\",\"enabled\":true,\"limit\":1,\"mode\":\"block\",\"description\":\"Verhindert oder warnt, wenn ein Gewinner ohne gepflegten YouTube-/Twitch-Clip gesetzt wird.\"}]"
|
||||
});
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.Sponsor", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTimeOffset>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.IsRequired()
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<bool>("IsVisible")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("LogoUrl")
|
||||
.IsRequired()
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasMaxLength(120)
|
||||
.HasColumnType("character varying(120)");
|
||||
|
||||
b.Property<int>("SeasonId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("SortOrder")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<string>("Tier")
|
||||
.IsRequired()
|
||||
.HasMaxLength(80)
|
||||
.HasColumnType("character varying(80)");
|
||||
|
||||
b.Property<DateTimeOffset?>("UpdatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("WebsiteUrl")
|
||||
.IsRequired()
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("character varying(500)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("SeasonId", "IsVisible", "SortOrder");
|
||||
|
||||
b.ToTable("Sponsors");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.TeamMember", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -1408,6 +1673,28 @@ namespace Backend.Migrations
|
||||
b.Navigation("Season");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.ShowactApplication", b =>
|
||||
{
|
||||
b.HasOne("Backend.Domain.Season", "Season")
|
||||
.WithMany()
|
||||
.HasForeignKey("SeasonId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Season");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.Sponsor", b =>
|
||||
{
|
||||
b.HasOne("Backend.Domain.Season", "Season")
|
||||
.WithMany()
|
||||
.HasForeignKey("SeasonId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Season");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Backend.Domain.VoteBallot", b =>
|
||||
{
|
||||
b.HasOne("Backend.Domain.Season", "Season")
|
||||
|
||||
Reference in New Issue
Block a user