scaffold: EF design ref + initial migration

This commit is contained in:
cesnimda
2026-06-30 16:08:26 +02:00
parent f43ef5f945
commit 29a4aa2212
5 changed files with 1971 additions and 1 deletions
@@ -0,0 +1,498 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using NpgsqlTypes;
#nullable disable
namespace InboxIntel.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "analytics_aggregates",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
Day = table.Column<DateOnly>(type: "date", nullable: false),
TotalReceived = table.Column<int>(type: "integer", nullable: false),
TotalUnread = table.Column<int>(type: "integer", nullable: false),
NewsletterCount = table.Column<int>(type: "integer", nullable: false),
WithAttachments = table.Column<int>(type: "integer", nullable: false),
TotalSizeBytes = table.Column<long>(type: "bigint", nullable: false),
HourHistogramJson = table.Column<string>(type: "text", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_analytics_aggregates", x => x.Id);
});
migrationBuilder.CreateTable(
name: "domains",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
EmailCount = table.Column<int>(type: "integer", nullable: false),
IsBulkSender = table.Column<bool>(type: "boolean", nullable: false),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_domains", x => x.Id);
});
migrationBuilder.CreateTable(
name: "labels",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
GmailLabelId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
Name = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
Type = table.Column<string>(type: "text", nullable: false),
ColorHex = table.Column<string>(type: "text", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_labels", x => x.Id);
});
migrationBuilder.CreateTable(
name: "sync_states",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
Status = table.Column<int>(type: "integer", nullable: false),
LastSyncType = table.Column<int>(type: "integer", nullable: false),
LastHistoryId = table.Column<string>(type: "text", nullable: true),
ResumePageToken = table.Column<string>(type: "text", nullable: true),
TotalMessagesEstimate = table.Column<int>(type: "integer", nullable: false),
MessagesProcessed = table.Column<int>(type: "integer", nullable: false),
StartedUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
CompletedUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
LastSuccessfulSyncUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
ConsecutiveFailures = table.Column<int>(type: "integer", nullable: false),
LastError = table.Column<string>(type: "character varying(4000)", maxLength: 4000, nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_sync_states", x => x.Id);
});
migrationBuilder.CreateTable(
name: "threads",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
GmailThreadId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
Subject = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true),
Snippet = table.Column<string>(type: "text", nullable: true),
MessageCount = table.Column<int>(type: "integer", nullable: false),
FirstMessageUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
LastMessageUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_threads", x => x.Id);
});
migrationBuilder.CreateTable(
name: "users",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
GoogleSubjectId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
Email = table.Column<string>(type: "character varying(320)", maxLength: 320, nullable: false),
DisplayName = table.Column<string>(type: "text", nullable: true),
PictureUrl = table.Column<string>(type: "text", nullable: true),
EncryptedRefreshToken = table.Column<byte[]>(type: "bytea", nullable: true),
AccessTokenExpiresAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
LastLoginUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_users", x => x.Id);
});
migrationBuilder.CreateTable(
name: "senders",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
DomainId = table.Column<Guid>(type: "uuid", nullable: false),
Address = table.Column<string>(type: "character varying(320)", maxLength: 320, nullable: false),
DisplayName = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
EmailCount = table.Column<int>(type: "integer", nullable: false),
UnreadCount = table.Column<int>(type: "integer", nullable: false),
TotalSizeBytes = table.Column<long>(type: "bigint", nullable: false),
LastReceivedUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
HasUnsubscribe = table.Column<bool>(type: "boolean", nullable: false),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_senders", x => x.Id);
table.ForeignKey(
name: "FK_senders_domains_DomainId",
column: x => x.DomainId,
principalTable: "domains",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "widget_layouts",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
WidgetKey = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
X = table.Column<int>(type: "integer", nullable: false),
Y = table.Column<int>(type: "integer", nullable: false),
W = table.Column<int>(type: "integer", nullable: false),
H = table.Column<int>(type: "integer", nullable: false),
Visible = table.Column<bool>(type: "boolean", nullable: false),
SortOrder = table.Column<int>(type: "integer", nullable: false),
SettingsJson = table.Column<string>(type: "text", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_widget_layouts", x => x.Id);
table.ForeignKey(
name: "FK_widget_layouts_users_UserId",
column: x => x.UserId,
principalTable: "users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "emails",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
GmailMessageId = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
ThreadId = table.Column<Guid>(type: "uuid", nullable: false),
SenderId = table.Column<Guid>(type: "uuid", nullable: false),
Subject = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true),
Snippet = table.Column<string>(type: "character varying(2048)", maxLength: 2048, nullable: true),
BodyText = table.Column<string>(type: "text", nullable: true),
SentAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
ReceivedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
SizeEstimateBytes = table.Column<long>(type: "bigint", nullable: false),
IsUnread = table.Column<bool>(type: "boolean", nullable: false),
IsStarred = table.Column<bool>(type: "boolean", nullable: false),
IsImportant = table.Column<bool>(type: "boolean", nullable: false),
IsInInbox = table.Column<bool>(type: "boolean", nullable: false),
IsTrashed = table.Column<bool>(type: "boolean", nullable: false),
HasAttachments = table.Column<bool>(type: "boolean", nullable: false),
HasListUnsubscribe = table.Column<bool>(type: "boolean", nullable: false),
ListUnsubscribeRaw = table.Column<string>(type: "character varying(2048)", maxLength: 2048, nullable: true),
SupportsOneClickUnsubscribe = table.Column<bool>(type: "boolean", nullable: false),
Category = table.Column<int>(type: "integer", nullable: false),
SearchVector = table.Column<NpgsqlTsVector>(type: "tsvector", nullable: true, computedColumnSql: "to_tsvector('english', coalesce(\"Subject\",'') || ' ' || coalesce(\"BodyText\",''))", stored: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_emails", x => x.Id);
table.ForeignKey(
name: "FK_emails_senders_SenderId",
column: x => x.SenderId,
principalTable: "senders",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_emails_threads_ThreadId",
column: x => x.ThreadId,
principalTable: "threads",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_emails_users_UserId",
column: x => x.UserId,
principalTable: "users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "unsubscribe_items",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
SenderId = table.Column<Guid>(type: "uuid", nullable: false),
Method = table.Column<int>(type: "integer", nullable: false),
Status = table.Column<int>(type: "integer", nullable: false),
UnsubscribeTarget = table.Column<string>(type: "character varying(2048)", maxLength: 2048, nullable: true),
EmailCount = table.Column<int>(type: "integer", nullable: false),
LastAttemptUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true),
ResultMessage = table.Column<string>(type: "text", nullable: true),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_unsubscribe_items", x => x.Id);
table.ForeignKey(
name: "FK_unsubscribe_items_senders_SenderId",
column: x => x.SenderId,
principalTable: "senders",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "attachments",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
UserId = table.Column<Guid>(type: "uuid", nullable: false),
EmailId = table.Column<Guid>(type: "uuid", nullable: false),
GmailAttachmentId = table.Column<string>(type: "text", nullable: true),
FileName = table.Column<string>(type: "character varying(512)", maxLength: 512, nullable: false),
MimeType = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true),
SizeBytes = table.Column<long>(type: "bigint", nullable: false),
CreatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: false),
UpdatedAtUtc = table.Column<DateTimeOffset>(type: "timestamp with time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_attachments", x => x.Id);
table.ForeignKey(
name: "FK_attachments_emails_EmailId",
column: x => x.EmailId,
principalTable: "emails",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "email_labels",
columns: table => new
{
EmailId = table.Column<Guid>(type: "uuid", nullable: false),
LabelId = table.Column<Guid>(type: "uuid", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_email_labels", x => new { x.EmailId, x.LabelId });
table.ForeignKey(
name: "FK_email_labels_emails_EmailId",
column: x => x.EmailId,
principalTable: "emails",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_email_labels_labels_LabelId",
column: x => x.LabelId,
principalTable: "labels",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_analytics_aggregates_UserId_Day",
table: "analytics_aggregates",
columns: new[] { "UserId", "Day" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_attachments_EmailId",
table: "attachments",
column: "EmailId");
migrationBuilder.CreateIndex(
name: "IX_attachments_UserId_MimeType",
table: "attachments",
columns: new[] { "UserId", "MimeType" });
migrationBuilder.CreateIndex(
name: "IX_domains_UserId_Name",
table: "domains",
columns: new[] { "UserId", "Name" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_email_labels_LabelId",
table: "email_labels",
column: "LabelId");
migrationBuilder.CreateIndex(
name: "IX_emails_SearchVector",
table: "emails",
column: "SearchVector")
.Annotation("Npgsql:IndexMethod", "GIN");
migrationBuilder.CreateIndex(
name: "IX_emails_SenderId",
table: "emails",
column: "SenderId");
migrationBuilder.CreateIndex(
name: "IX_emails_ThreadId",
table: "emails",
column: "ThreadId");
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_Category",
table: "emails",
columns: new[] { "UserId", "Category" });
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_GmailMessageId",
table: "emails",
columns: new[] { "UserId", "GmailMessageId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_IsInInbox",
table: "emails",
columns: new[] { "UserId", "IsInInbox" });
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_IsUnread",
table: "emails",
columns: new[] { "UserId", "IsUnread" });
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_SenderId",
table: "emails",
columns: new[] { "UserId", "SenderId" });
migrationBuilder.CreateIndex(
name: "IX_emails_UserId_SentAtUtc",
table: "emails",
columns: new[] { "UserId", "SentAtUtc" });
migrationBuilder.CreateIndex(
name: "IX_labels_UserId_GmailLabelId",
table: "labels",
columns: new[] { "UserId", "GmailLabelId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_senders_DomainId",
table: "senders",
column: "DomainId");
migrationBuilder.CreateIndex(
name: "IX_senders_UserId_Address",
table: "senders",
columns: new[] { "UserId", "Address" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_senders_UserId_EmailCount",
table: "senders",
columns: new[] { "UserId", "EmailCount" });
migrationBuilder.CreateIndex(
name: "IX_sync_states_UserId",
table: "sync_states",
column: "UserId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_threads_UserId_GmailThreadId",
table: "threads",
columns: new[] { "UserId", "GmailThreadId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_unsubscribe_items_SenderId",
table: "unsubscribe_items",
column: "SenderId");
migrationBuilder.CreateIndex(
name: "IX_unsubscribe_items_UserId_SenderId",
table: "unsubscribe_items",
columns: new[] { "UserId", "SenderId" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_users_Email",
table: "users",
column: "Email",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_users_GoogleSubjectId",
table: "users",
column: "GoogleSubjectId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_widget_layouts_UserId_WidgetKey",
table: "widget_layouts",
columns: new[] { "UserId", "WidgetKey" },
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "analytics_aggregates");
migrationBuilder.DropTable(
name: "attachments");
migrationBuilder.DropTable(
name: "email_labels");
migrationBuilder.DropTable(
name: "sync_states");
migrationBuilder.DropTable(
name: "unsubscribe_items");
migrationBuilder.DropTable(
name: "widget_layouts");
migrationBuilder.DropTable(
name: "emails");
migrationBuilder.DropTable(
name: "labels");
migrationBuilder.DropTable(
name: "senders");
migrationBuilder.DropTable(
name: "threads");
migrationBuilder.DropTable(
name: "users");
migrationBuilder.DropTable(
name: "domains");
}
}
}