diff --git a/BusinessLogic/Tools/Mail/Mail.cs b/BusinessLogic/Tools/Mail/Mail.cs index 5adba23..44cc1a8 100644 --- a/BusinessLogic/Tools/Mail/Mail.cs +++ b/BusinessLogic/Tools/Mail/Mail.cs @@ -6,10 +6,11 @@ using System.Threading.Tasks; namespace BusinessLogic.Tools.Mail { - public class Mail - { - public IEnumerable To { get; set; } = null!; - public string Title { get; set; } = null!; - public string Body { get; set; } = null!; - } + public class Mail + { + public IEnumerable To { get; set; } = null!; + public string Title { get; set; } = null!; + public string Body { get; set; } = null!; + public bool IsSendable { get; set; } = true; + } } \ No newline at end of file diff --git a/BusinessLogic/Tools/Mail/MailSender.cs b/BusinessLogic/Tools/Mail/MailSender.cs index 329b392..3df9c48 100644 --- a/BusinessLogic/Tools/Mail/MailSender.cs +++ b/BusinessLogic/Tools/Mail/MailSender.cs @@ -8,39 +8,41 @@ using System.Threading.Tasks; namespace BusinessLogic.Tools.Mail { - public class MailSender - { - private static string _email; - private static string _password; - private static string _smtpClientHost; - private static short _smtpClientPort; + public class MailSender + { + private static string _email; + private static string _password; + private static string _smtpClientHost; + private static short _smtpClientPort; - public void SetupMailOptions(MailOptions options) - { - _email = options.Email; - _password = options.Password; - _smtpClientHost = options.SmtpClientHost; - _smtpClientPort = options.SmtpClientPort; - } + public void SetupMailOptions(MailOptions options) + { + _email = options.Email; + _password = options.Password; + _smtpClientHost = options.SmtpClientHost; + _smtpClientPort = options.SmtpClientPort; + } - public static void Send(Mail mail) - { - using SmtpClient client = new SmtpClient(_smtpClientHost, _smtpClientPort); - client.Credentials = new NetworkCredential(_email, _password); - client.EnableSsl = true; + public static void Send(Mail mail) + { + if (!mail.IsSendable) return; - using MailMessage message = new MailMessage(); + using SmtpClient client = new SmtpClient(_smtpClientHost, _smtpClientPort); + client.Credentials = new NetworkCredential(_email, _password); + client.EnableSsl = true; - message.From = new MailAddress(_email); - foreach (string to in mail.To) - { - message.To.Add(to); - } + using MailMessage message = new MailMessage(); - message.Subject = mail.Title; - message.Body = mail.Body; + message.From = new MailAddress(_email); + foreach (string to in mail.To) + { + message.To.Add(to); + } - client.Send(message); - } - } + message.Subject = mail.Title; + message.Body = mail.Body; + + client.Send(message); + } + } } \ No newline at end of file diff --git a/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs b/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs index fdd33d9..3a6c2dc 100644 --- a/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs +++ b/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs @@ -8,14 +8,18 @@ using System.Threading.Tasks; namespace BusinessLogic.Tools.Mail.MailTemplates { - public class MailRegistration : Mail - { - public MailRegistration(UserBindingModel user) - { - To = [user.Email]; - Title = "Приветствуем Вас на нашем сайте!"; - Body = $"Спасибо, {user.SecondName} {user.FirstName}, что выбрали НАС.\n" + - $"Надеемся, что Вам что-то уже приглянулось!"; - } - } + public class MailRegistration : Mail + { + public MailRegistration(UserBindingModel user) + { + if (user.OnlyImportantMails) + { + IsSendable = false; + } + To = [user.Email]; + Title = "Приветствуем Вас на нашем сайте!"; + Body = $"Спасибо, {user.SecondName} {user.FirstName}, что выбрали НАС.\n" + + $"Надеемся, что Вам что-то уже приглянулось!"; + } + } } \ No newline at end of file diff --git a/Contracts/BindingModels/UserBindingModel.cs b/Contracts/BindingModels/UserBindingModel.cs index d5e19ae..6c192d6 100644 --- a/Contracts/BindingModels/UserBindingModel.cs +++ b/Contracts/BindingModels/UserBindingModel.cs @@ -6,15 +6,16 @@ using System.Threading.Tasks; namespace Contracts.BindingModels { - public class UserBindingModel - { - public Guid Id { get; set; } - public string FirstName { get; set; } = string.Empty; - public string SecondName { get; set; } = string.Empty; - public string Email { get; set; } = string.Empty; - public string PasswordHash { get; set; } = string.Empty; - public string? Password { get; set; } - public DateTime Birthday { get; set; } - public RoleBindingModel Role { get; set; } = null!; - } + public class UserBindingModel + { + public Guid Id { get; set; } + public string FirstName { get; set; } = string.Empty; + public string SecondName { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string PasswordHash { get; set; } = string.Empty; + public string? Password { get; set; } + public DateTime Birthday { get; set; } + public bool OnlyImportantMails { get; set; } + public RoleBindingModel Role { get; set; } = null!; + } } \ No newline at end of file diff --git a/Contracts/Converters/UserConverter.cs b/Contracts/Converters/UserConverter.cs index b951d11..ae6fd8a 100644 --- a/Contracts/Converters/UserConverter.cs +++ b/Contracts/Converters/UserConverter.cs @@ -8,26 +8,28 @@ using System.Threading.Tasks; namespace Contracts.Converters { - public static class UserConverter - { - public static UserViewModel ToView(UserBindingModel model) => new() - { - Id = model.Id, - FirstName = model.FirstName, - SecondName = model.SecondName, - Email = model.Email, - Birthday = model.Birthday, - Role = RoleConverter.ToView(model.Role), - }; + public static class UserConverter + { + public static UserViewModel ToView(UserBindingModel model) => new() + { + Id = model.Id, + FirstName = model.FirstName, + SecondName = model.SecondName, + Email = model.Email, + Birthday = model.Birthday, + OnlyImportantMails = model.OnlyImportantMails, + Role = RoleConverter.ToView(model.Role), + }; - public static UserBindingModel ToBinding(UserViewModel model) => new() - { - Id = model.Id, - FirstName = model.FirstName, - SecondName = model.SecondName, - Email = model.Email, - Birthday = model.Birthday, - Role = RoleConverter.ToBinding(model.Role), - }; - } + public static UserBindingModel ToBinding(UserViewModel model) => new() + { + Id = model.Id, + FirstName = model.FirstName, + SecondName = model.SecondName, + Email = model.Email, + Birthday = model.Birthday, + OnlyImportantMails = model.OnlyImportantMails, + Role = RoleConverter.ToBinding(model.Role), + }; + } } \ No newline at end of file diff --git a/Contracts/SearchModels/UserSearchModel.cs b/Contracts/SearchModels/UserSearchModel.cs index 2df2131..37271fc 100644 --- a/Contracts/SearchModels/UserSearchModel.cs +++ b/Contracts/SearchModels/UserSearchModel.cs @@ -6,9 +6,10 @@ using System.Threading.Tasks; namespace Contracts.SearchModels { - public class UserSearchModel - { - public Guid? Id { get; set; } - public string? Email { get; set; } - } + public class UserSearchModel + { + public Guid? Id { get; set; } + public string? Email { get; set; } + public bool? OnlyImportantMails { get; set; } + } } \ No newline at end of file diff --git a/Contracts/ViewModels/UserViewModel.cs b/Contracts/ViewModels/UserViewModel.cs index 6174d56..6b3ccd4 100644 --- a/Contracts/ViewModels/UserViewModel.cs +++ b/Contracts/ViewModels/UserViewModel.cs @@ -6,13 +6,14 @@ using System.Threading.Tasks; namespace Contracts.ViewModels { - public class UserViewModel - { - public Guid Id { get; set; } - public string FirstName { get; set; } = string.Empty; - public string SecondName { get; set; } = string.Empty; - public string Email { get; set; } = string.Empty; - public DateTime Birthday { get; set; } - public RoleViewModel Role { get; set; } = null!; - } + public class UserViewModel + { + public Guid Id { get; set; } + public string FirstName { get; set; } = string.Empty; + public string SecondName { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public DateTime Birthday { get; set; } + public bool OnlyImportantMails { get; set; } + public RoleViewModel Role { get; set; } = null!; + } } \ No newline at end of file diff --git a/DataModels/Models/IUser.cs b/DataModels/Models/IUser.cs index 9eb2ef6..fb5020d 100644 --- a/DataModels/Models/IUser.cs +++ b/DataModels/Models/IUser.cs @@ -6,12 +6,13 @@ using System.Threading.Tasks; namespace DataModels.Models { - public interface IUser : IId - { - string FirstName { get; } - string SecondName { get; } - string PasswordHash { get; } - string Email { get; } - DateTime Birthday { get; } - } + public interface IUser : IId + { + string FirstName { get; } + string SecondName { get; } + string PasswordHash { get; } + string Email { get; } + DateTime Birthday { get; } + bool OnlyImportantMails { get; } + } } \ No newline at end of file diff --git a/DatabaseImplement/Implements/UserStorage.cs b/DatabaseImplement/Implements/UserStorage.cs index fdbdf0a..2755bbf 100644 --- a/DatabaseImplement/Implements/UserStorage.cs +++ b/DatabaseImplement/Implements/UserStorage.cs @@ -12,98 +12,99 @@ using System.Threading.Tasks; namespace DatabaseImplement.Implements { - public class UserStorage : IUserStorage - { - public UserBindingModel? Delete(UserSearchModel model) - { - if (model.Id is null && model.Email is null) - { - return null; - } + public class UserStorage : IUserStorage + { + public UserBindingModel? Delete(UserSearchModel model) + { + if (model.Id is null && model.Email is null) + { + return null; + } - var context = new Database(); - var user = context.Users.FirstOrDefault(u => - (model.Id.HasValue && u.Id == model.Id) - || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email))); + var context = new Database(); + var user = context.Users.FirstOrDefault(u => + (model.Id.HasValue && u.Id == model.Id) + || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email))); - if (user is null) - { - return null; - } - context.Remove(user); - context.SaveChanges(); + if (user is null) + { + return null; + } + context.Remove(user); + context.SaveChanges(); - return user.GetBindingModel(); - } + return user.GetBindingModel(); + } - public UserBindingModel? GetElement(UserSearchModel model) - { - if (model.Id is null && model.Email is null) - { - return null; - } - var context = new Database(); - return context.Users - .Include(u => u.Role) - .FirstOrDefault(u => - (model.Id.HasValue && u.Id == model.Id) - || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email))) - ?.GetBindingModel(); - } + public UserBindingModel? GetElement(UserSearchModel model) + { + if (model.Id is null && model.Email is null) + { + return null; + } + var context = new Database(); + return context.Users + .Include(u => u.Role) + .FirstOrDefault(u => + (model.Id.HasValue && u.Id == model.Id) + || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email))) + ?.GetBindingModel(); + } - public IEnumerable GetList(UserSearchModel? model) - { - var context = new Database(); - if (model is null) - { - return context.Users - .Include(u => u.Role) - .Select(r => r.GetBindingModel()); - } - if (model.Id is null && model.Email is null) - { - return []; - } - return context.Users - .Where(u => - (model.Id.HasValue && u.Id == model.Id) - || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email))) - .Include(u => u.Role) - .Select(r => r.GetBindingModel()); - } + public IEnumerable GetList(UserSearchModel? model) + { + var context = new Database(); + if (model is null) + { + return context.Users + .Include(u => u.Role) + .Select(r => r.GetBindingModel()); + } + if (model.Id is null && model.Email is null && !model.OnlyImportantMails is null) + { + return []; + } + return context.Users + .Where(u => + (model.Id.HasValue && u.Id == model.Id) + || (!string.IsNullOrEmpty(u.Email) && u.Email.Contains(model.Email)) + || (model.OnlyImportantMails.HasValue && u.OnlyImportantMails == model.OnlyImportantMails)) + .Include(u => u.Role) + .Select(r => r.GetBindingModel()); + } - public UserBindingModel? Insert(UserBindingModel model) - { - var context = new Database(); - var role = context.Roles.FirstOrDefault(r => r.Id == model.Role.Id); - if (role is null) - { - return null; - } - var newUser = Models.User.ToUserFromBinding(model, role); + public UserBindingModel? Insert(UserBindingModel model) + { + var context = new Database(); + var role = context.Roles.FirstOrDefault(r => r.Id == model.Role.Id); + if (role is null) + { + return null; + } + var newUser = Models.User.ToUserFromBinding(model, role); - context.Users.Add(newUser); - context.SaveChanges(); + context.Users.Add(newUser); + context.SaveChanges(); - return newUser.GetBindingModel(); - } + return newUser.GetBindingModel(); + } - public UserBindingModel? Update(UserBindingModel model) - { - var context = new Database(); - var user = context.Users - .FirstOrDefault(u => u.Id == model.Id); - var role = context.Roles.FirstOrDefault(r => r.Id == model.Role.Id); + public UserBindingModel? Update(UserBindingModel model) + { + var context = new Database(); + var user = context.Users + .FirstOrDefault(u => u.Id == model.Id); + var role = context.Roles.FirstOrDefault(r => r.Id == model.Role.Id); - if (user is null || role is null) - { - return null; - } + if (user is null || role is null) + { + return null; + } - user.Update(model, role); + user.Update(model, role); - context.SaveChanges(); - return user.GetBindingModel(); - } - } + context.SaveChanges(); + return user.GetBindingModel(); + } + } } \ No newline at end of file diff --git a/DatabaseImplement/Migrations/20240622162300_second.Designer.cs b/DatabaseImplement/Migrations/20240622162300_second.Designer.cs new file mode 100644 index 0000000..7c32992 --- /dev/null +++ b/DatabaseImplement/Migrations/20240622162300_second.Designer.cs @@ -0,0 +1,326 @@ +// +using System; +using DatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace DatabaseImplement.Migrations +{ + [DbContext(typeof(Database))] + [Migration("20240622162300_second")] + partial class second + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("DatabaseImplement.Models.MediaFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Location") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("MediaFiles"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Product", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Amount") + .HasColumnType("integer"); + + b.Property("IsBeingSold") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("Rate") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Purchase", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DatePurchase") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Purchases"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Sell", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DateSell") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Sells"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supplier", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Deals") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Suppliers"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplierProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("SupplierId"); + + b.ToTable("SupplierProducts"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SupplierId"); + + b.ToTable("Supplies"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplyProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("SupplyId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("SupplyId"); + + b.ToTable("SupplyProducts"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Birthday") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("OnlyImportantMails") + .HasColumnType("boolean"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.Property("SecondName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplierProduct", b => + { + b.HasOne("DatabaseImplement.Models.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DatabaseImplement.Models.Supplier", "Supplier") + .WithMany("Products") + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.HasOne("DatabaseImplement.Models.Supplier", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplyProduct", b => + { + b.HasOne("DatabaseImplement.Models.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DatabaseImplement.Models.Supply", "Supply") + .WithMany("Products") + .HasForeignKey("SupplyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + + b.Navigation("Supply"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.User", b => + { + b.HasOne("DatabaseImplement.Models.Role", "Role") + .WithMany() + .HasForeignKey("RoleId"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supplier", b => + { + b.Navigation("Products"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.Navigation("Products"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DatabaseImplement/Migrations/20240622162300_second.cs b/DatabaseImplement/Migrations/20240622162300_second.cs new file mode 100644 index 0000000..a0bb6ac --- /dev/null +++ b/DatabaseImplement/Migrations/20240622162300_second.cs @@ -0,0 +1,221 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DatabaseImplement.Migrations +{ + /// + public partial class second : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "OnlyImportantMails", + table: "Users", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.CreateTable( + name: "MediaFiles", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + Location = table.Column(type: "text", nullable: false), + ProductId = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_MediaFiles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Products", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + Price = table.Column(type: "double precision", nullable: false), + Rate = table.Column(type: "double precision", nullable: false), + IsBeingSold = table.Column(type: "boolean", nullable: false), + Amount = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Products", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Purchases", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + DatePurchase = table.Column(type: "timestamp with time zone", nullable: false), + Status = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Purchases", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Sells", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + DateSell = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Sells", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Suppliers", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + Deals = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Suppliers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "SupplierProducts", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SupplierId = table.Column(type: "uuid", nullable: false), + ProductId = table.Column(type: "uuid", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SupplierProducts", x => x.Id); + table.ForeignKey( + name: "FK_SupplierProducts_Products_ProductId", + column: x => x.ProductId, + principalTable: "Products", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SupplierProducts_Suppliers_SupplierId", + column: x => x.SupplierId, + principalTable: "Suppliers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Supplies", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + Price = table.Column(type: "double precision", nullable: false), + SupplierId = table.Column(type: "uuid", nullable: false), + Date = table.Column(type: "timestamp with time zone", nullable: false), + Status = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Supplies", x => x.Id); + table.ForeignKey( + name: "FK_Supplies_Suppliers_SupplierId", + column: x => x.SupplierId, + principalTable: "Suppliers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SupplyProducts", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SupplyId = table.Column(type: "uuid", nullable: false), + ProductId = table.Column(type: "uuid", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SupplyProducts", x => x.Id); + table.ForeignKey( + name: "FK_SupplyProducts_Products_ProductId", + column: x => x.ProductId, + principalTable: "Products", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SupplyProducts_Supplies_SupplyId", + column: x => x.SupplyId, + principalTable: "Supplies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_SupplierProducts_ProductId", + table: "SupplierProducts", + column: "ProductId"); + + migrationBuilder.CreateIndex( + name: "IX_SupplierProducts_SupplierId", + table: "SupplierProducts", + column: "SupplierId"); + + migrationBuilder.CreateIndex( + name: "IX_Supplies_SupplierId", + table: "Supplies", + column: "SupplierId"); + + migrationBuilder.CreateIndex( + name: "IX_SupplyProducts_ProductId", + table: "SupplyProducts", + column: "ProductId"); + + migrationBuilder.CreateIndex( + name: "IX_SupplyProducts_SupplyId", + table: "SupplyProducts", + column: "SupplyId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "MediaFiles"); + + migrationBuilder.DropTable( + name: "Purchases"); + + migrationBuilder.DropTable( + name: "Sells"); + + migrationBuilder.DropTable( + name: "SupplierProducts"); + + migrationBuilder.DropTable( + name: "SupplyProducts"); + + migrationBuilder.DropTable( + name: "Products"); + + migrationBuilder.DropTable( + name: "Supplies"); + + migrationBuilder.DropTable( + name: "Suppliers"); + + migrationBuilder.DropColumn( + name: "OnlyImportantMails", + table: "Users"); + } + } +} diff --git a/DatabaseImplement/Migrations/DatabaseModelSnapshot.cs b/DatabaseImplement/Migrations/DatabaseModelSnapshot.cs index 875158d..80c3363 100644 --- a/DatabaseImplement/Migrations/DatabaseModelSnapshot.cs +++ b/DatabaseImplement/Migrations/DatabaseModelSnapshot.cs @@ -22,6 +22,72 @@ namespace DatabaseImplement.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + modelBuilder.Entity("DatabaseImplement.Models.MediaFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Location") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("MediaFiles"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Product", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Amount") + .HasColumnType("integer"); + + b.Property("IsBeingSold") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("Rate") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Purchase", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DatePurchase") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Purchases"); + }); + modelBuilder.Entity("DatabaseImplement.Models.Role", b => { b.Property("Id") @@ -37,6 +103,115 @@ namespace DatabaseImplement.Migrations b.ToTable("Roles"); }); + modelBuilder.Entity("DatabaseImplement.Models.Sell", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DateSell") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Sells"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supplier", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Deals") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Suppliers"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplierProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("SupplierId"); + + b.ToTable("SupplierProducts"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SupplierId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("SupplierId"); + + b.ToTable("Supplies"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplyProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("ProductId") + .HasColumnType("uuid"); + + b.Property("SupplyId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProductId"); + + b.HasIndex("SupplyId"); + + b.ToTable("SupplyProducts"); + }); + modelBuilder.Entity("DatabaseImplement.Models.User", b => { b.Property("Id") @@ -54,6 +229,9 @@ namespace DatabaseImplement.Migrations .IsRequired() .HasColumnType("text"); + b.Property("OnlyImportantMails") + .HasColumnType("boolean"); + b.Property("PasswordHash") .IsRequired() .HasColumnType("text"); @@ -72,6 +250,55 @@ namespace DatabaseImplement.Migrations b.ToTable("Users"); }); + modelBuilder.Entity("DatabaseImplement.Models.SupplierProduct", b => + { + b.HasOne("DatabaseImplement.Models.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DatabaseImplement.Models.Supplier", "Supplier") + .WithMany("Products") + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.HasOne("DatabaseImplement.Models.Supplier", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Supplier"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.SupplyProduct", b => + { + b.HasOne("DatabaseImplement.Models.Product", "Product") + .WithMany() + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("DatabaseImplement.Models.Supply", "Supply") + .WithMany("Products") + .HasForeignKey("SupplyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + + b.Navigation("Supply"); + }); + modelBuilder.Entity("DatabaseImplement.Models.User", b => { b.HasOne("DatabaseImplement.Models.Role", "Role") @@ -80,6 +307,16 @@ namespace DatabaseImplement.Migrations b.Navigation("Role"); }); + + modelBuilder.Entity("DatabaseImplement.Models.Supplier", b => + { + b.Navigation("Products"); + }); + + modelBuilder.Entity("DatabaseImplement.Models.Supply", b => + { + b.Navigation("Products"); + }); #pragma warning restore 612, 618 } } diff --git a/DatabaseImplement/Models/User.cs b/DatabaseImplement/Models/User.cs index a2f2ecf..4de0fd1 100644 --- a/DatabaseImplement/Models/User.cs +++ b/DatabaseImplement/Models/User.cs @@ -4,6 +4,7 @@ using Contracts.ViewModels; using DataModels.Models; using System; using System.Collections.Generic; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; @@ -11,72 +12,77 @@ using System.Threading.Tasks; namespace DatabaseImplement.Models { - public class User : IUser - { - public Guid Id { get; set; } + public class User : IUser + { + public Guid Id { get; set; } - [Required] - public string FirstName { get; set; } = string.Empty; + [Required] + public string FirstName { get; set; } = string.Empty; - [Required] - public string SecondName { get; set; } = string.Empty; + [Required] + public string SecondName { get; set; } = string.Empty; - [Required] - public string PasswordHash { get; set; } = string.Empty; + [Required] + public string PasswordHash { get; set; } = string.Empty; - [Required] - public string Email { get; set; } = string.Empty; + [Required] + public string Email { get; set; } = string.Empty; - [Required] - public DateTime Birthday { get; set; } + [Required] + public DateTime Birthday { get; set; } - public Role? Role { get; set; } + public Role? Role { get; set; } - public UserBindingModel GetBindingModel() => new() - { - Id = Id, - FirstName = FirstName, - SecondName = SecondName, - Email = Email, - PasswordHash = PasswordHash, - Birthday = Birthday, - Role = Role?.GetBindingModel() ?? new() - }; + public bool OnlyImportantMails { get; set; } = false; - public static User ToUserFromView(UserViewModel model, Role role) => new() - { - Id = model.Id, - FirstName = model.FirstName, - SecondName = model.SecondName, - Email = model.Email, - Birthday = model.Birthday, - Role = role - }; + public UserBindingModel GetBindingModel() => new() + { + Id = Id, + FirstName = FirstName, + SecondName = SecondName, + Email = Email, + PasswordHash = PasswordHash, + Birthday = Birthday, + OnlyImportantMails = OnlyImportantMails, + Role = Role?.GetBindingModel() ?? new() + }; - public static User ToUserFromBinding(UserBindingModel model, Role role) => new() - { - Id = model.Id, - FirstName = model.FirstName, - SecondName = model.SecondName, - Email = model.Email, - PasswordHash = model.PasswordHash, - Birthday = model.Birthday, - Role = role - }; + public static User ToUserFromView(UserViewModel model, Role role) => new() + { + Id = model.Id, + FirstName = model.FirstName, + SecondName = model.SecondName, + Email = model.Email, + Birthday = model.Birthday, + Role = role + }; - public void Update(UserBindingModel model, Role role) - { - if (model is null) - { - throw new ArgumentNullException("Update user: binding model is null"); - } + public static User ToUserFromBinding(UserBindingModel model, Role role) => new() + { + Id = model.Id, + FirstName = model.FirstName, + SecondName = model.SecondName, + Email = model.Email, + PasswordHash = model.PasswordHash, + Birthday = model.Birthday, + OnlyImportantMails = model.OnlyImportantMails, + Role = role + }; - Email = model.Email; - FirstName = model.FirstName; - SecondName = model.SecondName; - PasswordHash = model.PasswordHash; - Birthday = model.Birthday; - Role = role; - } - } + public void Update(UserBindingModel model, Role role) + { + if (model is null) + { + throw new ArgumentNullException("Update user: binding model is null"); + } + + Email = model.Email ?? Email; + FirstName = model.FirstName ?? FirstName; + SecondName = model.SecondName ?? SecondName; + PasswordHash = model.PasswordHash ?? PasswordHash; + Birthday = model.Birthday; + OnlyImportantMails = model.OnlyImportantMails; + Role = role ?? Role; + } + } } \ No newline at end of file diff --git a/WebApp/Pages/SignUp.cshtml b/WebApp/Pages/SignUp.cshtml index fb018dc..31c7539 100644 --- a/WebApp/Pages/SignUp.cshtml +++ b/WebApp/Pages/SignUp.cshtml @@ -74,6 +74,13 @@ +
+ + +
+