diff --git a/SushiBar/App.config b/SushiBar/App.config
index c20b6ab..9071b7d 100644
--- a/SushiBar/App.config
+++ b/SushiBar/App.config
@@ -1,11 +1,11 @@
-
+
-
-
+
+
diff --git a/SushiBarBusinessLogic/ClientLogic.cs b/SushiBarBusinessLogic/ClientLogic.cs
index 4e68d36..7879890 100644
--- a/SushiBarBusinessLogic/ClientLogic.cs
+++ b/SushiBarBusinessLogic/ClientLogic.cs
@@ -4,6 +4,7 @@ using SushiBarContracts.BusinessLogicsContracts;
using SushiBarContracts.SearchModel;
using SushiBarContracts.StoragesContracts;
using SushiBarContracts.ViewModels;
+using System.Text.RegularExpressions;
namespace SushiBarBusinessLogic
{
@@ -92,11 +93,11 @@ namespace SushiBarBusinessLogic
{
throw new ArgumentNullException("Invalid fullname of user", nameof(model.ClientFIO));
}
- if (string.IsNullOrEmpty(model.Email))
+ if (string.IsNullOrEmpty(model.Email) || !Regex.IsMatch(model.Email, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", RegexOptions.IgnoreCase))
{
throw new ArgumentNullException("Invalid email of user", nameof(model.Email));
}
- if (string.IsNullOrEmpty(model.Password))
+ if (string.IsNullOrEmpty(model.Password) || !Regex.IsMatch(model.Password, @"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$"))
{
throw new ArgumentNullException("Invalid password of user", nameof(model.Password));
}
diff --git a/SushiBarBusinessLogic/OrderLogic.cs b/SushiBarBusinessLogic/OrderLogic.cs
index cb5e22d..5c34234 100644
--- a/SushiBarBusinessLogic/OrderLogic.cs
+++ b/SushiBarBusinessLogic/OrderLogic.cs
@@ -62,11 +62,16 @@ namespace SushiBarBusinessLogic.BusinessLogic
CheckModel(model);
if (model.Status != OrderStatus.Неизвестен) return false;
model.Status = OrderStatus.Принят;
- if (_orderStorage.Insert(model) == null)
+
+ var order = _orderStorage.Insert(model);
+
+ if (order == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
+ var client = clientStorage.GetElement(new() { Id = order!.ClientId });
+ SendMail(client, order);
return true;
}
@@ -124,18 +129,19 @@ namespace SushiBarBusinessLogic.BusinessLogic
return false;
}
- var clientView = clientStorage.GetElement(new ClientSearchModel { Id = order.ClientId });
- if (clientView != null)
- SendMail(clientView, order);
+ var client = clientStorage.GetElement(new ClientSearchModel { Id = order.ClientId });
+ if (client != null)
+ SendMail(client, order);
return true;
}
- private void SendMail(ClientViewModel clientView, OrderViewModel orderView)
+ public void SendMail(ClientViewModel clientView, OrderViewModel orderView)
{
- if(clientView == null || orderView == null)
+ if(clientView == null && orderView == null)
{
return;
}
+
MailSendInfoBindingModel mailSendInfoBindingModel;
if(orderView.Status == OrderStatus.Принят)
diff --git a/SushiBarClientApp/Controllers/HomeController.cs b/SushiBarClientApp/Controllers/HomeController.cs
index 0b8589c..23d2aa2 100644
--- a/SushiBarClientApp/Controllers/HomeController.cs
+++ b/SushiBarClientApp/Controllers/HomeController.cs
@@ -145,8 +145,7 @@ namespace SushiBarClientApp.Controllers
{
return Redirect("~/Home/Enter");
}
- return
- View(APIClient.GetRequest>($"api/client/getmessages?clientId ={ APIClient.Client.Id}"));
+ return View(APIClient.GetRequest>($"api/client/getmessages?clientId ={ APIClient.Client.Id}"));
}
}
diff --git a/SushiBarClientApp/SushiBarClientApp.csproj b/SushiBarClientApp/SushiBarClientApp.csproj
index 117f7b0..3deaf26 100644
--- a/SushiBarClientApp/SushiBarClientApp.csproj
+++ b/SushiBarClientApp/SushiBarClientApp.csproj
@@ -6,10 +6,6 @@
enable
-
-
-
-
diff --git a/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.Designer.cs b/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.Designer.cs
new file mode 100644
index 0000000..e09f058
--- /dev/null
+++ b/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.Designer.cs
@@ -0,0 +1,298 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using SushiBarDatabaseImplement;
+
+#nullable disable
+
+namespace SushiBarDatabaseImplement.Migrations
+{
+ [DbContext(typeof(SushiBarDatabase))]
+ [Migration("20240505151023_forMistake")]
+ partial class forMistake
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.2")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Client", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ClientFIO")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Clients");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ComponentName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Cost")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.ToTable("Components");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Implementer", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ImplementerFIO")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Qualification")
+ .HasColumnType("int");
+
+ b.Property("WorkExperience")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("Implementers");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.MessageInfo", b =>
+ {
+ b.Property("MessageId")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("Body")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ClientId")
+ .HasColumnType("int");
+
+ b.Property("DateDelivery")
+ .HasColumnType("datetime2");
+
+ b.Property("SenderName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Subject")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("MessageId");
+
+ b.HasIndex("ClientId");
+
+ b.ToTable("Messages");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ClientId")
+ .HasColumnType("int");
+
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("DateCreate")
+ .HasColumnType("datetime2");
+
+ b.Property("DateImplement")
+ .HasColumnType("datetime2");
+
+ b.Property("ImplementerId")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("Sum")
+ .HasColumnType("float");
+
+ b.Property("SushiId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClientId");
+
+ b.HasIndex("ImplementerId");
+
+ b.HasIndex("SushiId");
+
+ b.ToTable("Orders");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Price")
+ .HasColumnType("float");
+
+ b.Property("SushiName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Sushis");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("ComponentId")
+ .HasColumnType("int");
+
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("SushiId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ComponentId");
+
+ b.HasIndex("SushiId");
+
+ b.ToTable("SushiComponents");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.MessageInfo", b =>
+ {
+ b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
+ .WithMany("Messages")
+ .HasForeignKey("ClientId");
+
+ b.Navigation("Client");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
+ {
+ b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
+ .WithMany("Orders")
+ .HasForeignKey("ClientId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("SushiBarDatabaseImplement.Models.Implementer", "Implementer")
+ .WithMany("Orders")
+ .HasForeignKey("ImplementerId");
+
+ b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
+ .WithMany("Orders")
+ .HasForeignKey("SushiId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Client");
+
+ b.Navigation("Implementer");
+
+ b.Navigation("Sushi");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b =>
+ {
+ b.HasOne("SushiBarDatabaseImplement.Models.Component", "Component")
+ .WithMany("SushiComponents")
+ .HasForeignKey("ComponentId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
+ .WithMany("Components")
+ .HasForeignKey("SushiId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Component");
+
+ b.Navigation("Sushi");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Client", b =>
+ {
+ b.Navigation("Messages");
+
+ b.Navigation("Orders");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b =>
+ {
+ b.Navigation("SushiComponents");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Implementer", b =>
+ {
+ b.Navigation("Orders");
+ });
+
+ modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
+ {
+ b.Navigation("Components");
+
+ b.Navigation("Orders");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.cs b/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.cs
new file mode 100644
index 0000000..b58697c
--- /dev/null
+++ b/SushiBarDatabaseImplement/Migrations/20240505151023_forMistake.cs
@@ -0,0 +1,22 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace SushiBarDatabaseImplement.Migrations
+{
+ ///
+ public partial class forMistake : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+
+ }
+ }
+}
diff --git a/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs b/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs
index 97ef770..e1e62a8 100644
--- a/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs
+++ b/SushiBarDatabaseImplement/Migrations/SushiBarDatabaseModelSnapshot.cs
@@ -216,7 +216,7 @@ namespace SushiBarDatabaseImplement.Migrations
modelBuilder.Entity("SushiBarDatabaseImplement.Models.MessageInfo", b =>
{
b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
- .WithMany()
+ .WithMany("Messages")
.HasForeignKey("ClientId");
b.Navigation("Client");
@@ -268,6 +268,8 @@ namespace SushiBarDatabaseImplement.Migrations
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Client", b =>
{
+ b.Navigation("Messages");
+
b.Navigation("Orders");
});
diff --git a/SushiBarDatabaseImplement/Models/Client.cs b/SushiBarDatabaseImplement/Models/Client.cs
index b550c3f..e911434 100644
--- a/SushiBarDatabaseImplement/Models/Client.cs
+++ b/SushiBarDatabaseImplement/Models/Client.cs
@@ -24,6 +24,9 @@ namespace SushiBarDatabaseImplement.Models
[ForeignKey("ClientId")]
public virtual List Orders { get; set; } = new();
+ [ForeignKey("ClientId")]
+ public virtual List Messages { get; set; } = new();
+
public static Client? Create(ClientBindingModel? model)
{
if (model == null)
diff --git a/SushiBarRestApi/Controllers/ClientController.cs b/SushiBarRestApi/Controllers/ClientController.cs
index d7ed15c..f1c78fa 100644
--- a/SushiBarRestApi/Controllers/ClientController.cs
+++ b/SushiBarRestApi/Controllers/ClientController.cs
@@ -63,6 +63,7 @@ namespace SushiBarRestApi.Controllers
}
}
+ [HttpGet]
public List? GetMessages(int clientId)
{
try
diff --git a/SushiBarRestApi/Program.cs b/SushiBarRestApi/Program.cs
index 50a5381..b791835 100644
--- a/SushiBarRestApi/Program.cs
+++ b/SushiBarRestApi/Program.cs
@@ -21,7 +21,7 @@ builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
-builder.Services.AddTransient();
+builder.Services.AddSingleton();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
@@ -29,7 +29,7 @@ builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
- Title = "AbstractShopRestApi",
+ Title = "SushiBarRestApi",
Version = "v1"
});
});
@@ -48,7 +48,7 @@ mailSender?.MailConfig(new MailConfigBindingModel
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
- app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "AbstractShopRestApi v1"));
+ app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SushiBarRestApi v1"));
}
app.UseHttpsRedirection();
app.UseAuthorization();
diff --git a/SushiBarRestApi/appsettings.json b/SushiBarRestApi/appsettings.json
index efa4a62..53d95f6 100644
--- a/SushiBarRestApi/appsettings.json
+++ b/SushiBarRestApi/appsettings.json
@@ -6,10 +6,10 @@
}
},
"AllowedHosts": "*",
- "SmtpClientHost": "smtp.gmail.com",
+ "SmtpClientHost": "smtp.mail.com",
"SmtpClientPort": "587",
"PopHost": "pop.gmail.com",
"PopPort": "995",
- "MailLogin": "labwork15kafis@gmail.com",
- "MailPassword": "passlab15"
+ "MailLogin": "qwertyelenatimakova@gmail.com",
+ "MailPassword": "616Lena!"
}