From 8cd9926d494c518ecaa2939cbc228609bbde5745 Mon Sep 17 00:00:00 2001 From: ShadyNagy Date: Mon, 5 May 2025 14:17:30 +0300 Subject: [PATCH 1/4] Null EndDate handel in the DateTimeRange. --- src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs b/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs index 650f9128d..e2950fdb8 100644 --- a/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs +++ b/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs @@ -48,14 +48,13 @@ public int ToDaysInRangeThroughPeriodEndDate(DateTime periodEndDate) public bool Contains(DateTime date) { - if (date >= StartDate && date <= EndDate) - { - return true; - } - return false; + if (date < StartDate) return false; + if (EndDate == null) return true; + + return date <= EndDate; } - protected override IEnumerable GetEqualityComponents() + protected override IEnumerable GetEqualityComponents() { yield return StartDate; yield return EndDate ?? DateTime.MaxValue; From 5558b0e861482527b78af4815bd03aaff58ee14d Mon Sep 17 00:00:00 2001 From: ShadyNagy Date: Mon, 5 May 2025 17:17:36 +0300 Subject: [PATCH 2/4] It should update the endDate not create new one. --- src/DevBetterWeb.Core/Entities/Member.cs | 2 +- .../ValueObjects/DateTimeRange.cs | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/DevBetterWeb.Core/Entities/Member.cs b/src/DevBetterWeb.Core/Entities/Member.cs index 81a0e6885..aeb11c77b 100644 --- a/src/DevBetterWeb.Core/Entities/Member.cs +++ b/src/DevBetterWeb.Core/Entities/Member.cs @@ -345,7 +345,7 @@ public void ExtendCurrentSubscription(DateTime newEndDate) MemberSubscription s = MemberSubscriptions[i]; if (s.Dates.Contains(DateTime.Today)) { - s.Dates = new DateTimeRange(s.Dates.StartDate, newEndDate); + s.Dates.UpdateEnd(newEndDate); RegisterDomainEvent(new SubscriptionUpdatedEvent(this, s)); } } diff --git a/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs b/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs index e2950fdb8..cafb1e3ee 100644 --- a/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs +++ b/src/DevBetterWeb.Core/ValueObjects/DateTimeRange.cs @@ -17,13 +17,18 @@ public DateTimeRange(DateTime startDate, DateTime? endDate) EndDate = endDate; } - /// - /// Returns total number of days in the DateTimeRange. - /// If no EndDate has been specified, will use provided endDateToUseIfMissing instead. - /// - /// - /// - public int ToDays(DateTime endDateToUseIfMissing) + public void UpdateEnd(DateTime endDate) + { + EndDate = endDate; + } + + /// + /// Returns total number of days in the DateTimeRange. + /// If no EndDate has been specified, will use provided endDateToUseIfMissing instead. + /// + /// + /// + public int ToDays(DateTime endDateToUseIfMissing) { var end = EndDate ?? endDateToUseIfMissing; From bd08d6c531780026ad49d00d2422d1ced525d819 Mon Sep 17 00:00:00 2001 From: ShadyNagy Date: Mon, 5 May 2025 17:36:59 +0300 Subject: [PATCH 3/4] Use ComplexProperty for dates --- .../Data/Config/MemberSubscriptionConfig.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DevBetterWeb.Infrastructure/Data/Config/MemberSubscriptionConfig.cs b/src/DevBetterWeb.Infrastructure/Data/Config/MemberSubscriptionConfig.cs index 288486b15..43f0035be 100644 --- a/src/DevBetterWeb.Infrastructure/Data/Config/MemberSubscriptionConfig.cs +++ b/src/DevBetterWeb.Infrastructure/Data/Config/MemberSubscriptionConfig.cs @@ -8,7 +8,7 @@ class MemberSubscriptionConfig : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { - builder.OwnsOne(x => x.Dates) - .ToTable("MemberSubscriptionDates"); - } + builder + .ComplexProperty(x => x.Dates); + } } From e770468698b53ab1c51553e415026b34e2773cdd Mon Sep 17 00:00:00 2001 From: ShadyNagy Date: Mon, 5 May 2025 17:45:15 +0300 Subject: [PATCH 4/4] Migrations. --- .../MemberSubscriptionRenewalService.cs | 1 + ...144319_ComplexPropertyForDates.Designer.cs | 939 +++++++++++ .../20250505144319_ComplexPropertyForDates.cs | 62 + .../Migrations/AppDbContextModelSnapshot.cs | 1402 ++++++++--------- 4 files changed, 1698 insertions(+), 706 deletions(-) create mode 100644 src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.Designer.cs create mode 100644 src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.cs diff --git a/src/DevBetterWeb.Core/Services/MemberSubscriptionRenewalService.cs b/src/DevBetterWeb.Core/Services/MemberSubscriptionRenewalService.cs index 125e938f7..8b7a7edcb 100644 --- a/src/DevBetterWeb.Core/Services/MemberSubscriptionRenewalService.cs +++ b/src/DevBetterWeb.Core/Services/MemberSubscriptionRenewalService.cs @@ -30,6 +30,7 @@ public async Task ExtendMemberSubscription(string email, System.DateTime subscri if (member is null) throw new MemberWithEmailNotFoundException(email); member.ExtendCurrentSubscription(subscriptionEndDate); + await _memberRepository.UpdateAsync(member); await _memberRepository.SaveChangesAsync(); _logger.LogInformation($"Extended {member.UserFullName} subscription to {subscriptionEndDate.ToShortDateString}"); diff --git a/src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.Designer.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.Designer.cs new file mode 100644 index 000000000..532d2bcf1 --- /dev/null +++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.Designer.cs @@ -0,0 +1,939 @@ +// +using System; +using System.Collections.Generic; +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("20250505144319_ComplexPropertyForDates")] + partial class ComplexPropertyForDates + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.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("Address") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + 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.ComplexProperty>("Dates", "DevBetterWeb.Core.Entities.MemberSubscription.Dates#DateTimeRange", b1 => + { + b1.IsRequired(); + + b1.Property("EndDate") + .HasColumnType("datetime2"); + + b1.Property("StartDate") + .HasColumnType("datetime2"); + }); + + 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(); + }); + + 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/20250505144319_ComplexPropertyForDates.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.cs new file mode 100644 index 000000000..e8fc0df85 --- /dev/null +++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/20250505144319_ComplexPropertyForDates.cs @@ -0,0 +1,62 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DevBetterWeb.Infrastructure.Data.Migrations +{ + /// + public partial class ComplexPropertyForDates : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "MemberSubscriptionDates"); + + migrationBuilder.AddColumn( + name: "Dates_EndDate", + table: "MemberSubscriptions", + type: "datetime2", + nullable: true); + + migrationBuilder.AddColumn( + name: "Dates_StartDate", + table: "MemberSubscriptions", + type: "datetime2", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Dates_EndDate", + table: "MemberSubscriptions"); + + migrationBuilder.DropColumn( + name: "Dates_StartDate", + table: "MemberSubscriptions"); + + migrationBuilder.CreateTable( + name: "MemberSubscriptionDates", + columns: table => new + { + MemberSubscriptionId = table.Column(type: "int", nullable: false), + EndDate = table.Column(type: "datetime2", nullable: true), + StartDate = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_MemberSubscriptionDates", x => x.MemberSubscriptionId); + table.ForeignKey( + name: "FK_MemberSubscriptionDates_MemberSubscriptions_MemberSubscriptionId", + column: x => x.MemberSubscriptionId, + principalTable: "MemberSubscriptions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + } + } +} diff --git a/src/DevBetterWeb.Infrastructure/Data/Migrations/AppDbContextModelSnapshot.cs b/src/DevBetterWeb.Infrastructure/Data/Migrations/AppDbContextModelSnapshot.cs index 7d212a6f5..c2ce7069b 100644 --- a/src/DevBetterWeb.Infrastructure/Data/Migrations/AppDbContextModelSnapshot.cs +++ b/src/DevBetterWeb.Infrastructure/Data/Migrations/AppDbContextModelSnapshot.cs @@ -1,5 +1,6 @@ // using System; +using System.Collections.Generic; using DevBetterWeb.Infrastructure.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -10,937 +11,926 @@ namespace DevBetterWeb.Infrastructure.Data.Migrations { - [DbContext(typeof(AppDbContext))] - partial class AppDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { #pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.10") - .HasAnnotation("Relational:MaxIdentifierLength", 128); + modelBuilder + .HasAnnotation("ProductVersion", "9.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - modelBuilder.Entity("BookMember", b => - { - b.Property("BooksReadId") - .HasColumnType("int"); + modelBuilder.Entity("BookMember", b => + { + b.Property("BooksReadId") + .HasColumnType("int"); - b.Property("MembersWhoHaveReadId") - .HasColumnType("int"); + b.Property("MembersWhoHaveReadId") + .HasColumnType("int"); - b.HasKey("BooksReadId", "MembersWhoHaveReadId"); + b.HasKey("BooksReadId", "MembersWhoHaveReadId"); - b.HasIndex("MembersWhoHaveReadId"); + b.HasIndex("MembersWhoHaveReadId"); - b.ToTable("BookMember"); - }); + b.ToTable("BookMember"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("AnimatedThumbnailUri") - .HasColumnType("nvarchar(max)"); + b.Property("AnimatedThumbnailUri") + .HasColumnType("nvarchar(max)"); - b.Property("DateCreated") - .HasColumnType("datetimeoffset"); + b.Property("DateCreated") + .HasColumnType("datetimeoffset"); - b.Property("DateUploaded") - .HasColumnType("datetimeoffset"); + b.Property("DateUploaded") + .HasColumnType("datetimeoffset"); - b.Property("Description") - .HasColumnType("nvarchar(max)"); + b.Property("Description") + .HasColumnType("nvarchar(max)"); - b.Property("Duration") - .HasColumnType("int"); + b.Property("Duration") + .HasColumnType("int"); - b.Property("Status") - .HasColumnType("nvarchar(max)"); + b.Property("Status") + .HasColumnType("nvarchar(max)"); - b.Property("Title") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("Title") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("VideoId") - .HasColumnType("nvarchar(max)"); + b.Property("VideoId") + .HasColumnType("nvarchar(max)"); - b.Property("VideoUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("VideoUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("Views") - .HasColumnType("int"); + b.Property("Views") + .HasColumnType("int"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("ArchiveVideos"); - }); + b.ToTable("ArchiveVideos"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("MemberId") - .HasMaxLength(500) - .HasColumnType("int"); + b.Property("MemberId") + .HasMaxLength(500) + .HasColumnType("int"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("MemberId"); + b.HasIndex("MemberId"); - b.ToTable("BillingActivities"); - }); + b.ToTable("BillingActivities"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("Author") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.Property("Author") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("BookCategoryId") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasDefaultValue(1); + b.Property("BookCategoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(1); - b.Property("Details") - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)"); + b.Property("Details") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); - b.Property("MemberWhoUploadId") - .HasColumnType("int"); + b.Property("MemberWhoUploadId") + .HasColumnType("int"); - b.Property("PurchaseUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("PurchaseUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("Title") - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("Title") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("BookCategoryId"); + b.HasIndex("BookCategoryId"); - b.HasIndex("MemberWhoUploadId"); + b.HasIndex("MemberWhoUploadId"); - b.ToTable("Books"); - }); + b.ToTable("Books"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("Title") - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("Title") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("BookCategories"); - }); + b.ToTable("BookCategories"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("StartAt") - .HasColumnType("datetime2"); + b.Property("StartAt") + .HasColumnType("datetime2"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("CoachingSessions", (string)null); - }); + b.ToTable("CoachingSessions", (string)null); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.DailyCheck", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.DailyCheck", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("Date") - .HasColumnType("datetime2"); + b.Property("Date") + .HasColumnType("datetime2"); - b.Property("TasksCompleted") - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("TasksCompleted") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("DailyChecks"); - }); + b.ToTable("DailyChecks"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Invitation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Invitation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("Active") - .HasColumnType("bit"); + b.Property("Active") + .HasColumnType("bit"); - b.Property("DateCreated") - .HasColumnType("datetime2"); + b.Property("DateCreated") + .HasColumnType("datetime2"); - b.Property("DateOfLastAdminPing") - .HasColumnType("datetime2"); + b.Property("DateOfLastAdminPing") + .HasColumnType("datetime2"); - b.Property("DateOfUserPing") - .HasColumnType("datetime2"); + b.Property("DateOfUserPing") + .HasColumnType("datetime2"); - b.Property("Email") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("Email") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("InviteCode") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("InviteCode") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.Property("PaymentHandlerSubscriptionId") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("PaymentHandlerSubscriptionId") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("Invitations"); - }); + b.ToTable("Invitations"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("AboutInfo") - .HasColumnType("nvarchar(max)"); + b.Property("AboutInfo") + .HasColumnType("nvarchar(max)"); - b.Property("Address") - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("Address") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.Property("BlogUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("BlogUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("BlueskyUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("BlueskyUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("CityLatitude") - .HasColumnType("decimal(18,2)"); + b.Property("CityLatitude") + .HasColumnType("decimal(18,2)"); - b.Property("CityLongitude") - .HasColumnType("decimal(18,2)"); + b.Property("CityLongitude") + .HasColumnType("decimal(18,2)"); - b.Property("CodinGameUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("CodinGameUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("DateCreated") - .HasColumnType("datetime2"); + b.Property("DateCreated") + .HasColumnType("datetime2"); - b.Property("DiscordUsername") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("DiscordUsername") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("Email") - .HasColumnType("nvarchar(max)"); + b.Property("Email") + .HasColumnType("nvarchar(max)"); - b.Property("FirstName") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.Property("FirstName") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("GitHubUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("GitHubUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("LastName") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.Property("LastName") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("LinkedInUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("LinkedInUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("MastodonUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("MastodonUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("OtherUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("OtherUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("PEFriendCode") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.Property("PEFriendCode") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("PEUsername") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.Property("PEUsername") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Property("TwitchUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("TwitchUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("TwitterUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("TwitterUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("UserId") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("UserId") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.Property("YouTubeUrl") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); + b.Property("YouTubeUrl") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("Members"); - }); + b.ToTable("Members"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscription", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("MemberId") - .HasColumnType("int"); + b.Property("MemberId") + .HasColumnType("int"); - b.Property("MemberSubscriptionPlanId") - .HasColumnType("int"); + b.Property("MemberSubscriptionPlanId") + .HasColumnType("int"); - b.HasKey("Id"); + b.ComplexProperty>("Dates", "DevBetterWeb.Core.Entities.MemberSubscription.Dates#DateTimeRange", b1 => + { + b1.IsRequired(); - b.HasIndex("MemberId"); + b1.Property("EndDate") + .HasColumnType("datetime2"); - b.ToTable("MemberSubscriptions"); - }); + b1.Property("StartDate") + .HasColumnType("datetime2"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + b.HasKey("Id"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.HasIndex("MemberId"); - b.HasKey("Id"); + b.ToTable("MemberSubscriptions"); + }); - b.ToTable("MemberSubscriptionPlan"); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.HasKey("Id"); - b.Property("ArchiveVideoId") - .HasColumnType("int"); + b.ToTable("MemberSubscriptionPlan"); + }); - b.Property("CurrentDuration") - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - b.Property("MemberId") - .HasColumnType("int"); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("VideoWatchedStatus") - .IsRequired() - .HasMaxLength(1) - .HasColumnType("nvarchar(1)") - .HasColumnName("VideoWatchedStatus"); + b.Property("ArchiveVideoId") + .HasColumnType("int"); - b.HasKey("Id"); + b.Property("CurrentDuration") + .HasColumnType("int"); - b.HasIndex("ArchiveVideoId"); + b.Property("MemberId") + .HasColumnType("int"); - b.HasIndex("MemberId"); + b.Property("VideoWatchedStatus") + .IsRequired() + .HasMaxLength(1) + .HasColumnType("nvarchar(1)") + .HasColumnName("VideoWatchedStatus"); - b.ToTable("MembersVideosProgress", (string)null); - }); + b.HasKey("Id"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + b.HasIndex("ArchiveVideoId"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.HasIndex("MemberId"); - b.Property("ArchiveVideoId") - .HasColumnType("int"); + b.ToTable("MembersVideosProgress", (string)null); + }); - b.Property("CoachingSessionId") - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - b.Property("CreatedAt") - .HasColumnType("datetime2"); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("MemberId") - .HasColumnType("int"); + b.Property("ArchiveVideoId") + .HasColumnType("int"); - b.Property("QuestionText") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("nvarchar(500)"); + b.Property("CoachingSessionId") + .HasColumnType("int"); - b.Property("Votes") - .HasColumnType("int"); + b.Property("CreatedAt") + .HasColumnType("datetime2"); - b.HasKey("Id"); + b.Property("MemberId") + .HasColumnType("int"); - b.HasIndex("CoachingSessionId"); + b.Property("QuestionText") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); - b.HasIndex("MemberId"); + b.Property("Votes") + .HasColumnType("int"); - b.ToTable("Questions", (string)null); - }); + b.HasKey("Id"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + b.HasIndex("CoachingSessionId"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.HasIndex("MemberId"); - b.Property("MemberId") - .HasColumnType("int"); + b.ToTable("Questions", (string)null); + }); - b.Property("QuestionId") - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - b.HasKey("Id"); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.HasIndex("MemberId"); + b.Property("MemberId") + .HasColumnType("int"); - b.HasIndex("QuestionId"); + b.Property("QuestionId") + .HasColumnType("int"); - b.ToTable("QuestionVote"); - }); + b.HasKey("Id"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); + b.HasIndex("MemberId"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.HasIndex("QuestionId"); - b.Property("Body") - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)"); + b.ToTable("QuestionVote"); + }); - b.Property("CreatedAt") - .HasColumnType("datetimeoffset"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); - b.Property("MemberId") - .HasColumnType("int"); + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("ParentCommentId") - .HasColumnType("int"); + b.Property("Body") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); - b.Property("VideoId") - .HasColumnType("int"); + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); - b.HasKey("Id"); + b.Property("MemberId") + .HasColumnType("int"); - b.HasIndex("MemberId"); + b.Property("ParentCommentId") + .HasColumnType("int"); - b.HasIndex("ParentCommentId"); + b.Property("VideoId") + .HasColumnType("int"); - b.HasIndex("VideoId"); + b.HasKey("Id"); - b.ToTable("VideoComments"); - }); + b.HasIndex("MemberId"); - modelBuilder.Entity("DevBetterWeb.Core.ValueObjects.MemberFavoriteArchiveVideo", b => - { - b.Property("MemberId") - .HasColumnType("int"); + b.HasIndex("ParentCommentId"); - b.Property("ArchiveVideoId") - .HasColumnType("int"); + b.HasIndex("VideoId"); - b.HasKey("MemberId", "ArchiveVideoId"); + b.ToTable("VideoComments"); + }); - b.HasIndex("ArchiveVideoId"); + modelBuilder.Entity("DevBetterWeb.Core.ValueObjects.MemberFavoriteArchiveVideo", b => + { + b.Property("MemberId") + .HasColumnType("int"); - b.ToTable("MemberFavoriteArchiveVideos", (string)null); - }); + b.Property("ArchiveVideoId") + .HasColumnType("int"); - modelBuilder.Entity("DevBetterWeb.Infrastructure.Identity.Data.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); + b.HasKey("MemberId", "ArchiveVideoId"); - b.Property("AccessFailedCount") - .HasColumnType("int"); + b.HasIndex("ArchiveVideoId"); - b.Property("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + b.ToTable("MemberFavoriteArchiveVideos", (string)null); + }); - b.Property("DateCreated") - .HasColumnType("datetime2"); + modelBuilder.Entity("DevBetterWeb.Infrastructure.Identity.Data.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); - b.Property("Email") - .HasColumnType("nvarchar(max)"); + b.Property("AccessFailedCount") + .HasColumnType("int"); - b.Property("EmailConfirmed") - .HasColumnType("bit"); + b.Property("ConcurrencyStamp") + .HasColumnType("nvarchar(max)"); - b.Property("LockoutEnabled") - .HasColumnType("bit"); + b.Property("DateCreated") + .HasColumnType("datetime2"); - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); + b.Property("Email") + .HasColumnType("nvarchar(max)"); - b.Property("NormalizedEmail") - .HasColumnType("nvarchar(max)"); + b.Property("EmailConfirmed") + .HasColumnType("bit"); - b.Property("NormalizedUserName") - .HasColumnType("nvarchar(max)"); + b.Property("LockoutEnabled") + .HasColumnType("bit"); - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); + b.Property("NormalizedEmail") + .HasColumnType("nvarchar(max)"); - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); + b.Property("NormalizedUserName") + .HasColumnType("nvarchar(max)"); - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); - b.Property("UserName") - .HasColumnType("nvarchar(max)"); + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); - b.HasKey("Id"); + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); - b.ToTable("ApplicationUser"); - }); + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); - modelBuilder.Entity("BookMember", b => - { - b.HasOne("DevBetterWeb.Core.Entities.Book", null) - .WithMany() - .HasForeignKey("BooksReadId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.Property("UserName") + .HasColumnType("nvarchar(max)"); - b.HasOne("DevBetterWeb.Core.Entities.Member", null) - .WithMany() - .HasForeignKey("MembersWhoHaveReadId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); + b.HasKey("Id"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b => - { - b.HasOne("DevBetterWeb.Core.Entities.Member", null) - .WithMany("BillingActivities") - .HasForeignKey("MemberId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.ToTable("ApplicationUser"); + }); - b.OwnsOne("DevBetterWeb.Core.ValueObjects.BillingDetails", "Details", b1 => - { - b1.Property("BillingActivityId") - .HasColumnType("int"); + modelBuilder.Entity("BookMember", b => + { + b.HasOne("DevBetterWeb.Core.Entities.Book", null) + .WithMany() + .HasForeignKey("BooksReadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b1.Property("ActionVerbPastTense") - .HasMaxLength(100) - .HasColumnType("int"); + b.HasOne("DevBetterWeb.Core.Entities.Member", null) + .WithMany() + .HasForeignKey("MembersWhoHaveReadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); - b1.Property("Amount") - .ValueGeneratedOnAdd() - .HasColumnType("decimal(18,4)") - .HasDefaultValue(0m); + modelBuilder.Entity("DevBetterWeb.Core.Entities.BillingActivity", b => + { + b.HasOne("DevBetterWeb.Core.Entities.Member", null) + .WithMany("BillingActivities") + .HasForeignKey("MemberId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b1.Property("BillingPeriod") - .HasMaxLength(100) - .HasColumnType("int"); - - b1.Property("Date") - .HasColumnType("datetime2"); + b.OwnsOne("DevBetterWeb.Core.ValueObjects.BillingDetails", "Details", b1 => + { + b1.Property("BillingActivityId") + .HasColumnType("int"); - b1.Property("MemberName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b1.Property("ActionVerbPastTense") + .HasMaxLength(100) + .HasColumnType("int"); - b1.Property("SubscriptionPlanName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b1.HasKey("BillingActivityId"); + b1.Property("Amount") + .ValueGeneratedOnAdd() + .HasColumnType("decimal(18,4)") + .HasDefaultValue(0m); - b1.ToTable("BillingActivities"); + b1.Property("BillingPeriod") + .HasMaxLength(100) + .HasColumnType("int"); + + b1.Property("Date") + .HasColumnType("datetime2"); - b1.WithOwner() - .HasForeignKey("BillingActivityId"); - }); + b1.Property("MemberName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); - b.Navigation("Details") - .IsRequired(); - }); + b1.Property("SubscriptionPlanName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b1.HasKey("BillingActivityId"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b => - { - b.HasOne("DevBetterWeb.Core.Entities.BookCategory", "BookCategory") - .WithMany("Books") - .HasForeignKey("BookCategoryId"); + b1.ToTable("BillingActivities"); - b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoUpload") - .WithMany("UploadedBooks") - .HasForeignKey("MemberWhoUploadId"); + b1.WithOwner() + .HasForeignKey("BillingActivityId"); + }); - b.Navigation("BookCategory"); + b.Navigation("Details") + .IsRequired(); + }); - 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(""); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Book", b => + { + b.HasOne("DevBetterWeb.Core.Entities.BookCategory", "BookCategory") + .WithMany("Books") + .HasForeignKey("BookCategoryId"); - b1.HasKey("MemberId"); + b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoUpload") + .WithMany("UploadedBooks") + .HasForeignKey("MemberWhoUploadId"); - b1.ToTable("Members"); + b.Navigation("BookCategory"); - b1.WithOwner() - .HasForeignKey("MemberId"); - }); + 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"); + b.OwnsOne("DevBetterWeb.Core.ValueObjects.Birthday", "Birthday", b1 => + { + b1.Property("MemberId") + .HasColumnType("int"); - b1.Property("Day") - .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(); + }); + + 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("Month") - .HasColumnType("int"); + b1.Property("PricePerBillingPeriod") + .HasMaxLength(100) + .HasColumnType("decimal(18,2)"); + + b1.HasKey("MemberSubscriptionPlanId"); + + b1.ToTable("MemberSubscriptionPlan"); - b1.HasKey("MemberId"); + b1.WithOwner() + .HasForeignKey("MemberSubscriptionPlanId"); + }); - b1.ToTable("Members"); + b.Navigation("Details") + .IsRequired(); + }); - b1.WithOwner() - .HasForeignKey("MemberId"); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b => + { + b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", "Video") + .WithMany("MembersVideoProgress") + .HasForeignKey("ArchiveVideoId") + .IsRequired(); - b.OwnsOne("DevBetterWeb.Core.ValueObjects.Geolocation", "CityLocation", b1 => - { - b1.Property("MemberId") - .HasColumnType("int"); + b.HasOne("DevBetterWeb.Core.Entities.Member", "Member") + .WithMany("MemberVideosProgress") + .HasForeignKey("MemberId") + .IsRequired(); - b1.Property("Latitude") - .HasColumnType("decimal(18,4)"); + b.Navigation("Member"); - b1.Property("Longitude") - .HasColumnType("decimal(18,4)"); + b.Navigation("Video"); + }); - b1.HasKey("MemberId"); - - b1.ToTable("Members"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b => + { + b.HasOne("DevBetterWeb.Core.Entities.CoachingSession", "CoachingSession") + .WithMany("Questions") + .HasForeignKey("CoachingSessionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b1.WithOwner() - .HasForeignKey("MemberId"); - }); + b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoCreate") + .WithMany("Questions") + .HasForeignKey("MemberId") + .IsRequired(); - b.Navigation("Birthday"); + b.Navigation("CoachingSession"); - b.Navigation("CityLocation"); + b.Navigation("MemberWhoCreate"); + }); - b.Navigation("ShippingAddress"); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b => + { + b.HasOne("DevBetterWeb.Core.Entities.Member", "Member") + .WithMany("QuestionVotes") + .HasForeignKey("MemberId") + .IsRequired(); - 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"); + b.HasOne("DevBetterWeb.Core.Entities.Question", "Question") + .WithMany("QuestionVotes") + .HasForeignKey("QuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b1.Property("EndDate") - .HasColumnType("datetime2"); + b.Navigation("Member"); - b1.Property("StartDate") - .HasColumnType("datetime2"); + b.Navigation("Question"); + }); - b1.HasKey("MemberSubscriptionId"); + 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"); - b1.ToTable("MemberSubscriptionDates", (string)null); + b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", "Video") + .WithMany("Comments") + .HasForeignKey("VideoId") + .IsRequired(); - b1.WithOwner() - .HasForeignKey("MemberSubscriptionId"); - }); + b.Navigation("MemberWhoCreate"); - b.Navigation("Dates") - .IsRequired(); - }); + b.Navigation("ParentComment"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberSubscriptionPlan", b => - { - b.OwnsOne("DevBetterWeb.Core.ValueObjects.MemberSubscriptionPlanDetails", "Details", b1 => - { - b1.Property("MemberSubscriptionPlanId") - .HasColumnType("int"); + b.Navigation("Video"); + }); - b1.Property("BillingPeriod") - .HasMaxLength(100) - .HasColumnType("int"); + modelBuilder.Entity("DevBetterWeb.Core.ValueObjects.MemberFavoriteArchiveVideo", b => + { + b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", null) + .WithMany("MemberFavorites") + .HasForeignKey("ArchiveVideoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b1.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); + b.HasOne("DevBetterWeb.Core.Entities.Member", null) + .WithMany("FavoriteArchiveVideos") + .HasForeignKey("MemberId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); - b1.Property("PricePerBillingPeriod") - .HasMaxLength(100) - .HasColumnType("decimal(18,2)"); + modelBuilder.Entity("DevBetterWeb.Core.Entities.ArchiveVideo", b => + { + b.Navigation("Comments"); - b1.HasKey("MemberSubscriptionPlanId"); + b.Navigation("MemberFavorites"); - b1.ToTable("MemberSubscriptionPlan"); + b.Navigation("MembersVideoProgress"); + }); - b1.WithOwner() - .HasForeignKey("MemberSubscriptionPlanId"); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.BookCategory", b => + { + b.Navigation("Books"); + }); - b.Navigation("Details") - .IsRequired(); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.CoachingSession", b => + { + b.Navigation("Questions"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.MemberVideoProgress", b => - { - b.HasOne("DevBetterWeb.Core.Entities.ArchiveVideo", "Video") - .WithMany("MembersVideoProgress") - .HasForeignKey("ArchiveVideoId") - .IsRequired(); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Member", b => + { + b.Navigation("BillingActivities"); - b.HasOne("DevBetterWeb.Core.Entities.Member", "Member") - .WithMany("MemberVideosProgress") - .HasForeignKey("MemberId") - .IsRequired(); + b.Navigation("FavoriteArchiveVideos"); - b.Navigation("Member"); + b.Navigation("MemberSubscriptions"); - b.Navigation("Video"); - }); + b.Navigation("MemberVideosProgress"); - modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b => - { - b.HasOne("DevBetterWeb.Core.Entities.CoachingSession", "CoachingSession") - .WithMany("Questions") - .HasForeignKey("CoachingSessionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.Navigation("QuestionVotes"); - b.HasOne("DevBetterWeb.Core.Entities.Member", "MemberWhoCreate") - .WithMany("Questions") - .HasForeignKey("MemberId") - .IsRequired(); + b.Navigation("Questions"); - b.Navigation("CoachingSession"); + b.Navigation("UploadedBooks"); - b.Navigation("MemberWhoCreate"); - }); + b.Navigation("VideosComments"); + }); - modelBuilder.Entity("DevBetterWeb.Core.Entities.QuestionVote", b => - { - b.HasOne("DevBetterWeb.Core.Entities.Member", "Member") - .WithMany("QuestionVotes") - .HasForeignKey("MemberId") - .IsRequired(); + modelBuilder.Entity("DevBetterWeb.Core.Entities.Question", b => + { + b.Navigation("QuestionVotes"); + }); - 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"); - }); + modelBuilder.Entity("DevBetterWeb.Core.Entities.VideoComment", b => + { + b.Navigation("Replies"); + }); #pragma warning restore 612, 618 - } - } + } + } }