diff --git a/BusinessLogic/BusinessLogic.csproj b/BusinessLogic/BusinessLogic.csproj
index c105ec7..ceab2d9 100644
--- a/BusinessLogic/BusinessLogic.csproj
+++ b/BusinessLogic/BusinessLogic.csproj
@@ -7,12 +7,13 @@
-
+
+
diff --git a/BusinessLogic/BusinessLogic/UserLogic.cs b/BusinessLogic/BusinessLogic/UserLogic.cs
index b028660..c2f21ba 100644
--- a/BusinessLogic/BusinessLogic/UserLogic.cs
+++ b/BusinessLogic/BusinessLogic/UserLogic.cs
@@ -1,4 +1,6 @@
using BusinessLogic.Tools;
+using BusinessLogic.Tools.Mail;
+using BusinessLogic.Tools.Mail.MailTemplates;
using Contracts.BindingModels;
using Contracts.BusinessLogicContracts;
using Contracts.Converters;
@@ -39,6 +41,8 @@ namespace BusinessLogic.BusinessLogic
throw new Exception("Insert operation failed.");
}
+ MailSender.Send(new MailRegistration(user));
+
return UserConverter.ToView(user);
}
@@ -52,6 +56,7 @@ namespace BusinessLogic.BusinessLogic
{
throw new ElementNotFoundException();
}
+ MailSender.Send(new MailDeleteUser(user));
return UserConverter.ToView(user);
}
@@ -99,10 +104,13 @@ namespace BusinessLogic.BusinessLogic
{
throw new Exception("Update operation failed.");
}
+
+ MailSender.Send(new MailUpdateUserData(user));
+
return UserConverter.ToView(user);
}
- public UserViewModel Login(string email, string password)
+ public string Login(string email, string password)
{
if (email is null)
{
@@ -120,7 +128,7 @@ namespace BusinessLogic.BusinessLogic
{
throw new AccountException("The passwords don't match.");
}
- return UserConverter.ToView(user);
+ return JwtProvider.Generate(user);
}
public void _validatePassword(string? password)
diff --git a/BusinessLogic/Tools/JwtOptions.cs b/BusinessLogic/Tools/JwtOptions.cs
new file mode 100644
index 0000000..7327dd0
--- /dev/null
+++ b/BusinessLogic/Tools/JwtOptions.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BusinessLogic.Tools
+{
+ public class JwtOptions
+ {
+ public string SecretKey { get; set; } = null!;
+ public short ExpiresHours { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/JwtProvider.cs b/BusinessLogic/Tools/JwtProvider.cs
new file mode 100644
index 0000000..525d74d
--- /dev/null
+++ b/BusinessLogic/Tools/JwtProvider.cs
@@ -0,0 +1,46 @@
+using Contracts.BindingModels;
+using Contracts.ViewModels;
+using Microsoft.IdentityModel.Tokens;
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BusinessLogic.Tools
+{
+ public class JwtProvider
+ {
+ private static string _key;
+
+ private static int _expiresHours;
+
+ public static string Generate(UserBindingModel user)
+ {
+ var signingCredentials = new SigningCredentials(
+ new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key)),
+ SecurityAlgorithms.HmacSha256);
+
+ Claim[] claims = [
+ new("userId", user.Id.ToString()),
+ new("role", user.Role.Name)
+ ];
+
+ var token = new JwtSecurityToken(signingCredentials: signingCredentials,
+ expires: DateTime.UtcNow.AddHours(_expiresHours),
+ claims: claims);
+
+ var stringToken = new JwtSecurityTokenHandler().WriteToken(token);
+ return stringToken;
+ }
+
+ public void SetupJwtOptions(JwtOptions options)
+ {
+ _key = options.SecretKey;
+ _expiresHours = options.ExpiresHours;
+ }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/Mail.cs b/BusinessLogic/Tools/Mail/Mail.cs
new file mode 100644
index 0000000..5adba23
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/Mail.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+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!;
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/MailOptions.cs b/BusinessLogic/Tools/Mail/MailOptions.cs
new file mode 100644
index 0000000..98a6920
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/MailOptions.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BusinessLogic.Tools.Mail
+{
+ public class MailOptions
+ {
+ public string Email { get; set; } = null!;
+ public string Password { get; set; } = null!;
+ public string SmtpClientHost { get; set; } = null!;
+ public short SmtpClientPort { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/MailSender.cs b/BusinessLogic/Tools/Mail/MailSender.cs
new file mode 100644
index 0000000..329b392
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/MailSender.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Mail;
+using System.Text;
+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 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;
+
+ using MailMessage message = new MailMessage();
+
+ message.From = new MailAddress(_email);
+ foreach (string to in mail.To)
+ {
+ message.To.Add(to);
+ }
+
+ message.Subject = mail.Title;
+ message.Body = mail.Body;
+
+ client.Send(message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/MailTemplates/MailDeleteUser.cs b/BusinessLogic/Tools/Mail/MailTemplates/MailDeleteUser.cs
new file mode 100644
index 0000000..2a1bef8
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/MailTemplates/MailDeleteUser.cs
@@ -0,0 +1,20 @@
+using Contracts.BindingModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BusinessLogic.Tools.Mail.MailTemplates
+{
+ public class MailDeleteUser : Mail
+ {
+ public MailDeleteUser(UserBindingModel user)
+ {
+ To = [user.Email];
+ Title = "Ваш аккаунт был удален!";
+ Body = $"Уважаемый {user.SecondName} {user.FirstName}, Ваш аккаунт был удален навсегда насовсем.\n" +
+ $"Если это были не Вы... Тут уже ничего не поможет, приносим наши извинения.";
+ }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs b/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs
new file mode 100644
index 0000000..fdd33d9
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/MailTemplates/MailRegistration.cs
@@ -0,0 +1,21 @@
+using Contracts.BindingModels;
+using Contracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+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" +
+ $"Надеемся, что Вам что-то уже приглянулось!";
+ }
+ }
+}
\ No newline at end of file
diff --git a/BusinessLogic/Tools/Mail/MailTemplates/MailUpdateUserData.cs b/BusinessLogic/Tools/Mail/MailTemplates/MailUpdateUserData.cs
new file mode 100644
index 0000000..4508583
--- /dev/null
+++ b/BusinessLogic/Tools/Mail/MailTemplates/MailUpdateUserData.cs
@@ -0,0 +1,20 @@
+using Contracts.BindingModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BusinessLogic.Tools.Mail.MailTemplates
+{
+ public class MailUpdateUserData : Mail
+ {
+ public MailUpdateUserData(UserBindingModel user)
+ {
+ To = [user.Email];
+ Title = "Данные пользователя были обновлены!";
+ Body = $"Уважаемый {user.SecondName} {user.FirstName}, Ваши данные были обвновлены.\n" +
+ $"Если это были не Вы, то что поделать, Вам придется менять пароль.";
+ }
+ }
+}
\ No newline at end of file
diff --git a/Contracts/BusinessLogicContracts/IUserLogic.cs b/Contracts/BusinessLogicContracts/IUserLogic.cs
index fdcc510..dc5c87a 100644
--- a/Contracts/BusinessLogicContracts/IUserLogic.cs
+++ b/Contracts/BusinessLogicContracts/IUserLogic.cs
@@ -12,7 +12,7 @@ namespace Contracts.BusinessLogicContracts
{
public interface IUserLogic
{
- UserViewModel Login(string email, string password);
+ string Login(string email, string password);
UserViewModel Create(UserBindingModel model);
diff --git a/RestAPI/Controllers/UserController.cs b/RestAPI/Controllers/UserController.cs
index bbeb162..57d6eee 100644
--- a/RestAPI/Controllers/UserController.cs
+++ b/RestAPI/Controllers/UserController.cs
@@ -56,13 +56,11 @@ namespace RestAPI.Controllers
catch (AccountException ex)
{
_logger.LogWarning(ex, "Wrong registration data");
- throw;
return Results.BadRequest(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error create user");
- throw;
return Results.Problem(ex.Message);
}
}
diff --git a/RestAPI/Program.cs b/RestAPI/Program.cs
index 6fbbd7c..1e6c8aa 100644
--- a/RestAPI/Program.cs
+++ b/RestAPI/Program.cs
@@ -1,9 +1,12 @@
using BusinessLogic.BusinessLogic;
+using BusinessLogic.Tools;
+using BusinessLogic.Tools.Mail;
using Contracts.BusinessLogicContracts;
using Contracts.StorageContracts;
using DatabaseImplement.Implements;
using Microsoft.OpenApi.Models;
using System;
+using System.Net.Mail;
const string VERSION = "v1";
const string TITLE = "21GunsRestAPI";
@@ -21,6 +24,9 @@ builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
+builder.Services.AddSingleton();
+builder.Services.AddSingleton();
+
#endregion DI
builder.Services.AddControllers();
@@ -32,6 +38,26 @@ builder.Services.AddSwaggerGen(c =>
});
var app = builder.Build();
+var jwtProvider = app.Services.GetService();
+var mailSender = app.Services.GetService();
+
+#region Setup config
+
+string? getSection(string section) => builder.Configuration?.GetSection(section)?.Value?.ToString();
+jwtProvider?.SetupJwtOptions(new()
+{
+ SecretKey = getSection("JwtOptions:SecretKey") ?? string.Empty,
+ ExpiresHours = Convert.ToInt16(getSection("JwtOptions:ExpiresHours"))
+});
+mailSender?.SetupMailOptions(new()
+{
+ Email = getSection("MailOptions:Email") ?? string.Empty,
+ Password = getSection("MailOptions:Password") ?? string.Empty,
+ SmtpClientHost = getSection("MailOptions:SmtpClientHost") ?? string.Empty,
+ SmtpClientPort = Convert.ToInt16(getSection("MailOptions:SmtpClientPort"))
+});
+
+#endregion Setup config
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
diff --git a/RestAPI/appsettings.json b/RestAPI/appsettings.json
index 10f68b8..51c1d26 100644
--- a/RestAPI/appsettings.json
+++ b/RestAPI/appsettings.json
@@ -5,5 +5,15 @@
"Microsoft.AspNetCore": "Warning"
}
},
+ "JwtOptions": {
+ "SecretKey": "secretkey_secretkey_secretkey_secretkey",
+ "ExpiresHours": 24
+ },
+ "MailOptions": {
+ "Email": "21.guns.site@gmail.com",
+ "Password": "tiss lpgf nhap qnfc",
+ "SmtpClientHost": "smtp.gmail.com",
+ "SmtpClientPort": "587"
+ },
"AllowedHosts": "*"
-}
+}
\ No newline at end of file