diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..7b5c08f2 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\PromoCodeFactory.sln (Homeworks\\EF\\src\\PromoCodeFactory.sln)", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/ICustomerRepository.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/ICustomerRepository.cs new file mode 100644 index 00000000..e6b09840 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/ICustomerRepository.cs @@ -0,0 +1,16 @@ +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PromoCodeFactory.Core.Abstractions.Repositories +{ + public interface ICustomerRepository : IRepository + { + Task> GetAllWithPreferenceAsync(); + + Task GetByIdWithPreferenceAsync(Guid id); + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs index a1eb21fe..87891553 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Abstractions/Repositories/IRepository.cs @@ -11,5 +11,11 @@ public interface IRepository Task> GetAllAsync(); Task GetByIdAsync(Guid id); + + Task AddAsync(T entity); + + Task UpdateAsync(T entity); + + Task DeleteAsync(Guid id); } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Employee.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Employee.cs index 28099d61..0d375561 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Employee.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Employee.cs @@ -1,21 +1,33 @@ using PromoCodeFactory.Core.Domain; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; namespace PromoCodeFactory.Core.Domain.Administration { public class Employee : BaseEntity { + [Column("firstname"), MaxLength(50)] public string FirstName { get; set; } + + [Column("lastname"), MaxLength(50)] public string LastName { get; set; } + [Column("fullname"), MaxLength(101)] public string FullName => $"{FirstName} {LastName}"; + [Column("email"), MaxLength(50)] public string Email { get; set; } + [Column("mobile"), MaxLength(50)] + public string mobile { get; set; } + public Role Role { get; set; } + public Guid RoleId { get; set; } + public int AppliedPromocodesCount { get; set; } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Role.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Role.cs index f0fadc21..ad3e1055 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Role.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/Administration/Role.cs @@ -1,13 +1,25 @@ using PromoCodeFactory.Core.Domain; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; namespace PromoCodeFactory.Core.Domain.Administration { public class Role : BaseEntity { + [Column("name"), MaxLength(50)] public string Name { get; set; } - + [Column("description"), MaxLength(200)] public string Description { get; set; } + + /// + /// Список Employees + /// + public ICollection? Employees { get; set; } + + } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Customer.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Customer.cs index 6f5c3593..9ff80100 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Customer.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Customer.cs @@ -1,19 +1,33 @@ using PromoCodeFactory.Core.Domain; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; namespace PromoCodeFactory.Core.Domain.PromoCodeManagement { public class Customer : BaseEntity { + [Column("firstname"), MaxLength(50)] public string FirstName { get; set; } + [Column("lastname"), MaxLength(50)] public string LastName { get; set; } + [Column("fullname"), MaxLength(101)] public string FullName => $"{FirstName} {LastName}"; + [Column("email"), MaxLength(50)] public string Email { get; set; } - //TODO: Списки Preferences и Promocodes + /// + /// Список CustomerPreferences + /// + public ICollection? CustomerPreferences { get; set; } + + /// + /// Список Promocodes + /// + public ICollection? Promocodes { get; set; } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPreference.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPreference.cs new file mode 100644 index 00000000..265cc83c --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/CustomerPreference.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PromoCodeFactory.Core.Domain.PromoCodeManagement +{ + /// + /// связывающая таблица для Customer и Preference + /// + public class CustomerPreference + { + public Guid CustomerId { get; set; } + public Guid PreferenceId { get; set; } + public Customer Customer { get; set; } + public Preference Preference { get; set; } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Preference.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Preference.cs index 28e172a4..e475d1ea 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Preference.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/Preference.cs @@ -1,8 +1,23 @@ -namespace PromoCodeFactory.Core.Domain.PromoCodeManagement +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace PromoCodeFactory.Core.Domain.PromoCodeManagement { public class Preference : BaseEntity { + [Column("name"), MaxLength(50)] public string Name { get; set; } + + /// + /// Список CustomerPreferences + /// + public ICollection? CustomerPreferences { get; set; } + + /// + /// Список PromoCodes + /// + public ICollection? PromoCodes { get; set; } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/PromoCode.cs b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/PromoCode.cs index 3305a41a..8ed7e61f 100644 --- a/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/PromoCode.cs +++ b/Homeworks/EF/src/PromoCodeFactory.Core/Domain/PromoCodeManagement/PromoCode.cs @@ -1,4 +1,6 @@ using System; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; using System.Runtime; using PromoCodeFactory.Core.Domain; using PromoCodeFactory.Core.Domain.Administration; @@ -8,18 +10,27 @@ namespace PromoCodeFactory.Core.Domain.PromoCodeManagement public class PromoCode : BaseEntity { + [Column("code"), MaxLength(50)] public string Code { get; set; } + [Column("serviceinfo"), MaxLength(200)] public string ServiceInfo { get; set; } public DateTime BeginDate { get; set; } public DateTime EndDate { get; set; } + [Column("partnername"), MaxLength(100)] public string PartnerName { get; set; } public Employee PartnerManager { get; set; } public Preference Preference { get; set; } + + public Customer Customer { get; set; } + + public Guid CustomerId { get; set; } + + public Guid PreferenceId { get; set; } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Data/DataContext.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Data/DataContext.cs new file mode 100644 index 00000000..03b62f9f --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Data/DataContext.cs @@ -0,0 +1,133 @@ +using Microsoft.EntityFrameworkCore; +using PromoCodeFactory.Core.Domain.Administration; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace PromoCodeFactory.DataAccess.Data +{ + public class DataContext : DbContext + { + public DbSet CustomerDbSet { get; set; } + public DbSet PreferenceDbSet { get; set; } + public DbSet PromoCodeDbSet { get; set; } + public DbSet RoleDbSet { get; set; } + public DbSet EmployeeDbSet { get; set; } + + public DataContext(DbContextOptions options) : base(options) + { + //Database.EnsureDeleted(); + + var isAvalable = Database.CanConnect(); + var result = isAvalable ? "Ok!" : "Fail"; + + Console.WriteLine($"Try tot connect: {result}"); + + bool isCreated = Database.EnsureCreated(); + if (isCreated) + { + Console.WriteLine("db created!"); + } + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + //optionsBuilder.UseSqlite("Data Source=SQLiteTestDB.db"); + + //optionsBuilder + // .LogTo(Console.WriteLine) + // .EnableDetailedErrors(); + + //optionsBuilder.UseLazyLoadingProxies(); + + //base.OnConfiguring(optionsBuilder); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + var adminId = Guid.Parse("53729686-a368-4eeb-8bfa-cc69b6050d02"); + var partnerManagerId = Guid.Parse("b0ae7aac-5493-45cd-ad16-87426a5e7665"); + var familyPreferenceId = Guid.Parse("c4bda62e-fc74-4256-a956-4760b3858cbd"); + var childrenPreferenceId = Guid.Parse("76324c47-68d2-472d-abb8-33cfa8cc0c84"); + var customerPetrovId = Guid.Parse("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"); + + modelBuilder.Entity().HasData( + new Role { Id = adminId, + Name = "Admin", + Description = "Администратор",}, + new Role { Id = partnerManagerId, + Name = "PartnerManager", + Description = "Партнерский менеджер" } + ); + + modelBuilder.Entity().HasData( + new Preference { Id = Guid.Parse("ef7f299f-92d7-459f-896e-078ed53ef99c"), + Name = "Театр"}, + new Preference { Id = familyPreferenceId, + Name = "Семья"}, + new Preference { Id = childrenPreferenceId, + Name = "Дети"} + ); + + modelBuilder.Entity().HasData( + new Employee { Id = Guid.Parse("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), + Email = "owner@somemail.ru", + FirstName = "Иван", + LastName = "Сергеев", + RoleId = adminId, + AppliedPromocodesCount = 5 }, + new Employee { Id = Guid.Parse("f766e2bf-340a-46ea-bff3-f1700b435895"), + Email = "andreev@somemail.ru", + FirstName = "Петр", + LastName = "Андреев", + RoleId = partnerManagerId, + AppliedPromocodesCount = 10} + ); + + modelBuilder.Entity().HasData( + new Customer { Id = customerPetrovId, + Email = "ivan_sergeev@mail.ru", + FirstName = "Иван", + LastName = "Петров" } + ); + + modelBuilder.Entity().HasData( + new CustomerPreference { CustomerId = customerPetrovId , PreferenceId = familyPreferenceId }, + new CustomerPreference { CustomerId = customerPetrovId, PreferenceId = childrenPreferenceId } + ); + + //Связь Customer и Promocodes (1 ко многим) + modelBuilder.Entity() + .HasMany(c => c.Promocodes) + .WithOne(p => p.Customer) + .HasForeignKey(p => p.CustomerId) + .OnDelete(DeleteBehavior.Cascade); + + //Связь Customer и Preferences (много ко многим) + modelBuilder.Entity() + .HasKey(cp => new { cp.CustomerId, cp.PreferenceId }); + modelBuilder.Entity() + .HasOne(cp => cp.Customer) + .WithMany(c => c.CustomerPreferences) + .HasForeignKey(cp => cp.CustomerId); + modelBuilder.Entity() + .HasOne(cp => cp.Preference) + .WithMany(p => p.CustomerPreferences) + .HasForeignKey(cp => cp.PreferenceId); + + //Связь Preference и PromoCodes(1 предпочтение на много промокодов) + modelBuilder.Entity() + .HasMany(c => c.PromoCodes) + .WithOne(p => p.Preference) + .HasForeignKey(p => p.PreferenceId); + + //Связь Role и Employee (1 роль на много сотрудников) + modelBuilder.Entity() + .HasMany(c => c.Employees) + .WithOne(e => e.Role) + .HasForeignKey(p => p.RoleId); + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.Designer.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.Designer.cs new file mode 100644 index 00000000..94b647b4 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.Designer.cs @@ -0,0 +1,330 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PromoCodeFactory.DataAccess.Data; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20250608150320_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.5"); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedPromocodesCount") + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("EmployeeDbSet"); + + b.HasData( + new + { + Id = new Guid("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), + AppliedPromocodesCount = 5, + Email = "owner@somemail.ru", + FirstName = "Иван", + LastName = "Сергеев", + RoleId = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02") + }, + new + { + Id = new Guid("f766e2bf-340a-46ea-bff3-f1700b435895"), + AppliedPromocodesCount = 10, + Email = "andreev@somemail.ru", + FirstName = "Петр", + LastName = "Андреев", + RoleId = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("description"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("RoleDbSet"); + + b.HasData( + new + { + Id = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02"), + Description = "Администратор", + Name = "Admin" + }, + new + { + Id = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665"), + Description = "Партнерский менеджер", + Name = "PartnerManager" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.HasKey("Id"); + + b.ToTable("CustomerDbSet"); + + b.HasData( + new + { + Id = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + Email = "ivan_sergeev@mail.ru", + FirstName = "Иван", + LastName = "Петров" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.HasKey("CustomerId", "PreferenceId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("CustomerPreference"); + + b.HasData( + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd") + }, + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("PreferenceDbSet"); + + b.HasData( + new + { + Id = new Guid("ef7f299f-92d7-459f-896e-078ed53ef99c"), + Name = "Театр" + }, + new + { + Id = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd"), + Name = "Семья" + }, + new + { + Id = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84"), + Name = "Дети" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("code"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .HasMaxLength(100) + .HasColumnType("TEXT") + .HasColumnName("partnername"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("serviceinfo"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCodeDbSet"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Role", "Role") + .WithMany("Employees") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("CustomerPreferences") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("CustomerPreferences") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("Promocodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId"); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("PromoCodes") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Navigation("Employees"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("Promocodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("PromoCodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.cs new file mode 100644 index 00000000..9a1e0fd3 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608150320_InitialCreate.cs @@ -0,0 +1,227 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace PromoCodeFactory.DataAccess.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CustomerDbSet", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + firstname = table.Column(type: "TEXT", maxLength: 50, nullable: true), + lastname = table.Column(type: "TEXT", maxLength: 50, nullable: true), + email = table.Column(type: "TEXT", maxLength: 50, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CustomerDbSet", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PreferenceDbSet", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + name = table.Column(type: "TEXT", maxLength: 50, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PreferenceDbSet", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "RoleDbSet", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + name = table.Column(type: "TEXT", maxLength: 50, nullable: true), + description = table.Column(type: "TEXT", maxLength: 200, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_RoleDbSet", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CustomerPreference", + columns: table => new + { + CustomerId = table.Column(type: "TEXT", nullable: false), + PreferenceId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CustomerPreference", x => new { x.CustomerId, x.PreferenceId }); + table.ForeignKey( + name: "FK_CustomerPreference_CustomerDbSet_CustomerId", + column: x => x.CustomerId, + principalTable: "CustomerDbSet", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CustomerPreference_PreferenceDbSet_PreferenceId", + column: x => x.PreferenceId, + principalTable: "PreferenceDbSet", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "EmployeeDbSet", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + firstname = table.Column(type: "TEXT", maxLength: 50, nullable: true), + lastname = table.Column(type: "TEXT", maxLength: 50, nullable: true), + email = table.Column(type: "TEXT", maxLength: 50, nullable: true), + RoleId = table.Column(type: "TEXT", nullable: false), + AppliedPromocodesCount = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_EmployeeDbSet", x => x.Id); + table.ForeignKey( + name: "FK_EmployeeDbSet_RoleDbSet_RoleId", + column: x => x.RoleId, + principalTable: "RoleDbSet", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "PromoCodeDbSet", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + code = table.Column(type: "TEXT", maxLength: 50, nullable: true), + serviceinfo = table.Column(type: "TEXT", maxLength: 200, nullable: true), + BeginDate = table.Column(type: "TEXT", nullable: false), + EndDate = table.Column(type: "TEXT", nullable: false), + partnername = table.Column(type: "TEXT", maxLength: 100, nullable: true), + PartnerManagerId = table.Column(type: "TEXT", nullable: true), + CustomerId = table.Column(type: "TEXT", nullable: false), + PreferenceId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PromoCodeDbSet", x => x.Id); + table.ForeignKey( + name: "FK_PromoCodeDbSet_CustomerDbSet_CustomerId", + column: x => x.CustomerId, + principalTable: "CustomerDbSet", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PromoCodeDbSet_EmployeeDbSet_PartnerManagerId", + column: x => x.PartnerManagerId, + principalTable: "EmployeeDbSet", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_PromoCodeDbSet_PreferenceDbSet_PreferenceId", + column: x => x.PreferenceId, + principalTable: "PreferenceDbSet", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.InsertData( + table: "CustomerDbSet", + columns: new[] { "Id", "email", "firstname", "lastname" }, + values: new object[] { new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), "ivan_sergeev@mail.ru", "Иван", "Петров" }); + + migrationBuilder.InsertData( + table: "PreferenceDbSet", + columns: new[] { "Id", "name" }, + values: new object[,] + { + { new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84"), "Дети" }, + { new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd"), "Семья" }, + { new Guid("ef7f299f-92d7-459f-896e-078ed53ef99c"), "Театр" } + }); + + migrationBuilder.InsertData( + table: "RoleDbSet", + columns: new[] { "Id", "description", "name" }, + values: new object[,] + { + { new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02"), "Администратор", "Admin" }, + { new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665"), "Партнерский менеджер", "PartnerManager" } + }); + + migrationBuilder.InsertData( + table: "CustomerPreference", + columns: new[] { "CustomerId", "PreferenceId" }, + values: new object[,] + { + { new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84") }, + { new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd") } + }); + + migrationBuilder.InsertData( + table: "EmployeeDbSet", + columns: new[] { "Id", "AppliedPromocodesCount", "email", "firstname", "lastname", "RoleId" }, + values: new object[,] + { + { new Guid("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), 5, "owner@somemail.ru", "Иван", "Сергеев", new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02") }, + { new Guid("f766e2bf-340a-46ea-bff3-f1700b435895"), 10, "andreev@somemail.ru", "Петр", "Андреев", new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665") } + }); + + migrationBuilder.CreateIndex( + name: "IX_CustomerPreference_PreferenceId", + table: "CustomerPreference", + column: "PreferenceId"); + + migrationBuilder.CreateIndex( + name: "IX_EmployeeDbSet_RoleId", + table: "EmployeeDbSet", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_PromoCodeDbSet_CustomerId", + table: "PromoCodeDbSet", + column: "CustomerId"); + + migrationBuilder.CreateIndex( + name: "IX_PromoCodeDbSet_PartnerManagerId", + table: "PromoCodeDbSet", + column: "PartnerManagerId"); + + migrationBuilder.CreateIndex( + name: "IX_PromoCodeDbSet_PreferenceId", + table: "PromoCodeDbSet", + column: "PreferenceId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CustomerPreference"); + + migrationBuilder.DropTable( + name: "PromoCodeDbSet"); + + migrationBuilder.DropTable( + name: "CustomerDbSet"); + + migrationBuilder.DropTable( + name: "EmployeeDbSet"); + + migrationBuilder.DropTable( + name: "PreferenceDbSet"); + + migrationBuilder.DropTable( + name: "RoleDbSet"); + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.Designer.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.Designer.cs new file mode 100644 index 00000000..db059e94 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.Designer.cs @@ -0,0 +1,335 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PromoCodeFactory.DataAccess.Data; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20250608151407_UpdateEmployeeMobile")] + partial class UpdateEmployeeMobile + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.5"); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedPromocodesCount") + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.Property("mobile") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("mobile"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("EmployeeDbSet"); + + b.HasData( + new + { + Id = new Guid("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), + AppliedPromocodesCount = 5, + Email = "owner@somemail.ru", + FirstName = "Иван", + LastName = "Сергеев", + RoleId = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02") + }, + new + { + Id = new Guid("f766e2bf-340a-46ea-bff3-f1700b435895"), + AppliedPromocodesCount = 10, + Email = "andreev@somemail.ru", + FirstName = "Петр", + LastName = "Андреев", + RoleId = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("description"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("RoleDbSet"); + + b.HasData( + new + { + Id = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02"), + Description = "Администратор", + Name = "Admin" + }, + new + { + Id = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665"), + Description = "Партнерский менеджер", + Name = "PartnerManager" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.HasKey("Id"); + + b.ToTable("CustomerDbSet"); + + b.HasData( + new + { + Id = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + Email = "ivan_sergeev@mail.ru", + FirstName = "Иван", + LastName = "Петров" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.HasKey("CustomerId", "PreferenceId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("CustomerPreference"); + + b.HasData( + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd") + }, + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("PreferenceDbSet"); + + b.HasData( + new + { + Id = new Guid("ef7f299f-92d7-459f-896e-078ed53ef99c"), + Name = "Театр" + }, + new + { + Id = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd"), + Name = "Семья" + }, + new + { + Id = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84"), + Name = "Дети" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("code"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .HasMaxLength(100) + .HasColumnType("TEXT") + .HasColumnName("partnername"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("serviceinfo"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCodeDbSet"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Role", "Role") + .WithMany("Employees") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("CustomerPreferences") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("CustomerPreferences") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("Promocodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId"); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("PromoCodes") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Navigation("Employees"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("Promocodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("PromoCodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.cs new file mode 100644 index 00000000..7b2de509 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/20250608151407_UpdateEmployeeMobile.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + /// + public partial class UpdateEmployeeMobile : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "mobile", + table: "EmployeeDbSet", + type: "TEXT", + maxLength: 50, + nullable: true); + + migrationBuilder.UpdateData( + table: "EmployeeDbSet", + keyColumn: "Id", + keyValue: new Guid("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), + column: "mobile", + value: null); + + migrationBuilder.UpdateData( + table: "EmployeeDbSet", + keyColumn: "Id", + keyValue: new Guid("f766e2bf-340a-46ea-bff3-f1700b435895"), + column: "mobile", + value: null); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "mobile", + table: "EmployeeDbSet"); + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/DataContextModelSnapshot.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/DataContextModelSnapshot.cs new file mode 100644 index 00000000..3bd38fce --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Migrations/DataContextModelSnapshot.cs @@ -0,0 +1,332 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PromoCodeFactory.DataAccess.Data; + +#nullable disable + +namespace PromoCodeFactory.DataAccess.Migrations +{ + [DbContext(typeof(DataContext))] + partial class DataContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.5"); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AppliedPromocodesCount") + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.Property("mobile") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("mobile"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("EmployeeDbSet"); + + b.HasData( + new + { + Id = new Guid("451533d5-d8d5-4a11-9c7b-eb9f14e1a32f"), + AppliedPromocodesCount = 5, + Email = "owner@somemail.ru", + FirstName = "Иван", + LastName = "Сергеев", + RoleId = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02") + }, + new + { + Id = new Guid("f766e2bf-340a-46ea-bff3-f1700b435895"), + AppliedPromocodesCount = 10, + Email = "andreev@somemail.ru", + FirstName = "Петр", + LastName = "Андреев", + RoleId = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("description"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("RoleDbSet"); + + b.HasData( + new + { + Id = new Guid("53729686-a368-4eeb-8bfa-cc69b6050d02"), + Description = "Администратор", + Name = "Admin" + }, + new + { + Id = new Guid("b0ae7aac-5493-45cd-ad16-87426a5e7665"), + Description = "Партнерский менеджер", + Name = "PartnerManager" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("email"); + + b.Property("FirstName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("firstname"); + + b.Property("LastName") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("lastname"); + + b.HasKey("Id"); + + b.ToTable("CustomerDbSet"); + + b.HasData( + new + { + Id = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + Email = "ivan_sergeev@mail.ru", + FirstName = "Иван", + LastName = "Петров" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.HasKey("CustomerId", "PreferenceId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("CustomerPreference"); + + b.HasData( + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd") + }, + new + { + CustomerId = new Guid("a6c8c6b1-4349-45b0-ab31-244740aaf0f0"), + PreferenceId = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84") + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("PreferenceDbSet"); + + b.HasData( + new + { + Id = new Guid("ef7f299f-92d7-459f-896e-078ed53ef99c"), + Name = "Театр" + }, + new + { + Id = new Guid("c4bda62e-fc74-4256-a956-4760b3858cbd"), + Name = "Семья" + }, + new + { + Id = new Guid("76324c47-68d2-472d-abb8-33cfa8cc0c84"), + Name = "Дети" + }); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("BeginDate") + .HasColumnType("TEXT"); + + b.Property("Code") + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("code"); + + b.Property("CustomerId") + .HasColumnType("TEXT"); + + b.Property("EndDate") + .HasColumnType("TEXT"); + + b.Property("PartnerManagerId") + .HasColumnType("TEXT"); + + b.Property("PartnerName") + .HasMaxLength(100) + .HasColumnType("TEXT") + .HasColumnName("partnername"); + + b.Property("PreferenceId") + .HasColumnType("TEXT"); + + b.Property("ServiceInfo") + .HasMaxLength(200) + .HasColumnType("TEXT") + .HasColumnName("serviceinfo"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("PartnerManagerId"); + + b.HasIndex("PreferenceId"); + + b.ToTable("PromoCodeDbSet"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Employee", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Role", "Role") + .WithMany("Employees") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.CustomerPreference", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("CustomerPreferences") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("CustomerPreferences") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.PromoCode", b => + { + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", "Customer") + .WithMany("Promocodes") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PromoCodeFactory.Core.Domain.Administration.Employee", "PartnerManager") + .WithMany() + .HasForeignKey("PartnerManagerId"); + + b.HasOne("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", "Preference") + .WithMany("PromoCodes") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("PartnerManager"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.Administration.Role", b => + { + b.Navigation("Employees"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Customer", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("Promocodes"); + }); + + modelBuilder.Entity("PromoCodeFactory.Core.Domain.PromoCodeManagement.Preference", b => + { + b.Navigation("CustomerPreferences"); + + b.Navigation("PromoCodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/PromoCodeFactory.DataAccess.csproj b/Homeworks/EF/src/PromoCodeFactory.DataAccess/PromoCodeFactory.DataAccess.csproj index 4b290698..0d2bae03 100644 --- a/Homeworks/EF/src/PromoCodeFactory.DataAccess/PromoCodeFactory.DataAccess.csproj +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/PromoCodeFactory.DataAccess.csproj @@ -4,8 +4,25 @@ net8.0 + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/CustomerRepository.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/CustomerRepository.cs new file mode 100644 index 00000000..dd0d4637 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/CustomerRepository.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.DataAccess.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PromoCodeFactory.DataAccess.Repositories +{ + public class CustomerRepository : EfRepository, ICustomerRepository + { + public CustomerRepository(DataContext context) : base(context) + { + + } + + public async Task> GetAllWithPreferenceAsync() + { + return Context.Set().Include(c => c.CustomerPreferences).ThenInclude(cp => cp.Preference).AsNoTracking() ; + } + + public async Task GetByIdWithPreferenceAsync(Guid id) + { + return await Context.Set().Include(c => c.CustomerPreferences).ThenInclude(cp => cp.Preference).Include(c => c.Promocodes).FirstOrDefaultAsync(c => c.Id == id); + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs new file mode 100644 index 00000000..5e0fc3e3 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/EfRepository.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain; +using PromoCodeFactory.DataAccess.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace PromoCodeFactory.DataAccess.Repositories +{ + public class EfRepository : IRepository + where T : BaseEntity + + { + protected readonly DbContext Context; + private readonly DbSet _entitySet; + + public EfRepository(DataContext context) + { + Context = context; + _entitySet = Context.Set(); + } + + public async Task> GetAllAsync() + { + return (await _entitySet.AsNoTracking().ToListAsync()).AsEnumerable(); + } + + public async Task GetByIdAsync(Guid id) + { + return await Context.Set().FindAsync(id).AsTask(); + } + + + public async Task AddAsync(T entity) + { + var entityEntryAdded = await _entitySet.AddAsync(entity); + await Context.SaveChangesAsync(); + return entityEntryAdded.Entity; + } + + public async Task UpdateAsync(T entity) + { + Context.Update(entity); + await Context.SaveChangesAsync(); + } + + public async Task DeleteAsync(Guid id) + { + var entity = await GetByIdAsync(id); + if (entity == null) + return; + Context.Remove(entity); + await Context.SaveChangesAsync(); + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs index dd099f5e..6b4f29fa 100644 --- a/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs +++ b/Homeworks/EF/src/PromoCodeFactory.DataAccess/Repositories/InMemoryRepository.cs @@ -27,5 +27,20 @@ public Task GetByIdAsync(Guid id) { return Task.FromResult(Data.FirstOrDefault(x => x.Id == id)); } + + public Task AddAsync(T entity) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(T entity) + { + throw new NotImplementedException(); + } + + public Task DeleteAsync(Guid id) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs index cf069a09..f62312b6 100644 --- a/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/CustomersController.cs @@ -1,6 +1,12 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.Administration; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; using PromoCodeFactory.WebHost.Models; using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace PromoCodeFactory.WebHost.Controllers @@ -13,39 +19,156 @@ namespace PromoCodeFactory.WebHost.Controllers public class CustomersController : ControllerBase { + private readonly ICustomerRepository _customerRepository; + + public CustomersController(ICustomerRepository customerRepository) + { + _customerRepository = customerRepository; + } + + /// + /// Получить всех клиентов + /// + /// [HttpGet] - public Task> GetCustomersAsync() + public async Task> GetCustomersAsync() { - //TODO: Добавить получение списка клиентов - throw new NotImplementedException(); + var customers = await _customerRepository.GetAllAsync() ?? new List(); + + var customerShortResponseList = customers.Select(x => + new CustomerShortResponse() + { + Id = x.Id, + Email = x.Email, + FirstName = x.FirstName, + LastName = x.LastName + }).ToList(); + + return customerShortResponseList; } + /// + /// Получить данные клиента по Id + /// + /// + /// [HttpGet("{id}")] - public Task> GetCustomerAsync(Guid id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(CustomerResponse))] + [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(Guid))] + [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] + public async Task> GetCustomerAsync(Guid id) { - //TODO: Добавить получение клиента вместе с выданными ему промомкодами - throw new NotImplementedException(); + var customer = await _customerRepository.GetByIdWithPreferenceAsync(id); + + if (customer == null) + return NotFound(); + //var customersPreferencesList = (await _customerRepository.GetByIdWithPreferenceAsync(id)).CustomerPreferences.Select(cp => cp.Preference).ToList(); + + var customerResponse = new CustomerResponse() + { + Id = customer.Id, + Email = customer.Email, + FirstName = customer.FirstName, + LastName = customer.LastName, + Preferences = customer.CustomerPreferences?.Select(cp => new PreferenceResponse { Name = cp.Preference.Name }).ToList() ?? new List(), + PromoCodes = customer.Promocodes?.Select(p => new PromoCodeShortResponse {Id = p.Id, Code = p.Code, BeginDate = p.BeginDate.ToString(), EndDate = p.EndDate.ToString(), PartnerName = p.PartnerName, ServiceInfo = p.ServiceInfo }).ToList() ?? new List() + }; + return customerResponse; } + /// + /// Получить неполные данные клиента по Id + /// + /// + [HttpGet("short/{id:guid}", Name = "GetCustomerShort")] + [ProducesResponseType(typeof(CustomerShortResponse), 200)] + [ProducesResponseType(404)] + public async Task> GetShortCustomerByIdAsync(Guid id) + { + var customer = await _customerRepository.GetByIdAsync(id); + + if (customer == null) + return NotFound(); + + var customerShortResponse = new CustomerShortResponse() + { + Id = customer.Id, + Email = customer.Email, + FirstName = customer.FirstName, + LastName = customer.LastName + }; + + return Ok(customerShortResponse); + } + + /// + /// Добавить нового клиента + /// + /// + /// [HttpPost] - public Task CreateCustomerAsync(CreateOrEditCustomerRequest request) + [ProducesResponseType(typeof(EmployeeResponse), 201)] + [ProducesResponseType(400)] + public async Task CreateCustomerAsync(CreateOrEditCustomerRequest request) { - //TODO: Добавить создание нового клиента вместе с его предпочтениями - throw new NotImplementedException(); + var customer = new Customer() + { + Id = Guid.NewGuid(), + FirstName = request.FirstName, + LastName = request.LastName, + Email = request.Email + }; + customer.CustomerPreferences = request.PreferenceIds?.Select(p => new CustomerPreference() { CustomerId = customer.Id, PreferenceId = p }).ToList()?? null; + var createdCustomer = await _customerRepository.AddAsync(customer); + if (createdCustomer == null) return Problem("Не удалось создать клиента"); + var customerShortResponse = new CustomerShortResponse() + { + Id = createdCustomer.Id, + Email = createdCustomer.Email, + FirstName = createdCustomer.FirstName, + LastName = createdCustomer.LastName + }; + + return CreatedAtRoute("GetCustomerShort", new { id = createdCustomer.Id }, customerShortResponse); } - [HttpPut("{id}")] - public Task EditCustomersAsync(Guid id, CreateOrEditCustomerRequest request) + /// + /// Обновить существующего клиента + /// + /// + /// + /// + [HttpPut("{id:guid}")] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + [ProducesResponseType(404)] + public async Task EditCustomersAsync(Guid id, CreateOrEditCustomerRequest request) { - //TODO: Обновить данные клиента вместе с его предпочтениями - throw new NotImplementedException(); + var customer = await _customerRepository.GetByIdWithPreferenceAsync(id); + if (customer == null) + return NotFound(); + customer.FirstName = request.FirstName; + customer.LastName = request.LastName; + customer.Email = request.Email; + customer.CustomerPreferences = request.PreferenceIds?.Select(p => new CustomerPreference() { CustomerId = customer.Id, PreferenceId = p }).ToList() ?? null; + await _customerRepository.UpdateAsync(customer); + return Ok(id); } - [HttpDelete] - public Task DeleteCustomer(Guid id) + /// + /// Удалить клиента + /// + /// + /// + /// + [HttpDelete("{id:guid}")] + [ProducesResponseType(204)] + [ProducesResponseType(400)] + [ProducesResponseType(404)] + public async Task DeleteCustomer(Guid id) { - //TODO: Удаление клиента вместе с выданными ему промокодами - throw new NotImplementedException(); + await _customerRepository.DeleteAsync(id); + return NoContent(); } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs new file mode 100644 index 00000000..ee900585 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PreferencesController.cs @@ -0,0 +1,45 @@ +using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.Administration; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; +using PromoCodeFactory.DataAccess.Repositories; +using PromoCodeFactory.WebHost.Models; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PromoCodeFactory.WebHost.Controllers +{ + /// + /// Предпочтения + /// + [ApiController] + [Route("api/v1/[controller]")] + public class PreferencesController : ControllerBase + { + private readonly IRepository _preferenceRepository; + + public PreferencesController(IRepository preferenceRepository) + { + _preferenceRepository = preferenceRepository; + } + + /// + /// Получить список предпочтений + /// + /// + [HttpGet] + public async Task> GetPreferencesAsync() + { + var preferences = await _preferenceRepository.GetAllAsync() ?? new List(); + + var preferencesResponseList = preferences.Select(x => + new PreferenceResponse() + { + Name = x.Name, + }).ToList(); + + return preferencesResponseList; + } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PromocodesController.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PromocodesController.cs index 5b96c327..371cf2b7 100644 --- a/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PromocodesController.cs +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Controllers/PromocodesController.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using PromoCodeFactory.Core.Abstractions.Repositories; +using PromoCodeFactory.Core.Domain.PromoCodeManagement; using PromoCodeFactory.WebHost.Models; namespace PromoCodeFactory.WebHost.Controllers @@ -14,15 +17,38 @@ namespace PromoCodeFactory.WebHost.Controllers public class PromocodesController : ControllerBase { + private readonly IRepository _promoCodeRepository; + private readonly ICustomerRepository _customerRepository; + private readonly IRepository _preferenceRepository; + + public PromocodesController(IRepository promoCodeRepository, ICustomerRepository customerRepository, IRepository preferenceRepository) + { + _promoCodeRepository = promoCodeRepository; + _customerRepository = customerRepository; + _preferenceRepository = preferenceRepository; + } + /// /// Получить все промокоды /// /// [HttpGet] - public Task>> GetPromocodesAsync() + public async Task>> GetPromocodesAsync() { - //TODO: Получить все промокоды - throw new NotImplementedException(); + var promocodes = await _promoCodeRepository.GetAllAsync(); + + var promocodesShortResponseList = promocodes.Select(x => + new PromoCodeShortResponse() + { + Id = x.Id, + Code = x.Code, + ServiceInfo = x.ServiceInfo, + BeginDate = x.BeginDate.ToString(), + EndDate = x.EndDate.ToString(), + PartnerName = x.PartnerName + }).ToList(); + + return promocodesShortResponseList; } /// @@ -30,10 +56,31 @@ public Task>> GetPromocodesAsync() /// /// [HttpPost] - public Task GivePromoCodesToCustomersWithPreferenceAsync(GivePromoCodeRequest request) + public async Task GivePromoCodesToCustomersWithPreferenceAsync(GivePromoCodeRequest request) { - //TODO: Создать промокод и выдать его клиентам с указанным предпочтением - throw new NotImplementedException(); + var preferences = await _preferenceRepository.GetAllAsync(); + var preference = preferences.FirstOrDefault(p => p.Name == request.Preference); + if (preference == null) + { + return Problem("Не найдено указанное предпочтение"); + } + var customers = await _customerRepository.GetAllWithPreferenceAsync(); + foreach (var customer in customers.Where(c => c.CustomerPreferences != null && c.CustomerPreferences.Select(cp => cp.Preference).Contains(preference))) + { + var promocode = new PromoCode() + { + Id = Guid.NewGuid(), + Code = request.PromoCode, + ServiceInfo = request.ServiceInfo, + PartnerName= request.PartnerName, + PreferenceId = preference.Id, + CustomerId = customer.Id, + BeginDate = DateTime.UtcNow, + EndDate = DateTime.UtcNow.AddDays(7) + }; + var created = await _promoCodeRepository.AddAsync(promocode); + } + return Ok(); } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/CustomerResponse.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/CustomerResponse.cs index 97ea3e6b..cd2b8a57 100644 --- a/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/CustomerResponse.cs +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/CustomerResponse.cs @@ -9,7 +9,7 @@ public class CustomerResponse public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } - //TODO: Добавить список предпочтений + public List Preferences { get; set; } public List PromoCodes { get; set; } } } \ No newline at end of file diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/PreferenceResponse.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/PreferenceResponse.cs new file mode 100644 index 00000000..ac7dd9e3 --- /dev/null +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Models/PreferenceResponse.cs @@ -0,0 +1,7 @@ +namespace PromoCodeFactory.WebHost.Models +{ + public class PreferenceResponse + { + public string Name { get; set; } + } +} diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj b/Homeworks/EF/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj index 4bb08b6e..db19d590 100644 --- a/Homeworks/EF/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/PromoCodeFactory.WebHost.csproj @@ -12,6 +12,16 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db new file mode 100644 index 00000000..9233f757 Binary files /dev/null and b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db differ diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-shm b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-shm new file mode 100644 index 00000000..7797c5f8 Binary files /dev/null and b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-shm differ diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-wal b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-wal new file mode 100644 index 00000000..33cfcb4e Binary files /dev/null and b/Homeworks/EF/src/PromoCodeFactory.WebHost/SQLiteTestDB.db-wal differ diff --git a/Homeworks/EF/src/PromoCodeFactory.WebHost/Startup.cs b/Homeworks/EF/src/PromoCodeFactory.WebHost/Startup.cs index 73a898fc..cf5b72cd 100644 --- a/Homeworks/EF/src/PromoCodeFactory.WebHost/Startup.cs +++ b/Homeworks/EF/src/PromoCodeFactory.WebHost/Startup.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using PromoCodeFactory.Core.Abstractions.Repositories; @@ -17,14 +18,18 @@ public class Startup public void ConfigureServices(IServiceCollection services) { services.AddControllers(); - services.AddScoped(typeof(IRepository), (x) => - new InMemoryRepository(FakeDataFactory.Employees)); - services.AddScoped(typeof(IRepository), (x) => - new InMemoryRepository(FakeDataFactory.Roles)); - services.AddScoped(typeof(IRepository), (x) => - new InMemoryRepository(FakeDataFactory.Preferences)); - services.AddScoped(typeof(IRepository), (x) => - new InMemoryRepository(FakeDataFactory.Customers)); + //services.AddScoped(typeof(IRepository), typeof(EfRepository)); + services.AddScoped(typeof(IRepository), typeof(EfRepository)); + services.AddScoped(typeof(IRepository), typeof(EfRepository)); + services.AddScoped(typeof(IRepository), typeof(EfRepository)); + services.AddScoped(typeof(IRepository), typeof(EfRepository)); + services.AddScoped(typeof(ICustomerRepository), typeof(CustomerRepository)); + + services.AddDbContext(options => + { + //options.UseSqlite(builder.Configuration.GetConnectionString("SqliteConnection")); + options.UseSqlite("Data Source=SQLiteTestDB.db"); + }); services.AddOpenApiDocument(options => { @@ -34,7 +39,7 @@ public void ConfigureServices(IServiceCollection services) } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext context) { if (env.IsDevelopment()) { @@ -45,6 +50,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseHsts(); } + //context.Database.Migrate(); + app.UseOpenApi(); app.UseSwaggerUi(x => {