using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace Musify.Infrastructure.Persistence.Migrations { /// public partial class AddArtistsAndTrackOwnership : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn( name: "OwnerUserId", table: "Tracks", type: "bigint", nullable: true); migrationBuilder.CreateTable( name: "Artists", columns: table => new { Id = table.Column(type: "uuid", nullable: false), Name = table.Column(type: "character varying(200)", maxLength: 200, nullable: false), NormalizedName = table.Column(type: "character varying(200)", maxLength: 200, nullable: false), UserId = table.Column(type: "bigint", nullable: true), ExternalId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) }, constraints: table => { table.PrimaryKey("PK_Artists", x => x.Id); table.ForeignKey( name: "FK_Artists_User_UserId", column: x => x.UserId, principalTable: "User", principalColumn: "Id"); }); migrationBuilder.CreateTable( name: "TrackArtist", columns: table => new { TrackId = table.Column(type: "uuid", nullable: false), ArtistId = table.Column(type: "uuid", nullable: false), Position = table.Column(type: "integer", nullable: false) }, constraints: table => { table.PrimaryKey("PK_TrackArtist", x => new { x.TrackId, x.ArtistId }); table.ForeignKey( name: "FK_TrackArtist_Artists_ArtistId", column: x => x.ArtistId, principalTable: "Artists", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_TrackArtist_Tracks_TrackId", column: x => x.TrackId, principalTable: "Tracks", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "IX_Tracks_OwnerUserId", table: "Tracks", column: "OwnerUserId"); migrationBuilder.CreateIndex( name: "IX_Artists_ExternalId", table: "Artists", column: "ExternalId", unique: true); migrationBuilder.CreateIndex( name: "IX_Artists_NormalizedName", table: "Artists", column: "NormalizedName", unique: true, filter: "\"ExternalId\" IS NULL AND \"UserId\" IS NULL"); migrationBuilder.CreateIndex( name: "IX_Artists_UserId", table: "Artists", column: "UserId", unique: true); migrationBuilder.CreateIndex( name: "IX_TrackArtist_ArtistId", table: "TrackArtist", column: "ArtistId"); migrationBuilder.AddForeignKey( name: "FK_Tracks_User_OwnerUserId", table: "Tracks", column: "OwnerUserId", principalTable: "User", principalColumn: "Id", onDelete: ReferentialAction.Restrict); migrationBuilder.Sql( """ UPDATE "Tracks" t SET "OwnerUserId" = ut."UserId" FROM (SELECT "TrackId", MIN("UserId") AS "UserId" FROM "UserHasTrack" GROUP BY "TrackId") ut WHERE t."Source" = 0 AND ut."TrackId" = t."Id"; """); migrationBuilder.Sql( """ INSERT INTO "Artists" ("Id", "Name", "NormalizedName", "UserId", "ExternalId", "CreatedAt", "UpdatedAt") SELECT gen_random_uuid(), u."Name", u."NormalizedName", u."Id", NULL, now(), now() FROM "User" u WHERE EXISTS (SELECT 1 FROM "Tracks" t WHERE t."OwnerUserId" = u."Id"); """); migrationBuilder.Sql( """ INSERT INTO "Artists" ("Id", "Name", "NormalizedName", "UserId", "ExternalId", "CreatedAt", "UpdatedAt") SELECT gen_random_uuid(), s."Artist", upper(s."Artist"), NULL, NULL, now(), now() FROM (SELECT DISTINCT "Artist" FROM "Tracks" WHERE "Source" = 1 AND "Artist" IS NOT NULL) s; """); migrationBuilder.Sql( """ INSERT INTO "TrackArtist" ("TrackId", "ArtistId", "Position") SELECT t."Id", a."Id", 0 FROM "Tracks" t JOIN "Artists" a ON a."UserId" = t."OwnerUserId" WHERE t."Source" = 0; """); migrationBuilder.Sql( """ INSERT INTO "TrackArtist" ("TrackId", "ArtistId", "Position") SELECT t."Id", a."Id", 0 FROM "Tracks" t JOIN "Artists" a ON a."UserId" IS NULL AND a."ExternalId" IS NULL AND a."Name" = t."Artist" WHERE t."Source" = 1 AND t."Artist" IS NOT NULL; """); migrationBuilder.AddCheckConstraint( name: "CK_Tracks_OwnerUserId_Source", table: "Tracks", sql: "(\"OwnerUserId\" IS NOT NULL) = (\"Source\" = 0)"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "FK_Tracks_User_OwnerUserId", table: "Tracks"); migrationBuilder.DropTable( name: "TrackArtist"); migrationBuilder.DropTable( name: "Artists"); migrationBuilder.DropIndex( name: "IX_Tracks_OwnerUserId", table: "Tracks"); migrationBuilder.DropCheckConstraint( name: "CK_Tracks_OwnerUserId_Source", table: "Tracks"); migrationBuilder.DropColumn( name: "OwnerUserId", table: "Tracks"); } } }