From 1bdd21971af5acda6293265dc115781a1e569dbc Mon Sep 17 00:00:00 2001 From: "e.karlshtein" Date: Thu, 16 Apr 2026 20:41:29 +0300 Subject: [PATCH] =?UTF-8?q?homework-5=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20Entity=20Framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PromoCodeManagement/CustomerPromoCode.cs" | 2 + .../Configures/CustomerConfiguration.cs" | 33 ++ .../Configures/EmployeeConfigurator.cs" | 29 + .../Configures/PreferenceConfigurator.cs" | 16 + .../Configures/PromoCodeConfigurator.cs" | 33 ++ .../Configures/RoleResponseConfigurator.cs" | 20 + .../Entities/Customer.cs" | 17 + .../Entities/CustomerPromoCode.cs" | 13 + .../Entities/Employee.cs" | 16 + .../Entities/Preference.cs" | 8 + .../Entities/PromoCode.cs" | 20 + .../Entities/Role.cs" | 10 + ...0955_Migr_15_04_2026_22_02_00.Designer.cs" | 505 ++++++++++++++++++ ...0260415190955_Migr_15_04_2026_22_02_00.cs" | 212 ++++++++ ...PromoCodeFactoryDbContextModelSnapshot.cs" | 502 +++++++++++++++++ .../PromoCodeFactoryDbContext.cs" | 27 +- .../Repositories/CustomerEfRepository.cs" | 7 +- .../Repositories/EfRepository.cs" | 39 +- .../Controllers/CustomersController.cs" | 68 ++- .../Controllers/PreferencesController.cs" | 11 +- .../Controllers/PromoCodesController.cs" | 82 ++- .../Mapping/CustomersMapper.cs" | 40 ++ .../Mapping/PromoCodesMapper.cs" | 31 ++ .../src/PromoCodeFactory.WebHost/Program.cs" | 4 +- 24 files changed, 1710 insertions(+), 35 deletions(-) create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/CustomerConfiguration.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/EmployeeConfigurator.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PreferenceConfigurator.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PromoCodeConfigurator.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/RoleResponseConfigurator.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Customer.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/CustomerPromoCode.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Employee.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Preference.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/PromoCode.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Role.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.Designer.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/PromoCodeFactoryDbContextModelSnapshot.cs" create mode 100644 "Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/CustomersMapper.cs" diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPromoCode.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPromoCode.cs" index 17f2f2e2f..cb6600f83 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPromoCode.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPromoCode.cs" @@ -6,4 +6,6 @@ public class CustomerPromoCode : BaseEntity public Guid PromoCodeId { get; set; } public DateTimeOffset CreatedAt { get; set; } public DateTimeOffset? AppliedAt { get; set; } + + public PromoCode PromoCode { get; set; } = null!; } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/CustomerConfiguration.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/CustomerConfiguration.cs" new file mode 100644 index 000000000..4461c2dd7 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/CustomerConfiguration.cs" @@ -0,0 +1,33 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PromoCodeFactory.DataAccess.Entities; + +namespace PromoCodeFactory.DataAccess.Configures; + +internal class CustomerConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Customers"); + + builder.Property(x => x.FirstName) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.LastName) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.Email) + .IsRequired() + .HasMaxLength(256); + + builder.HasMany(e => e.Preferences) + .WithMany() + .UsingEntity("CustomerPreferences"); + + builder.HasMany(e => e.CustomerPromoCodes) + .WithOne() + .HasForeignKey(x => x.CustomerId); + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/EmployeeConfigurator.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/EmployeeConfigurator.cs" new file mode 100644 index 000000000..24814fde4 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/EmployeeConfigurator.cs" @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PromoCodeFactory.DataAccess.Entities; + +namespace PromoCodeFactory.DataAccess.Configures; + +internal class EmployeeConfigurator : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Employees"); + + builder.Property(x => x.FirstName) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.LastName) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.Email) + .IsRequired() + .HasMaxLength(256); + + builder.HasOne(e => e.Role) + .WithMany() + .HasForeignKey(e => e.RoleId); + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PreferenceConfigurator.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PreferenceConfigurator.cs" new file mode 100644 index 000000000..9e3c2ae4e --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PreferenceConfigurator.cs" @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; + +namespace PromoCodeFactory.DataAccess.Configures; + +internal class PreferenceConfigurator : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Preferences"); + + builder.Property(x => x.Name) + .IsRequired(); + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PromoCodeConfigurator.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PromoCodeConfigurator.cs" new file mode 100644 index 000000000..e63975d3e --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/PromoCodeConfigurator.cs" @@ -0,0 +1,33 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PromoCodeFactory.DataAccess.Entities; + +namespace PromoCodeFactory.DataAccess.Configures; + +internal class PromoCodeConfigurator : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("PromoCodes"); + + builder.Property(x => x.Code) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.ServiceInfo) + .IsRequired() + .HasMaxLength(256); + + builder.Property(x => x.PartnerName) + .IsRequired() + .HasMaxLength(100); + + builder.HasOne(x => x.PartnerManager) + .WithMany() + .HasForeignKey(x => x.PartnerManagerId); + + builder.HasOne(x => x.Preference) + .WithMany() + .HasForeignKey(x => x.PreferenceId); + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/RoleResponseConfigurator.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/RoleResponseConfigurator.cs" new file mode 100644 index 000000000..adebd560b --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Configures/RoleResponseConfigurator.cs" @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using PromoCodeFactory.DataAccess.Entities; + +namespace PromoCodeFactory.DataAccess.Configures; + +internal class RoleResponseConfigurator : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Roles"); + + builder.Property(x => x.Name) + .IsRequired() + .HasMaxLength(50); + + builder.Property(x => x.Description) + .HasMaxLength(256); + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Customer.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Customer.cs" new file mode 100644 index 000000000..bbad18d9b --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Customer.cs" @@ -0,0 +1,17 @@ +using PromoCodeFactory.Core.Domain; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class Customer: BaseEntity +{ + public required string FirstName { get; set; } + + public required string LastName { get; set; } + + public required string Email { get; set; } + + public ICollection Preferences { get; set; } = []; + + public ICollection CustomerPromoCodes { get; set; } = []; +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/CustomerPromoCode.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/CustomerPromoCode.cs" new file mode 100644 index 000000000..b2a973012 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/CustomerPromoCode.cs" @@ -0,0 +1,13 @@ +using PromoCodeFactory.Core.Domain; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class CustomerPromoCode: BaseEntity +{ + public Guid CustomerId { get; set; } + public Guid PromoCodeId { get; set; } + public DateTimeOffset CreatedAt { get; set; } + public DateTimeOffset? AppliedAt { get; set; } + + public PromoCode PromoCode { get; set; } = null!; +} \ No newline at end of file diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Employee.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Employee.cs" new file mode 100644 index 000000000..b0716bb7d --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Employee.cs" @@ -0,0 +1,16 @@ +using PromoCodeFactory.Core.Domain; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class Employee: BaseEntity +{ + public required string FirstName { get; set; } + + public required string LastName { get; set; } + + public required string Email { get; set; } + + public Guid RoleId { get; set; } + + public Role? Role { get; set; } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Preference.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Preference.cs" new file mode 100644 index 000000000..5c1f2f63c --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Preference.cs" @@ -0,0 +1,8 @@ +using PromoCodeFactory.Core.Domain; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class Preference: BaseEntity +{ + public required string Name { get; set; } +} \ No newline at end of file diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/PromoCode.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/PromoCode.cs" new file mode 100644 index 000000000..43990f164 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/PromoCode.cs" @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations.Schema; +using PromoCodeFactory.Core.Domain; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class PromoCode: BaseEntity +{ + public required string Code { get; set; } + public required string ServiceInfo { get; set; } + public required string PartnerName { get; set; } + public DateTimeOffset BeginDate { get; set; } + public DateTimeOffset EndDate { get; set; } + + public Guid PartnerManagerId { get; set; } + public Guid PreferenceId { get; set; } + + public Employee? PartnerManager { get; set; } + public Preference? Preference { get; set; } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Role.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Role.cs" new file mode 100644 index 000000000..cefaf58cd --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Entities/Role.cs" @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations.Schema; +using PromoCodeFactory.Core.Domain; + +namespace PromoCodeFactory.DataAccess.Entities; + +public class Role : BaseEntity +{ + public required string Name { get; set; } + public string? Description { get; set; } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.Designer.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.Designer.cs" new file mode 100644 index 000000000..723022c29 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.Designer.cs" @@ -0,0 +1,505 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PromoCodeFactory.DataAccess; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + [DbContext(typeof(PromoCodeFactoryDbContext))] + [Migration("20260415190955_Migr_15_04_2026_22_02_00")] + partial class Migr_15_04_2026_22_02_00 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "10.0.3"); + + modelBuilder.Entity("CustomerPreference", b => + { + b.Property("CustomersId") + .HasColumnType("TEXT"); + + b.Property("PreferencesId") + .HasColumnType("TEXT"); + + b.HasKey("CustomersId", "PreferencesId"); + + b.HasIndex("PreferencesId"); + + b.ToTable("CustomerPreference"); + }); + + modelBuilder.Entity("CustomerPreferences", b => + { + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PreferencesId") + .HasColumnType("TEXT"); + + b.HasKey("CustomerId", "PreferencesId"); + + b.HasIndex("PreferencesId"); + + b.ToTable("CustomerPreferences"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("Employee"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Customer"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PromoCodeId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromoCodeId"); + + b.ToTable("CustomerPromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Preferences", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Customers", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.CustomerPromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PromoCodeId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromoCodeId"); + + b.ToTable("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("Employees", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCodes", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Roles", (string)null); + }); + + modelBuilder.Entity("CustomerPreference", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", null) + .WithMany() + .HasForeignKey("CustomersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", null) + .WithMany() + .HasForeignKey("PreferencesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("CustomerPreferences", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Customer", null) + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.Preference", null) + .WithMany() + .HasForeignKey("PreferencesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", null) + .WithMany("CustomerPromoCodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", "PromoCode") + .WithMany("CustomerPromoCodes") + .HasForeignKey("PromoCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany() + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.CustomerPromoCode", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Customer", null) + .WithMany("CustomerPromoCodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.PromoCode", "PromoCode") + .WithMany() + .HasForeignKey("PromoCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Employee", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.PromoCode", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.Preference", "Preference") + .WithMany() + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Navigation("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Navigation("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Customer", b => + { + b.Navigation("CustomerPromoCodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.cs" new file mode 100644 index 000000000..9f0f2fbd8 --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/20260415190955_Migr_15_04_2026_22_02_00.cs" @@ -0,0 +1,212 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + /// + public partial class Migr_15_04_2026_22_02_00 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Customers", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + FirstName = table.Column(type: "TEXT", nullable: false), + LastName = table.Column(type: "TEXT", nullable: false), + Email = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Customer", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Preferences", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Name = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Preferences", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Roles", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Name = table.Column(type: "TEXT", maxLength: 50, nullable: false), + Description = table.Column(type: "TEXT", maxLength: 256, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_RoleResponses", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CustomerPreferences", + columns: table => new + { + CustomerId = table.Column(type: "TEXT", nullable: false), + PreferencesId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CustomerPreferences", x => new { x.CustomerId, x.PreferencesId }); + table.ForeignKey( + name: "FK_CustomerPreferences_Customers_CustomerId", + column: x => x.CustomerId, + principalTable: "Customers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CustomerPreferences_Preference_PreferencesId", + column: x => x.PreferencesId, + principalTable: "Preference", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Employees", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + FirstName = table.Column(type: "TEXT", maxLength: 50, nullable: false), + LastName = table.Column(type: "TEXT", maxLength: 50, nullable: false), + Email = table.Column(type: "TEXT", maxLength: 256, nullable: false), + RoleId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Employees", x => x.Id); + table.ForeignKey( + name: "FK_Employees_Roles_RoleId", + column: x => x.RoleId, + principalTable: "Roles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "PromoCodes", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Code = table.Column(type: "TEXT", maxLength: 50, nullable: false), + ServiceInfo = table.Column(type: "TEXT", maxLength: 256, nullable: false), + PartnerName = table.Column(type: "TEXT", maxLength: 100, nullable: false), + BeginDate = table.Column(type: "TEXT", nullable: false), + EndDate = table.Column(type: "TEXT", nullable: false), + PartnerManagerId = table.Column(type: "TEXT", nullable: false), + PreferenceId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PromoCodes", x => x.Id); + table.ForeignKey( + name: "FK_PromoCodes_Employees_PartnerManagerId", + column: x => x.PartnerManagerId, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PromoCodes_Preference_PreferenceId", + column: x => x.PreferenceId, + principalTable: "Preference", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CustomerPromoCodes", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + CustomerId = table.Column(type: "TEXT", nullable: false), + PromoCodeId = table.Column(type: "TEXT", nullable: false), + CreatedAt = table.Column(type: "TEXT", nullable: false), + AppliedAt = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CustomerPromoCodes", x => x.Id); + table.ForeignKey( + name: "FK_CustomerPromoCodes_Customers_CustomerId", + column: x => x.CustomerId, + principalTable: "Customers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CustomerPromoCodes_PromoCodes_PromoCodeId", + column: x => x.PromoCodeId, + principalTable: "PromoCodes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CustomerPreferences_PreferencesId", + table: "CustomerPreferences", + column: "PreferencesId"); + + migrationBuilder.CreateIndex( + name: "IX_CustomerPromoCodes_CustomerId", + table: "CustomerPromoCodes", + column: "CustomerId"); + + migrationBuilder.CreateIndex( + name: "IX_CustomerPromoCodes_PromoCodeId", + table: "CustomerPromoCodes", + column: "PromoCodeId"); + + migrationBuilder.CreateIndex( + name: "IX_Employees_RoleId", + table: "Employees", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_PromoCodes_PartnerManagerId", + table: "PromoCodes", + column: "PartnerManagerId"); + + migrationBuilder.CreateIndex( + name: "IX_PromoCodes_PreferenceId", + table: "PromoCodes", + column: "PreferenceId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + migrationBuilder.DropTable( + name: "CustomerPreferences"); + + migrationBuilder.DropTable( + name: "CustomerPromoCodes"); + + migrationBuilder.DropTable( + name: "Customers"); + + migrationBuilder.DropTable( + name: "PromoCodes"); + + migrationBuilder.DropTable( + name: "Preferences"); + + migrationBuilder.DropTable( + name: "Employees"); + + migrationBuilder.DropTable( + name: "Roles"); + } + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/PromoCodeFactoryDbContextModelSnapshot.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/PromoCodeFactoryDbContextModelSnapshot.cs" new file mode 100644 index 000000000..1c9f600af --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Migrations/PromoCodeFactoryDbContextModelSnapshot.cs" @@ -0,0 +1,502 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PromoCodeFactory.DataAccess; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + [DbContext(typeof(PromoCodeFactoryDbContext))] + partial class PromoCodeFactoryDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "10.0.3"); + + modelBuilder.Entity("CustomerPreference", b => + { + b.Property("CustomersId") + .HasColumnType("TEXT"); + + b.Property("PreferencesId") + .HasColumnType("TEXT"); + + b.HasKey("CustomersId", "PreferencesId"); + + b.HasIndex("PreferencesId"); + + b.ToTable("CustomerPreference"); + }); + + modelBuilder.Entity("CustomerPreferences", b => + { + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PreferencesId") + .HasColumnType("TEXT"); + + b.HasKey("CustomerId", "PreferencesId"); + + b.HasIndex("PreferencesId"); + + b.ToTable("CustomerPreferences"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("Employee"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Customer"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PromoCodeId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromoCodeId"); + + b.ToTable("CustomerPromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Preferences", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Customers", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.CustomerPromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PromoCodeId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PromoCodeId"); + + b.ToTable("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("Employees", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCodes", (string)null); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("RoleResponses", (string)null); + }); + + modelBuilder.Entity("CustomerPreference", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", null) + .WithMany() + .HasForeignKey("CustomersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", null) + .WithMany() + .HasForeignKey("PreferencesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("CustomerPreferences", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Customer", null) + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.Preference", null) + .WithMany() + .HasForeignKey("PreferencesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", null) + .WithMany("CustomerPromoCodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", "PromoCode") + .WithMany("CustomerPromoCodes") + .HasForeignKey("PromoCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany() + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.CustomerPromoCode", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Customer", null) + .WithMany("CustomerPromoCodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.PromoCode", "PromoCode") + .WithMany() + .HasForeignKey("PromoCodeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PromoCode"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Employee", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.PromoCode", b => + { + b.HasOne("PromoCodeFactory.DataAccess.Entities.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.DataAccess.Entities.Preference", "Preference") + .WithMany() + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Navigation("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Navigation("CustomerPromoCodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.DataAccess.Entities.Customer", b => + { + b.Navigation("CustomerPromoCodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/PromoCodeFactoryDbContext.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/PromoCodeFactoryDbContext.cs" index 6b123ea6c..ce882bbd3 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/PromoCodeFactoryDbContext.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/PromoCodeFactoryDbContext.cs" @@ -1,4 +1,7 @@ using Microsoft.EntityFrameworkCore; +using PromoCodeFactory.DataAccess.Configures; +using PromoCodeFactory.DataAccess.Entities; +using Preference = PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference; namespace PromoCodeFactory.DataAccess; @@ -9,11 +12,31 @@ public PromoCodeFactoryDbContext(DbContextOptions opt { } - //TODO: Добавить DbSet сущности + #region Блок DbSet's + public required DbSet Customers { get; set; } + + public required DbSet Employees { get; set; } + + public required DbSet Preferences { get; set; } + + public required DbSet PromoCodes { get; set; } + + public required DbSet CustomerPromoCodes { get; set; } + + public required DbSet Roles { get; set; } + #endregion protected override void OnModelCreating(ModelBuilder modelBuilder) { - //TODO: Добавить маппинг моделей + modelBuilder.ApplyConfiguration(new CustomerConfiguration()); + + modelBuilder.ApplyConfiguration(new EmployeeConfigurator()); + + modelBuilder.ApplyConfiguration(new PromoCodeConfigurator()); + + modelBuilder.ApplyConfiguration(new RoleResponseConfigurator()); + + modelBuilder.ApplyConfiguration(new PreferenceConfigurator()); base.OnModelCreating(modelBuilder); } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/CustomerEfRepository.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/CustomerEfRepository.cs" index 01e621052..2eb099357 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/CustomerEfRepository.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/CustomerEfRepository.cs" @@ -9,6 +9,11 @@ protected override IQueryable ApplyIncludes(IQueryable query { return query .Include(c => c.Preferences) - .Include(c => c.CustomerPromoCodes); + .Include(c => c.CustomerPromoCodes) + .ThenInclude(cp => cp.PromoCode) + .ThenInclude(pc => pc.PartnerManager) + .Include(c => c.CustomerPromoCodes) + .ThenInclude(cp => cp.PromoCode) + .ThenInclude(pc => pc.Preference); } } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs" index 748b927b3..28b010b78 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs" @@ -1,46 +1,55 @@ using System.Linq.Expressions; +using Microsoft.EntityFrameworkCore; using PromoCodeFactory.Core.Abstractions.Repositories; using PromoCodeFactory.Core.Domain; namespace PromoCodeFactory.DataAccess.Repositories; -internal class EfRepository(PromoCodeFactoryDbContext context) : IRepository where T : BaseEntity +internal class EfRepository(PromoCodeFactoryDbContext _context) : IRepository where T : BaseEntity { protected virtual IQueryable ApplyIncludes(IQueryable query) => query; - public Task Add(T entity, CancellationToken ct) + public async Task Add(T entity, CancellationToken ct) { - throw new NotImplementedException(); + await _context.Set().AddAsync(entity); + await _context.SaveChangesAsync(); } - public Task Delete(Guid id, CancellationToken ct) + public async Task Delete(Guid id, CancellationToken ct) { - throw new NotImplementedException(); + var entity = await _context.Set().FirstOrDefaultAsync(x => x.Id == id); + if (entity != null) + { + _context.Set().Remove(entity); + await _context.SaveChangesAsync(); + } } - public Task> GetAll(bool withIncludes = false, CancellationToken ct = default) + public async Task> GetAll(bool withIncludes = false, CancellationToken ct = default) { - throw new NotImplementedException(); + return await _context.Set().ToListAsync(); } - public Task GetById(Guid id, bool withIncludes = false, CancellationToken ct = default) + public async Task GetById(Guid id, bool withIncludes = false, CancellationToken ct = default) { - throw new NotImplementedException(); + return await _context.Set().FirstOrDefaultAsync(x => x.Id == id); } - public Task> GetByRangeId(IEnumerable ids, bool withIncludes = false, CancellationToken ct = default) + public async Task> GetByRangeId(IEnumerable ids, bool withIncludes = false, CancellationToken ct = default) { - throw new NotImplementedException(); + var idList = ids.ToList(); + return await _context.Set().Where(x => idList.Contains(x.Id)).ToListAsync(ct); } - public Task> GetWhere(Expression> predicate, bool withIncludes = false, CancellationToken ct = default) + public async Task> GetWhere(Expression> predicate, bool withIncludes = false, CancellationToken ct = default) { - throw new NotImplementedException(); + return await _context.Set().Where(predicate).ToListAsync(ct); } - public Task Update(T entity, CancellationToken ct) + public async Task Update(T entity, CancellationToken ct) { - throw new NotImplementedException(); + _context.Set().Update(entity); + await _context.SaveChangesAsync(ct); } } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs" index 1fbcd4f8f..b6b9420dd 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs" @@ -1,4 +1,8 @@ using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.Core.Exceptions; +using PromoCodeFactory.WebHost.Mapping; using PromoCodeFactory.WebHost.Models.Customers; namespace PromoCodeFactory.WebHost.Controllers; @@ -6,7 +10,10 @@ namespace PromoCodeFactory.WebHost.Controllers; /// /// Клиенты /// -public class CustomersController : BaseController +public class CustomersController( + IRepository customerRepository, + IRepository preferenceRepository + ) : BaseController { /// /// Получить данные всех клиентов @@ -15,7 +22,11 @@ public class CustomersController : BaseController [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> Get(CancellationToken ct) { - throw new NotImplementedException(); + var customers = await customerRepository.GetAll(ct: ct); + + var customersModels = customers.Select(CustomersMapper.ToCustomerShortResponse).ToList(); + + return Ok(customersModels); } /// @@ -26,7 +37,12 @@ public async Task>> Get(Cancella [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task> GetById(Guid id, CancellationToken ct) { - throw new NotImplementedException(); + var customer = await customerRepository.GetById(id, true, ct); + + if (customer is null) + return NotFound(); + + return Ok(CustomersMapper.ToCustomerResponse(customer)); } /// @@ -37,7 +53,14 @@ public async Task> GetById(Guid id, CancellationT [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] public async Task> Create([FromBody] CustomerCreateRequest request, CancellationToken ct) { - throw new NotImplementedException(); + var preferences = await preferenceRepository.GetByRangeId(request.PreferenceIds, ct: ct); + if (preferences.Count != request.PreferenceIds.Length) + return BadRequest(new ProblemDetails { Title = "Invalid preferences", Detail = "Some preference IDs were not found." }); + + var customer = CustomersMapper.ToCustomer(request, preferences.ToList()); + await customerRepository.Add(customer, ct); + + return CreatedAtAction(nameof(GetById), new { id = customer.Id }, CustomersMapper.ToCustomerShortResponse(customer)); } /// @@ -52,7 +75,29 @@ public async Task> Update( [FromBody] CustomerUpdateRequest request, CancellationToken ct) { - throw new NotImplementedException(); + var customer = await customerRepository.GetById(id, ct: ct); + if (customer is null) + return NotFound(); + + var preferences = await preferenceRepository.GetByRangeId(request.PreferenceIds, ct: ct); + if (preferences.Count != request.PreferenceIds.Length) + return BadRequest(new ProblemDetails { Title = "Invalid preferences", Detail = "Some preference IDs were not found." }); + + customer.FirstName = request.FirstName; + customer.LastName = request.LastName; + customer.Email = request.Email; + customer.Preferences = preferences.ToList(); + + try + { + await customerRepository.Update(customer, ct); + } + catch (EntityNotFoundException) + { + return NotFound(); + } + + return Ok(CustomersMapper.ToCustomerShortResponse(customer)); } /// @@ -63,6 +108,15 @@ public async Task> Update( [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task Delete(Guid id, CancellationToken ct) { - throw new NotImplementedException(); + try + { + await customerRepository.Delete(id, ct); + } + catch (EntityNotFoundException) + { + return NotFound(); + } + + return NoContent(); } -} +} \ No newline at end of file diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs" index 17f8880a2..f66a2043d 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs" @@ -1,4 +1,7 @@ using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.WebHost.Mapping; using PromoCodeFactory.WebHost.Models.Preferences; namespace PromoCodeFactory.WebHost.Controllers; @@ -6,7 +9,7 @@ namespace PromoCodeFactory.WebHost.Controllers; /// /// Предпочтения /// -public class PreferencesController : BaseController +public class PreferencesController(IRepository preferenceRepository) : BaseController { /// /// Получить все доступные предпочтения @@ -15,6 +18,10 @@ public class PreferencesController : BaseController [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> Get(CancellationToken ct) { - throw new NotImplementedException(); + var preferences = await preferenceRepository.GetAll(ct: ct); + + var preferencesModel = preferences.Select(PreferencesMapper.ToPreferenceShortResponse).ToList(); + + return Ok(preferencesModel); } } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PromoCodesController.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PromoCodesController.cs" index e55d5b0e8..d02bbde6a 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PromoCodesController.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Controllers/PromoCodesController.cs" @@ -1,4 +1,8 @@ using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.Core.Exceptions; +using PromoCodeFactory.WebHost.Mapping; using PromoCodeFactory.WebHost.Models.PromoCodes; namespace PromoCodeFactory.WebHost.Controllers; @@ -6,7 +10,12 @@ namespace PromoCodeFactory.WebHost.Controllers; /// /// Промокоды /// -public class PromoCodesController : BaseController +public class PromoCodesController( + IRepository promoCodeRepository, + IRepository preferenceRepository, + IRepository employeeRepository, + IRepository customerRepository + ) : BaseController { /// /// Получить все промокоды @@ -15,7 +24,11 @@ public class PromoCodesController : BaseController [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> Get(CancellationToken ct) { - throw new NotImplementedException(); + var promoCodes = await promoCodeRepository.GetAll(ct: ct); + + var promoCodesModel = promoCodes.Select(PromoCodesMapper.ToPromoCodeShortResponse).ToList(); + + return Ok(promoCodesModel); } /// @@ -26,7 +39,12 @@ public async Task>> Get(Cancell [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task> GetById(Guid id, CancellationToken ct) { - throw new NotImplementedException(); + var promoCode = await promoCodeRepository.GetById(id, true, ct); + + if (promoCode is null) + return NotFound(); + + return Ok(PromoCodesMapper.ToPromoCodeShortResponse(promoCode)); } /// @@ -38,7 +56,33 @@ public async Task> GetById(Guid id, Cancell [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task> Create(PromoCodeCreateRequest request, CancellationToken ct) { - throw new NotImplementedException(); + var preference = await preferenceRepository.GetById(request.PreferenceId, ct: ct); + if (preference is null) + return BadRequest(new ProblemDetails { Title = "Invalid preference", Detail = $"Preference with Id {request.PreferenceId} not found." }); + + var partnerManager = await employeeRepository.GetById(request.PartnerManagerId, ct: ct); + if (partnerManager is null) + return BadRequest(new ProblemDetails { Title = "Invalid partner manager", Detail = $"Employee with Id {request.PartnerManagerId} not found." }); + + var promoCode = PromoCodesMapper.ToPromoCode(request, preference, partnerManager); + await promoCodeRepository.Add(promoCode, ct); + + var customersWithPreference = await customerRepository.GetWhere(c => c.Preferences.Any(p => p.Id == request.PreferenceId), true, ct); + + foreach (var customer in customersWithPreference) + { + var customerPromoCode = new CustomerPromoCode + { + Id = Guid.NewGuid(), + CustomerId = customer.Id, + PromoCodeId = promoCode.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + customer.CustomerPromoCodes.Add(customerPromoCode); + await customerRepository.Update(customer, ct); + } + + return CreatedAtAction(nameof(GetById), new { id = promoCode.Id }, PromoCodesMapper.ToPromoCodeShortResponse(promoCode)); } /// @@ -53,6 +97,32 @@ public async Task Apply( [FromBody] PromoCodeApplyRequest request, CancellationToken ct) { - throw new NotImplementedException(); + var promoCode = await promoCodeRepository.GetById(id, true, ct); + if (promoCode is null) + return NotFound(new ProblemDetails { Title = "PromoCode not found", Detail = $"PromoCode with Id {id} not found." }); + + var customer = await customerRepository.GetById(request.CustomerId, true, ct); + if (customer is null) + return BadRequest(new ProblemDetails { Title = "Invalid customer", Detail = $"Customer with Id {request.CustomerId} not found." }); + + var customerPromoCode = customer.CustomerPromoCodes.FirstOrDefault(cp => cp.PromoCodeId == id); + if (customerPromoCode is null) + return BadRequest(new ProblemDetails { Title = "PromoCode not assigned", Detail = "This promo code was not assigned to the customer." }); + + if (customerPromoCode.AppliedAt is not null) + return BadRequest(new ProblemDetails { Title = "Already applied", Detail = "This promo code has already been used." }); + + customerPromoCode.AppliedAt = DateTimeOffset.UtcNow; + + try + { + await customerRepository.Update(customer, ct); + } + catch (EntityNotFoundException) + { + return NotFound(); + } + + return NoContent(); } -} +} \ No newline at end of file diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/CustomersMapper.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/CustomersMapper.cs" new file mode 100644 index 000000000..928eb424f --- /dev/null +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/CustomersMapper.cs" @@ -0,0 +1,40 @@ +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.WebHost.Models.Customers; + +namespace PromoCodeFactory.WebHost.Mapping; + +public static class CustomersMapper +{ + public static CustomerShortResponse ToCustomerShortResponse(Customer customer) + { + return new CustomerShortResponse( + customer.Id, + customer.FirstName, + customer.LastName, + customer.Email, + customer.Preferences.Select(PreferencesMapper.ToPreferenceShortResponse).ToList()); + } + + public static CustomerResponse ToCustomerResponse(Customer customer) + { + return new CustomerResponse( + customer.Id, + customer.FirstName, + customer.LastName, + customer.Email, + customer.Preferences.Select(PreferencesMapper.ToPreferenceShortResponse).ToList(), + customer.CustomerPromoCodes.Select(PromoCodesMapper.ToCustomerPromoCodeResponse).ToList()); + } + + public static Customer ToCustomer(CustomerCreateRequest request, List preferences) + { + return new Customer + { + Id = Guid.NewGuid(), + FirstName = request.FirstName, + LastName = request.LastName, + Email = request.Email, + Preferences = preferences + }; + } +} diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/PromoCodesMapper.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/PromoCodesMapper.cs" index 44f8ce5d3..740b7030b 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/PromoCodesMapper.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Mapping/PromoCodesMapper.cs" @@ -1,3 +1,4 @@ +using PromoCodeFactory.Core.Domain.Administration; using PromoCodeFactory.Core.Domain.PromoCodeManagement; using PromoCodeFactory.WebHost.Models.PromoCodes; @@ -17,4 +18,34 @@ public static PromoCodeShortResponse ToPromoCodeShortResponse(PromoCode promoCod promoCode.PartnerManager.Id, promoCode.Preference.Id); } + + public static PromoCode ToPromoCode(PromoCodeCreateRequest request, Preference preference, Employee partnerManager) + { + return new PromoCode + { + Id = Guid.NewGuid(), + Code = request.Code, + ServiceInfo = request.ServiceInfo, + PartnerName = request.PartnerName, + BeginDate = request.BeginDate, + EndDate = request.EndDate, + Preference = preference, + PartnerManager = partnerManager + }; + } + + public static CustomerPromoCodeResponse ToCustomerPromoCodeResponse(CustomerPromoCode customerPromoCode) + { + return new CustomerPromoCodeResponse( + customerPromoCode.Id, + customerPromoCode.PromoCode.Code, + customerPromoCode.PromoCode.ServiceInfo, + customerPromoCode.PromoCode.PartnerName, + customerPromoCode.PromoCode.BeginDate, + customerPromoCode.PromoCode.EndDate, + customerPromoCode.PromoCode.PartnerManager.Id, + customerPromoCode.PromoCode.Preference.Id, + customerPromoCode.CreatedAt, + customerPromoCode.AppliedAt); + } } diff --git "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Program.cs" "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Program.cs" index 7e082cd68..f058b4ddb 100644 --- "a/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Program.cs" +++ "b/Homeworks/03 \320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\261\320\260\320\267\321\213 \320\264\320\260\320\275\320\275\321\213\321\205 \321\207\320\265\321\200\320\265\320\267 Entity Framework/src/PromoCodeFactory.WebHost/Program.cs" @@ -26,7 +26,7 @@ app.MigrateDatabase(); -if (app.Environment.IsDevelopment()) - await app.SeedDatabase(); +//if (app.Environment.IsDevelopment()) +// await app.SeedDatabase(); app.Run();