diff --git a/Directory.Packages.props b/Directory.Packages.props
index 5430aaa0d..0b6a6c417 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -36,6 +36,7 @@
+
diff --git a/src/DevBetterWeb.Core/Entities/Member.cs b/src/DevBetterWeb.Core/Entities/Member.cs
index 2b0549ca1..5598ee5e2 100644
--- a/src/DevBetterWeb.Core/Entities/Member.cs
+++ b/src/DevBetterWeb.Core/Entities/Member.cs
@@ -44,7 +44,6 @@ internal Member(string userId, string firstName, string lastName)
public string? LastName { get; private set; }
public Birthday? Birthday { get; private set; }
public string? AboutInfo { get; private set; }
- public string? Address { get; private set; }
public Address? ShippingAddress { get; private set; }
public Geolocation? CityLocation { get; private set; }
@@ -64,6 +63,9 @@ internal Member(string userId, string firstName, string lastName)
public string? DiscordUsername { get; private set; }
public string? MastodonUrl { get; private set; } // added and deployed 5 Jan 2022 but site broke
+ private readonly List _addressHistory = new();
+ public IReadOnlyList AddressHistory => _addressHistory.AsReadOnly();
+
public List BooksRead { get; set; } = new List();
public List UploadedBooks { get; set; } = new List();
public List MemberVideosProgress { get; set; } = new List();
@@ -123,21 +125,6 @@ public void UpdateName(string? firstName, string? lastName, bool isEvent = true)
}
}
- public void UpdateAddress(string? address, bool isEvent = true)
- {
- var isUpdate = false;
- if (Address != address)
- {
- Address = address;
- isUpdate = true;
- }
-
- if (isEvent && isUpdate)
- {
- CreateOrUpdateAddressUpdateEvent(nameof(Address));
- }
- }
-
public void UpdateBirthday(int? day, int? month, bool isEvent = true)
{
if (day == Birthday?.Day && month == Birthday?.Month) return;
@@ -197,10 +184,15 @@ public void UpdateShippingAddress(string street, string city, string state, stri
isUpdated = ShippingAddress.Update(street, city, state, postalCode, country);
}
- if (isEvent && isUpdated)
+ if (isUpdated)
{
- var addressUpdatedEvent = new MemberAddressUpdatedEvent(this, ShippingAddress);
- Events.Add(addressUpdatedEvent);
+ _addressHistory.Add(new MemberAddressHistory(Id, ShippingAddress));
+
+ if (isEvent)
+ {
+ var addressUpdatedEvent = new MemberAddressUpdatedEvent(this, ShippingAddress);
+ Events.Add(addressUpdatedEvent);
+ }
}
}
diff --git a/src/DevBetterWeb.Core/Entities/MemberAddressHistory.cs b/src/DevBetterWeb.Core/Entities/MemberAddressHistory.cs
new file mode 100644
index 000000000..55a37d1a4
--- /dev/null
+++ b/src/DevBetterWeb.Core/Entities/MemberAddressHistory.cs
@@ -0,0 +1,24 @@
+using System;
+using DevBetterWeb.Core.Interfaces;
+using DevBetterWeb.Core.SharedKernel;
+using DevBetterWeb.Core.ValueObjects;
+
+namespace DevBetterWeb.Core.Entities;
+public class MemberAddressHistory : BaseEntity, IAggregateRoot
+{
+ public int MemberId { get; private set; }
+ public Address? Address { get; private set; }
+ public DateTimeOffset UpdatedOn { get; private set; }
+
+ public MemberAddressHistory(int memberId, Address address)
+ {
+ MemberId = memberId;
+ Address = address;
+ UpdatedOn = DateTime.UtcNow;
+ }
+
+ private MemberAddressHistory()
+ {
+ // EF
+ }
+}
diff --git a/src/DevBetterWeb.Core/Specs/MemberByUserIdSpec.cs b/src/DevBetterWeb.Core/Specs/MemberByUserIdSpec.cs
index 52de19856..e8a1c2b4a 100644
--- a/src/DevBetterWeb.Core/Specs/MemberByUserIdSpec.cs
+++ b/src/DevBetterWeb.Core/Specs/MemberByUserIdSpec.cs
@@ -3,11 +3,13 @@
namespace DevBetterWeb.Core.Specs;
-public class MemberByUserIdSpec : Specification,
+public sealed class MemberByUserIdSpec : Specification,
ISingleResultSpecification
{
public MemberByUserIdSpec(string userId)
{
- Query.Where(member => member.UserId == userId);
+ Query
+ .Include(member => member.AddressHistory)
+ .Where(member => member.UserId == userId);
}
}
diff --git a/src/DevBetterWeb.Core/ValueObjects/Address.cs b/src/DevBetterWeb.Core/ValueObjects/Address.cs
index 1afd510c9..347c71c07 100644
--- a/src/DevBetterWeb.Core/ValueObjects/Address.cs
+++ b/src/DevBetterWeb.Core/ValueObjects/Address.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics.Metrics;
using CSharpFunctionalExtensions;
namespace DevBetterWeb.Core.ValueObjects;
@@ -87,4 +86,9 @@ public bool Update(string street, string city, string state, string postalCode,
return isUpdated;
}
+
+ public override string ToString()
+ {
+ return $"{Street}, {City}, {State} {PostalCode}, {Country}";
+ }
}
diff --git a/src/DevBetterWeb.Infrastructure/Data/Config/MemberAddressHistoryConfig.cs b/src/DevBetterWeb.Infrastructure/Data/Config/MemberAddressHistoryConfig.cs
new file mode 100644
index 000000000..06741f50f
--- /dev/null
+++ b/src/DevBetterWeb.Infrastructure/Data/Config/MemberAddressHistoryConfig.cs
@@ -0,0 +1,23 @@
+using DevBetterWeb.Core.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace DevBetterWeb.Infrastructure.Data.Config;
+
+public class MemberAddressHistoryConfig : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.Property(i => i.MemberId).IsRequired();
+ builder.Property(i => i.UpdatedOn).IsRequired();
+
+ builder.OwnsOne(x => x.Address, sa =>
+ {
+ sa.Property(p => p!.Street).HasMaxLength(500).HasDefaultValue("");
+ sa.Property(p => p!.City).HasMaxLength(DataConfigConstants.NAME_COLUMN_WIDTH).HasDefaultValue("");
+ sa.Property(p => p!.State).HasMaxLength(DataConfigConstants.NAME_COLUMN_WIDTH).HasDefaultValue("");
+ sa.Property(p => p!.PostalCode).HasMaxLength(12).HasDefaultValue("");
+ sa.Property(p => p!.Country).HasMaxLength(DataConfigConstants.NAME_COLUMN_WIDTH).HasDefaultValue("");
+ });
+ }
+}
diff --git a/src/DevBetterWeb.Infrastructure/Data/Config/MemberConfig.cs b/src/DevBetterWeb.Infrastructure/Data/Config/MemberConfig.cs
index 5f0a1469d..d271277e1 100644
--- a/src/DevBetterWeb.Infrastructure/Data/Config/MemberConfig.cs
+++ b/src/DevBetterWeb.Infrastructure/Data/Config/MemberConfig.cs
@@ -10,7 +10,6 @@ public class MemberConfig : IEntityTypeConfiguration
public void Configure(EntityTypeBuilder builder)
{
builder.Property(x => x.UserId).HasMaxLength(500);
- builder.Property(x => x.Address).HasMaxLength(500);
builder.Property(x => x.BlogUrl).HasMaxLength(DataConfigConstants.URL_COLUMN_WIDTH);
builder.Property(x => x.CodinGameUrl).HasMaxLength(DataConfigConstants.URL_COLUMN_WIDTH);
builder.Property(x => x.GitHubUrl).HasMaxLength(DataConfigConstants.URL_COLUMN_WIDTH);
@@ -49,5 +48,10 @@ public void Configure(EntityTypeBuilder builder)
});
builder.HasMany(x => x.FavoriteArchiveVideos);
- }
+
+ builder.HasMany(x => x.AddressHistory)
+ .WithOne()
+ .HasForeignKey(ah => ah.MemberId)
+ .OnDelete(DeleteBehavior.Cascade);
+ }
}
diff --git a/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.Designer.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.Designer.cs
new file mode 100644
index 000000000..686459e27
--- /dev/null
+++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.Designer.cs
@@ -0,0 +1,945 @@
+//
+using System;
+using DevBetterWeb.Infrastructure.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace DevBetterWeb.Infrastructure.Data.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20240730190343_AddressRemoved")]
+ partial class AddressRemoved
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.4")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("BookMember", b =>
+ {
+ b.Property("BooksReadId")
+ .HasColumnType("int");
+
+ b.Property("MembersWhoHaveReadId")
+ .HasColumnType("int");
+
+ b.HasKey("BooksReadId", "MembersWhoHaveReadId");
+
+ b.HasIndex("MembersWhoHaveReadId");
+
+ b.ToTable("BookMember");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AnimatedThumbnailUri")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("DateUploaded")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Duration")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Title")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("VideoId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("VideoUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Views")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("ArchiveVideos");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasMaxLength(500)
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("BillingActivities");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Author")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("BookCategoryId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasDefaultValue(1);
+
+ b.Property("Details")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)");
+
+ b.Property("MemberWhoUploadId")
+ .HasColumnType("int");
+
+ b.Property("PurchaseUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Title")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BookCategoryId");
+
+ b.HasIndex("MemberWhoUploadId");
+
+ b.ToTable("Books");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Title")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("BookCategories");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("StartAt")
+ .HasColumnType("datetime2");
+
+ b.HasKey("Id");
+
+ b.ToTable("CoachingSessions", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.DailyCheck", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Date")
+ .HasColumnType("datetime2");
+
+ b.Property("TasksCompleted")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("DailyChecks");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Invitation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Active")
+ .HasColumnType("bit");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime2");
+
+ b.Property("DateOfLastAdminPing")
+ .HasColumnType("datetime2");
+
+ b.Property("DateOfUserPing")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("InviteCode")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("PaymentHandlerSubscriptionId")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Invitations");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AboutInfo")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("BlogUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("BlueskyUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("CityLatitude")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("CityLongitude")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("CodinGameUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime2");
+
+ b.Property("DiscordUsername")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Email")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FirstName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("GitHubUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("LastName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("LinkedInUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("MastodonUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("OtherUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("PEFriendCode")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("PEUsername")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("TwitchUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("TwitterUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("YouTubeUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Members");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscription", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("MemberSubscriptionPlanId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("MemberSubscriptions");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.HasKey("Id");
+
+ b.ToTable("MemberSubscriptionPlan");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ArchiveVideoId")
+ .HasColumnType("int");
+
+ b.Property("CurrentDuration")
+ .HasColumnType("int");
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("VideoWatchedStatus")
+ .IsRequired()
+ .HasMaxLength(1)
+ .HasColumnType("nvarchar(1)")
+ .HasColumnName("VideoWatchedStatus");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArchiveVideoId");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("MembersVideosProgress", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ArchiveVideoId")
+ .HasColumnType("int");
+
+ b.Property("CoachingSessionId")
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("QuestionText")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("Votes")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CoachingSessionId");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("Questions", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("QuestionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.HasIndex("QuestionId");
+
+ b.ToTable("QuestionVote");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Body")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("ParentCommentId")
+ .HasColumnType("int");
+
+ b.Property("VideoId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.HasIndex("ParentCommentId");
+
+ b.HasIndex("VideoId");
+
+ b.ToTable("VideoComments");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.ValueObjects.MemberFavoriteArchiveVideo", b =>
+ {
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("ArchiveVideoId")
+ .HasColumnType("int");
+
+ b.HasKey("MemberId", "ArchiveVideoId");
+
+ b.HasIndex("ArchiveVideoId");
+
+ b.ToTable("MemberFavoriteArchiveVideos", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Infrastructure.Identity.Data.ApplicationUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("AccessFailedCount")
+ .HasColumnType("int");
+
+ b.Property("ConcurrencyStamp")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("EmailConfirmed")
+ .HasColumnType("bit");
+
+ b.Property("LockoutEnabled")
+ .HasColumnType("bit");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("NormalizedEmail")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("NormalizedUserName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PasswordHash")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PhoneNumber")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PhoneNumberConfirmed")
+ .HasColumnType("bit");
+
+ b.Property("SecurityStamp")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("TwoFactorEnabled")
+ .HasColumnType("bit");
+
+ b.Property("UserName")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("ApplicationUser");
+ });
+
+ modelBuilder.Entity("BookMember", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.Book", null)
+ .WithMany()
+ .HasForeignKey("BooksReadId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.Member", null)
+ .WithMany()
+ .HasForeignKey("MembersWhoHaveReadId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.Member", null)
+ .WithMany("BillingActivities")
+ .HasForeignKey("MemberId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.BillingDetails", "Details", b1 =>
+ {
+ b1.Property("BillingActivityId")
+ .HasColumnType("int");
+
+ b1.Property("ActionVerbPastTense")
+ .HasMaxLength(100)
+ .HasColumnType("int");
+
+ b1.Property("Amount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("decimal(18,4)")
+ .HasDefaultValue(0m);
+
+ b1.Property("BillingPeriod")
+ .HasMaxLength(100)
+ .HasColumnType("int");
+
+ b1.Property("Date")
+ .HasColumnType("datetime2");
+
+ b1.Property("MemberName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b1.Property("SubscriptionPlanName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b1.HasKey("BillingActivityId");
+
+ b1.ToTable("BillingActivities");
+
+ b1.WithOwner()
+ .HasForeignKey("BillingActivityId");
+ });
+
+ b.Navigation("Details")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.BookCategory", "BookCategory")
+ .WithMany("Books")
+ .HasForeignKey("BookCategoryId");
+
+ b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoUpload")
+ .WithMany("UploadedBooks")
+ .HasForeignKey("MemberWhoUploadId");
+
+ b.Navigation("BookCategory");
+
+ b.Navigation("MemberWhoUpload");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b =>
+ {
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.Address", "ShippingAddress", b1 =>
+ {
+ b1.Property("MemberId")
+ .HasColumnType("int");
+
+ b1.Property("City")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasDefaultValue("");
+
+ b1.Property("Country")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasDefaultValue("");
+
+ b1.Property("PostalCode")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(12)
+ .HasColumnType("nvarchar(12)")
+ .HasDefaultValue("");
+
+ b1.Property("State")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)")
+ .HasDefaultValue("");
+
+ b1.Property("Street")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)")
+ .HasDefaultValue("");
+
+ b1.HasKey("MemberId");
+
+ b1.ToTable("Members");
+
+ b1.WithOwner()
+ .HasForeignKey("MemberId");
+ });
+
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.Birthday", "Birthday", b1 =>
+ {
+ b1.Property("MemberId")
+ .HasColumnType("int");
+
+ b1.Property("Day")
+ .HasColumnType("int");
+
+ b1.Property("Month")
+ .HasColumnType("int");
+
+ b1.HasKey("MemberId");
+
+ b1.ToTable("Members");
+
+ b1.WithOwner()
+ .HasForeignKey("MemberId");
+ });
+
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.Geolocation", "CityLocation", b1 =>
+ {
+ b1.Property("MemberId")
+ .HasColumnType("int");
+
+ b1.Property("Latitude")
+ .HasColumnType("decimal(18,4)");
+
+ b1.Property("Longitude")
+ .HasColumnType("decimal(18,4)");
+
+ b1.HasKey("MemberId");
+
+ b1.ToTable("Members");
+
+ b1.WithOwner()
+ .HasForeignKey("MemberId");
+ });
+
+ b.Navigation("Birthday");
+
+ b.Navigation("CityLocation");
+
+ b.Navigation("ShippingAddress");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscription", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.Member", null)
+ .WithMany("MemberSubscriptions")
+ .HasForeignKey("MemberId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.DateTimeRange", "Dates", b1 =>
+ {
+ b1.Property("MemberSubscriptionId")
+ .HasColumnType("int");
+
+ b1.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b1.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b1.HasKey("MemberSubscriptionId");
+
+ b1.ToTable("MemberSubscriptionDates", (string)null);
+
+ b1.WithOwner()
+ .HasForeignKey("MemberSubscriptionId");
+ });
+
+ b.Navigation("Dates")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b =>
+ {
+ b.OwnsOne("DevBetterWeb.Core.ValueObjects.MemberSubscriptionPlanDetails", "Details", b1 =>
+ {
+ b1.Property("MemberSubscriptionPlanId")
+ .HasColumnType("int");
+
+ b1.Property("BillingPeriod")
+ .HasMaxLength(100)
+ .HasColumnType("int");
+
+ b1.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b1.Property("PricePerBillingPeriod")
+ .HasMaxLength(100)
+ .HasColumnType("decimal(18,2)");
+
+ b1.HasKey("MemberSubscriptionPlanId");
+
+ b1.ToTable("MemberSubscriptionPlan");
+
+ b1.WithOwner()
+ .HasForeignKey("MemberSubscriptionPlanId");
+ });
+
+ b.Navigation("Details")
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", "Video")
+ .WithMany("MembersVideoProgress")
+ .HasForeignKey("ArchiveVideoId")
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.Member", "Member")
+ .WithMany("MemberVideosProgress")
+ .HasForeignKey("MemberId")
+ .IsRequired();
+
+ b.Navigation("Member");
+
+ b.Navigation("Video");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.CoachingSession", "CoachingSession")
+ .WithMany("Questions")
+ .HasForeignKey("CoachingSessionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoCreate")
+ .WithMany("Questions")
+ .HasForeignKey("MemberId")
+ .IsRequired();
+
+ b.Navigation("CoachingSession");
+
+ b.Navigation("MemberWhoCreate");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.Member", "Member")
+ .WithMany("QuestionVotes")
+ .HasForeignKey("MemberId")
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.Question", "Question")
+ .WithMany("QuestionVotes")
+ .HasForeignKey("QuestionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Member");
+
+ b.Navigation("Question");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoCreate")
+ .WithMany("VideosComments")
+ .HasForeignKey("MemberId")
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.VideoComment", "ParentComment")
+ .WithMany("Replies")
+ .HasForeignKey("ParentCommentId");
+
+ b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", "Video")
+ .WithMany("Comments")
+ .HasForeignKey("VideoId")
+ .IsRequired();
+
+ b.Navigation("MemberWhoCreate");
+
+ b.Navigation("ParentComment");
+
+ b.Navigation("Video");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.ValueObjects.MemberFavoriteArchiveVideo", b =>
+ {
+ b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", null)
+ .WithMany("MemberFavorites")
+ .HasForeignKey("ArchiveVideoId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("DevBetterWeb.Core.Entities.Member", null)
+ .WithMany("FavoriteArchiveVideos")
+ .HasForeignKey("MemberId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b =>
+ {
+ b.Navigation("Comments");
+
+ b.Navigation("MemberFavorites");
+
+ b.Navigation("MembersVideoProgress");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b =>
+ {
+ b.Navigation("Books");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b =>
+ {
+ b.Navigation("Questions");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b =>
+ {
+ b.Navigation("BillingActivities");
+
+ b.Navigation("FavoriteArchiveVideos");
+
+ b.Navigation("MemberSubscriptions");
+
+ b.Navigation("MemberVideosProgress");
+
+ b.Navigation("QuestionVotes");
+
+ b.Navigation("Questions");
+
+ b.Navigation("UploadedBooks");
+
+ b.Navigation("VideosComments");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b =>
+ {
+ b.Navigation("QuestionVotes");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b =>
+ {
+ b.Navigation("Replies");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.cs
new file mode 100644
index 000000000..7b9b0f9b8
--- /dev/null
+++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730190343_AddressRemoved.cs
@@ -0,0 +1,29 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace DevBetterWeb.Infrastructure.Data.Migrations
+{
+ ///
+ public partial class AddressRemoved : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "Address",
+ table: "Members");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "Address",
+ table: "Members",
+ type: "nvarchar(500)",
+ maxLength: 500,
+ nullable: true);
+ }
+ }
+}
diff --git a/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730194008_AddressHistoryAdded.Designer.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730194008_AddressHistoryAdded.Designer.cs
new file mode 100644
index 000000000..1e3588499
--- /dev/null
+++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/20240730194008_AddressHistoryAdded.Designer.cs
@@ -0,0 +1,1027 @@
+//
+using System;
+using DevBetterWeb.Infrastructure.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace DevBetterWeb.Infrastructure.Data.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20240730194008_AddressHistoryAdded")]
+ partial class AddressHistoryAdded
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.4")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("BookMember", b =>
+ {
+ b.Property("BooksReadId")
+ .HasColumnType("int");
+
+ b.Property("MembersWhoHaveReadId")
+ .HasColumnType("int");
+
+ b.HasKey("BooksReadId", "MembersWhoHaveReadId");
+
+ b.HasIndex("MembersWhoHaveReadId");
+
+ b.ToTable("BookMember");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AnimatedThumbnailUri")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("DateUploaded")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Duration")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Title")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("VideoId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("VideoUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Views")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("ArchiveVideos");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasMaxLength(500)
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("BillingActivities");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Author")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("BookCategoryId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasDefaultValue(1);
+
+ b.Property("Details")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)");
+
+ b.Property("MemberWhoUploadId")
+ .HasColumnType("int");
+
+ b.Property("PurchaseUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Title")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BookCategoryId");
+
+ b.HasIndex("MemberWhoUploadId");
+
+ b.ToTable("Books");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Title")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("BookCategories");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("StartAt")
+ .HasColumnType("datetime2");
+
+ b.HasKey("Id");
+
+ b.ToTable("CoachingSessions", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.DailyCheck", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Date")
+ .HasColumnType("datetime2");
+
+ b.Property("TasksCompleted")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("DailyChecks");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Invitation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Active")
+ .HasColumnType("bit");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime2");
+
+ b.Property("DateOfLastAdminPing")
+ .HasColumnType("datetime2");
+
+ b.Property("DateOfUserPing")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("InviteCode")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("PaymentHandlerSubscriptionId")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Invitations");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AboutInfo")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("BlogUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("BlueskyUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("CityLatitude")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("CityLongitude")
+ .HasColumnType("decimal(18,2)");
+
+ b.Property("CodinGameUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("DateCreated")
+ .HasColumnType("datetime2");
+
+ b.Property("DiscordUsername")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("Email")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FirstName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("GitHubUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("LastName")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("LinkedInUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("MastodonUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("OtherUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("PEFriendCode")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("PEUsername")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("TwitchUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("TwitterUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("YouTubeUrl")
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Members");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberAddressHistory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("UpdatedOn")
+ .HasColumnType("datetimeoffset");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("MemberAddressHistory");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscription", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("MemberSubscriptionPlanId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("MemberSubscriptions");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.HasKey("Id");
+
+ b.ToTable("MemberSubscriptionPlan");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ArchiveVideoId")
+ .HasColumnType("int");
+
+ b.Property("CurrentDuration")
+ .HasColumnType("int");
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("VideoWatchedStatus")
+ .IsRequired()
+ .HasMaxLength(1)
+ .HasColumnType("nvarchar(1)")
+ .HasColumnName("VideoWatchedStatus");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArchiveVideoId");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("MembersVideosProgress", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ArchiveVideoId")
+ .HasColumnType("int");
+
+ b.Property("CoachingSessionId")
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("QuestionText")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("Votes")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CoachingSessionId");
+
+ b.HasIndex("MemberId");
+
+ b.ToTable("Questions", (string)null);
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("MemberId")
+ .HasColumnType("int");
+
+ b.Property("QuestionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MemberId");
+
+ b.HasIndex("QuestionId");
+
+ b.ToTable("QuestionVote");
+ });
+
+ modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b =>
+ {
+ b.Property