using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace DorkNet.Server.Migrations { /// public partial class MakeRoomDataBlobBytesNullable : Migration { // CRITICAL: this migration must NOT drop or recreate the Bytes // column. The column physically exists on every prod DB and // holds the legacy bytes that haven't been backfilled to S3 // yet. A DropColumn here would obliterate every pre-cutover // room save. We only flip NOT NULL -> NULL so new inserts // (which leave the property null because writers go S3-only // now) don't crash on the constraint. Run the // /api/admin/v1/storage/backfill admin endpoint to copy the // bytes from this column into S3 row-by-row; a follow-up // migration drops the column once every row has been moved. protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AlterColumn( name: "Bytes", table: "RoomDataBlobs", type: "BLOB", nullable: true, oldClrType: typeof(byte[]), oldType: "BLOB"); } /// protected override void Down(MigrationBuilder migrationBuilder) { // Re-tighten to NOT NULL. Any rows that became NULL during // the backfill won't pass this constraint — caller's // responsibility to repopulate or delete those rows // before rolling back. Defaulting to empty BLOB keeps // the constraint satisfiable. migrationBuilder.AlterColumn( name: "Bytes", table: "RoomDataBlobs", type: "BLOB", nullable: false, defaultValue: new byte[0], oldClrType: typeof(byte[]), oldType: "BLOB", oldNullable: true); } } }