EmailMessage fixes;

This commit is contained in:
jozsef.b@aycode.com 2024-04-24 19:34:02 +02:00
parent a8e835b252
commit ae741bc6a7
12 changed files with 136 additions and 130 deletions

View File

@ -1,15 +1,20 @@
using System.Collections.Specialized; using System.Collections.Specialized;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using AyCode.Entities.Messages;
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using AyCode.Interfaces.TimeStampInfo; using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
namespace TIAM.Entities.Emails; namespace TIAM.Entities.Emails;
public interface IMessageSenderService
{
public Task<string> SendMessageAsync<TEmailMessage>(TEmailMessage message, int messageType) where TEmailMessage : EmailMessage;
}
[Table(nameof(EmailMessage))] [Table(nameof(EmailMessage))]
public class EmailMessage : NoticeBase, IEntityGuid, ITimeStampInfo, IEmailRecipientsRelation, IEmailAddress public class EmailMessage : IEntityGuid, ITimeStampInfo, IEmailRecipientsRelation, IEmailAddress
{ {
public EmailMessage() public EmailMessage()
{ {

View File

@ -14,16 +14,16 @@ namespace TIAMMobileApp.Services
{ {
public class UserDataServiceMobile : IUserDataService public class UserDataServiceMobile : IUserDataService
{ {
private readonly HttpClient http; private readonly HttpClient _http;
private readonly ISecureStorageHandler secureStorageHandler; private readonly ISecureStorageHandler _secureStorageHandler;
private readonly IServiceProviderDataService _serviceProviderDataService; private readonly IServiceProviderDataService _serviceProviderDataService;
public Dictionary<int, string> userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public Dictionary<int, string> userRoleTypes { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public UserDataServiceMobile(HttpClient http, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService) public UserDataServiceMobile(HttpClient http, ISecureStorageHandler secureStorageHandler, IServiceProviderDataService serviceProviderDataService)
{ {
this.http = http; this._http = http;
this.secureStorageHandler = secureStorageHandler; this._secureStorageHandler = secureStorageHandler;
_serviceProviderDataService = serviceProviderDataService; _serviceProviderDataService = serviceProviderDataService;
} }
@ -45,7 +45,7 @@ namespace TIAMMobileApp.Services
public async Task<UserSessionModel> IsLoggedInAsync(Guid id) public async Task<UserSessionModel> IsLoggedInAsync(Guid id)
{ {
var userModelDto = await GetUserByIdAsync(id); var userModelDto = await GetUserDetailByIdAsync(id);
if (userModelDto != null) if (userModelDto != null)
{ {
@ -62,10 +62,10 @@ namespace TIAMMobileApp.Services
} }
} }
public async Task<string> TestUserApi(int Param) public async Task<string> TestUserApi(int param)
{ {
var url = APIUrls.UserTest; var url = APIUrls.UserTest;
var response = await http.PostAsJsonAsync(url, Param); var response = await _http.PostAsJsonAsync(url, param);
var result = await response.Content.ReadAsStringAsync(); var result = await response.Content.ReadAsStringAsync();
return result; return result;
} }
@ -75,10 +75,10 @@ namespace TIAMMobileApp.Services
string result = string.Empty; var result = string.Empty;
var url = APIUrls.AuthenticateUser; var url = APIUrls.AuthenticateUser;
var response = await http.PostAsJsonAsync(url, loginModel); var response = await _http.PostAsJsonAsync(url, loginModel);
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
{ {
@ -98,11 +98,11 @@ namespace TIAMMobileApp.Services
public async Task<(bool isSuccess, string ErrorMessage)> CreateUser(RegistrationModel regModel) public async Task<(bool isSuccess, string ErrorMessage)> CreateUser(RegistrationModel regModel)
{ {
bool isSuccess = true; var isSuccess = true;
string result = string.Empty; var result = string.Empty;
var url = APIUrls.CreateUser; var url = APIUrls.CreateUser;
var response = await http.PostAsJsonAsync(url, regModel); var response = await _http.PostAsJsonAsync(url, regModel);
result = await response.Content.ReadAsStringAsync(); result = await response.Content.ReadAsStringAsync();
/*if (response.IsSuccessStatusCode) /*if (response.IsSuccessStatusCode)
{ {
@ -122,12 +122,12 @@ namespace TIAMMobileApp.Services
public async Task<(bool isSuccess, UserModelDto? user)> CreateGuestUser(RegistrationModel regModel) public async Task<(bool isSuccess, UserModelDto? user)> CreateGuestUser(RegistrationModel regModel)
{ {
bool isSuccess = false; var isSuccess = false;
string result = string.Empty; var result = string.Empty;
UserModelDto? user; UserModelDto? user;
var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreateGuestUser}"; var url = $"{Setting.ApiBaseUrl}/{APIUrls.CreateGuestUser}";
var response = await http.PostAsJsonAsync(url, regModel); var response = await _http.PostAsJsonAsync(url, regModel);
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
@ -149,18 +149,18 @@ namespace TIAMMobileApp.Services
public async Task<List<UserModelDto>?> GetUsersAsync() public async Task<List<UserModelDto>?> GetUsersAsync()
{ {
return await http.GetFromJsonAsync<List<UserModelDto>>(APIUrls.GetUsers); return await _http.GetFromJsonAsync<List<UserModelDto>>(APIUrls.GetUsers);
} }
public async Task<List<UserModelDtoDetail>?> GetUsersWithDetailsAsync() public async Task<List<UserModelDtoDetail>?> GetUsersWithDetailsAsync()
{ {
return await http.GetFromJsonAsync<List<UserModelDtoDetail>>(APIUrls.GetUsersWithDetails); return await _http.GetFromJsonAsync<List<UserModelDtoDetail>>(APIUrls.GetUsersWithDetails);
} }
public async Task<UserModelDto?> GetUserByEmailAsync(string email) public async Task<UserModelDto?> GetUserByEmailAsync(string email)
{ {
var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserByEmail}"; var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserByEmail}";
var response = await http.PostAsJsonAsync(url, email); var response = await _http.PostAsJsonAsync(url, email);
var result = await response.Content.ReadAsStringAsync(); var result = await response.Content.ReadAsStringAsync();
var user = JsonConvert.DeserializeObject<UserModelDto>(result); var user = JsonConvert.DeserializeObject<UserModelDto>(result);
return user; return user;
@ -170,7 +170,7 @@ namespace TIAMMobileApp.Services
var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserById}"; var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserById}";
//logToBrowserConsole.LogToBC("GetUserByIdAsync url: " + url + ", " + id.ToString()); //logToBrowserConsole.LogToBC("GetUserByIdAsync url: " + url + ", " + id.ToString());
var response = await http.PostAsJsonAsync(url, id); var response = await _http.PostAsJsonAsync(url, id);
var result = await response.Content.ReadAsStringAsync(); var result = await response.Content.ReadAsStringAsync();
var user = JsonConvert.DeserializeObject<UserModelDto>(result); var user = JsonConvert.DeserializeObject<UserModelDto>(result);
@ -179,7 +179,7 @@ namespace TIAMMobileApp.Services
public async Task<bool> RefreshToken() public async Task<bool> RefreshToken()
{ {
bool isTokenRefreshed = false; var isTokenRefreshed = false;
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
var url = APIUrls.RefreshToken; var url = APIUrls.RefreshToken;
@ -195,7 +195,7 @@ namespace TIAMMobileApp.Services
var response = await client.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json")); var response = await client.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json"));
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
{ {
string contentStr = await response.Content.ReadAsStringAsync(); var contentStr = await response.Content.ReadAsStringAsync();
var mainResponse = JsonConvert.DeserializeObject<MainResponse>(contentStr); var mainResponse = JsonConvert.DeserializeObject<MainResponse>(contentStr);
if (mainResponse.IsSuccess) if (mainResponse.IsSuccess)
{ {
@ -203,15 +203,15 @@ namespace TIAMMobileApp.Services
Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken; Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken;
Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken; Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken;
string userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails); var userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails);
await secureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr); await _secureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr);
isTokenRefreshed = true; isTokenRefreshed = true;
} }
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
string msg = ex.Message; var msg = ex.Message;
} }
@ -224,7 +224,7 @@ namespace TIAMMobileApp.Services
{ {
//TODO Finish this //TODO Finish this
//get the userModel's roles //get the userModel's roles
int role = userModel.UserRoles; var role = userModel.UserRoles;
foreach (var roleType in roleTypes) foreach (var roleType in roleTypes)
{ {
@ -245,7 +245,7 @@ namespace TIAMMobileApp.Services
var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserDetailById}"; var url = $"{Setting.ApiBaseUrl}/{APIUrls.GetUserDetailById}";
var response = await http.PostAsJsonAsync(url, id); var response = await _http.PostAsJsonAsync(url, id);
var result = await response.Content.ReadAsStringAsync(); var result = await response.Content.ReadAsStringAsync();
var user = JsonConvert.DeserializeObject<UserModelDtoDetail>(result); var user = JsonConvert.DeserializeObject<UserModelDtoDetail>(result);

View File

@ -1,5 +1,4 @@
@page "/user/products" @page "/user/products"
@using AyCode.Models.Messages
@using TIAM.Entities.ServiceProviders @using TIAM.Entities.ServiceProviders
@using TIAM.Resources @using TIAM.Resources
@using TIAMSharedUI.Pages.Components @using TIAMSharedUI.Pages.Components

View File

@ -1,5 +1,4 @@
@page "/user/transfers" @page "/user/transfers"
@using AyCode.Models.Messages
@using BlazorAnimation @using BlazorAnimation
@using TIAM.Core.Enums @using TIAM.Core.Enums
@using TIAM.Entities.ServiceProviders @using TIAM.Entities.ServiceProviders

View File

@ -1,5 +1,4 @@
@page "/user/users" @page "/user/users"
@using AyCode.Models.Messages
@using BlazorAnimation @using BlazorAnimation
@using TIAM.Core.Enums @using TIAM.Core.Enums
@using TIAM.Entities.Products @using TIAM.Entities.Products

View File

@ -1,5 +1,4 @@
@page "/user/destinations" @page "/user/destinations"
@using AyCode.Models.Messages
@using BlazorAnimation @using BlazorAnimation
@using TIAM.Entities.ServiceProviders @using TIAM.Entities.ServiceProviders
@using TIAM.Resources @using TIAM.Resources

View File

@ -23,11 +23,10 @@ using TIAMWebApp.Server.ModelsTIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Utility; using TIAMWebApp.Shared.Application.Utility;
using TIAM.Entities.Auctions; using TIAM.Entities.Auctions;
using AyCode.Interfaces.Messages; using AyCode.Interfaces.Messages;
using AyCode.Entities.Messages;
using TIAMWebApp.Shared.Application.Models.ClientSide.Messages; using TIAMWebApp.Shared.Application.Models.ClientSide.Messages;
using AyCode.Models.Messages;
using AyCode.Models.Enums; using AyCode.Models.Enums;
using TIAM.Database.DataLayers.Admins; using TIAM.Database.DataLayers.Admins;
using TIAM.Entities.Emails;
using TIAM.Models.Dtos.Users; using TIAM.Models.Dtos.Users;
namespace TIAMWebApp.Server.Controllers namespace TIAMWebApp.Server.Controllers

View File

@ -8,6 +8,7 @@ using TIAM.Database.DataLayers.Admins;
using TIAM.Database.DataLayers.Auctions; using TIAM.Database.DataLayers.Auctions;
using TIAM.Database.DataLayers.TransferDestinations; using TIAM.Database.DataLayers.TransferDestinations;
using TIAM.Database.DataLayers.Users; using TIAM.Database.DataLayers.Users;
using TIAM.Entities.Emails;
using TIAMWebApp.Server.Services; using TIAMWebApp.Server.Services;
//using TIAM.Database.DataLayers.ServiceProviders; //using TIAM.Database.DataLayers.ServiceProviders;
@ -88,7 +89,7 @@ builder.Services.Configure<FormOptions>(options =>
options.MultipartBodyLengthLimit = 200000000; // Increase the limit to 200MB options.MultipartBodyLengthLimit = 200000000; // Increase the limit to 200MB
}); });
builder.Services.AddScoped<IMessageSenderService, NoticeSenderService>(); builder.Services.AddScoped<IMessageSenderService, MessageSenderService>();
builder.Services.AddScoped<TransferBackendService, TransferBackendService>(); builder.Services.AddScoped<TransferBackendService, TransferBackendService>();
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); builder.Services.AddSwaggerGen();

View File

@ -0,0 +1,97 @@
using System.Net;
using AyCode.Interfaces.Messages;
using SendGrid;
using SendGrid.Helpers.Mail;
using AyCode.Models.Enums;
using TIAM.Database.DataLayers.Admins;
using TIAM.Database.DataLayers.Users;
using TIAM.Entities.Emails;
using TIAMWebApp.Shared.Application.Models.ClientSide.Messages;
namespace TIAMWebApp.Server.Services
{
public class MessageSenderService(IConfiguration configuration, AdminDal adminDal) : IMessageSenderService
{
//public AdminDal AdminDal = adminDal;
public async Task<string> SendMessageAsync<TEmailMessage>(TEmailMessage message, int messageType) where TEmailMessage : EmailMessage
{
var result = "";
switch (messageType)
{
case (int)MessageTypesEnum.email:
if (message is EmailMessage emailMessage)
{
Console.WriteLine($@"EmailMessage!!!");
// Access DerivedClass properties
//var subject = emailMessage.Subject;
result = (await SendMailWithSendgrid(emailMessage)).ToString(); //?? HttpStatusCode.BadRequest.ToString();
}
else
{
// Access BaseClass properties
result = "Invalid message";
}
break;
case (int)MessageTypesEnum.sms:
//await SendSmsWithTwilio(message.Message);
break;
case (int)MessageTypesEnum.push:
//await SendPushWithFirebase(message.Message);
break;
case (int)MessageTypesEnum.chat:
//await SendChatWithSignalR(message.Message);
default:
break;
}
return result;
}
public async Task<HttpStatusCode> SendMailWithSendgrid(EmailMessage message)
{
Console.WriteLine($@"Sender: {message.SenderId}");
Console.WriteLine($@"Message: {message.Text}");
//resolve user!!!
if (!message.SenderId.HasValue) return HttpStatusCode.BadRequest;
var senderUser = adminDal.GetUserById(message.SenderId.Value);
//var receiverUser = adminDal.Context.Users.FirstOrDefault(x => x.Id == message.ReceiverId);
if (senderUser != null) return HttpStatusCode.BadRequest;
var apiKey = configuration["SendGrid:Key"];
var client = new SendGridClient(apiKey);
EmailAddress from;
if (message.SenderId == Guid.Empty)
{
from = new EmailAddress("noreply@tiam.com", "TourIAm mailservice");
}
else
{
from = new EmailAddress(message.EmailAddress, senderUser.Profile.Name);
}
foreach (var messageRecipient in message.Recipients)
{
var to = new EmailAddress(messageRecipient.EmailAddress, messageRecipient.EmailAddress);
var plainTextContent = message.Text;
//var _htmlContent = message.;
//MailHelper.CreateSingleEmailToMultipleRecipients()
var msg = MailHelper.CreateSingleEmail(from, to, message.Subject, plainTextContent, plainTextContent);
var response = await client.SendEmailAsync(msg).ConfigureAwait(false);
}
//return response.StatusCode;
return HttpStatusCode.Accepted;
}
}
}

View File

@ -1,90 +0,0 @@
using AyCode.Interfaces.Messages;
using SendGrid;
using SendGrid.Helpers.Mail;
using AyCode.Models.Enums;
using AyCode.Entities.Messages;
using AyCode.Models.Messages;
using TIAM.Database.DataLayers.Users;
using TIAMWebApp.Shared.Application.Models.ClientSide.Messages;
namespace TIAMWebApp.Server.Services
{
public class NoticeSenderService : IMessageSenderService
{
private readonly IConfiguration _configuration;
public UserDal _userDal;
public NoticeSenderService(IConfiguration configuration, UserDal userDal)
{
_configuration = configuration;
_userDal = userDal;
}
public async Task<string> SendMessageAsync<TNotice>(TNotice message, int messageType) where TNotice : class, INoticeBase
{
string result = "";
switch (messageType)
{
case (int)MessageTypesEnum.email:
if (message is MessageSenderModel<EmailMessage> emailMessage)
{
Console.WriteLine($@"EmailMessage!!!");
// Access DerivedClass properties
var _subject = emailMessage.Message.Subject;
result = await SendMailWithSendgrid(emailMessage.Message);
}
else
{
// Access BaseClass properties
result = "Invalid message";
}
break;
case (int)MessageTypesEnum.sms:
//await SendSmsWithTwilio(message.Message);
break;
case (int)MessageTypesEnum.push:
//await SendPushWithFirebase(message.Message);
break;
case (int)MessageTypesEnum.chat:
//await SendChatWithSignalR(message.Message);
default:
break;
}
return result;
}
public async Task<string> SendMailWithSendgrid(EmailMessage message)
{
Console.WriteLine($@"Sender: {message.SenderId}");
Console.WriteLine($@"Message: {message.Message}");
//resolve user!!!
var senderUser = _userDal.Context.Users.FirstOrDefault(x => x.Id == message.SenderId);
var receiverUser = _userDal.Context.Users.FirstOrDefault(x => x.Id == message.ReceiverId);
string apiKey = _configuration["SendGrid:Key"];
var _client = new SendGridClient(apiKey);
var _from = new EmailAddress("", "");
if (message.SenderId == Guid.Empty)
{
_from = new EmailAddress("noreply@tiam.com", "TourIAm mailservice");
}
else
{
_from = new EmailAddress(senderUser.EmailAddress, senderUser.EmailAddress);
}
var _subject = message.Subject;
var _to = new EmailAddress(receiverUser.EmailAddress, receiverUser.EmailAddress);
var _plainTextContent = message.Message;
var _htmlContent = message.HtmlContent;
var _msg = MailHelper.CreateSingleEmail(_from, _to, message.Subject, _plainTextContent, _htmlContent);
var response = await _client.SendEmailAsync(_msg).ConfigureAwait(false);
return response.StatusCode.ToString();
}
}
}

View File

@ -1,17 +1,16 @@
using AyCode.Entities.Messages; using AyCode.Interfaces.Messages;
using AyCode.Interfaces.Messages;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using AyCode.Models.Enums; using AyCode.Models.Enums;
using AyCode.Models.Messages; using TIAM.Entities.Emails;
namespace TIAMWebApp.Shared.Application.Models.ClientSide.Messages namespace TIAMWebApp.Shared.Application.Models.ClientSide.Messages
{ {
public class MessageSenderModel<TMessageType> where TMessageType : NoticeBase public class MessageSenderModel<TMessageType> where TMessageType : EmailMessage
{ {
public TMessageType Message { get; set; } public TMessageType Message { get; set; }
//public NoticeBase? Message { get; set; } //public NoticeBase? Message { get; set; }

View File

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using AyCode.Models.Messages;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using TIAM.Entities.Users; using TIAM.Entities.Users;
using TIAM.Models.Dtos.Users; using TIAM.Models.Dtos.Users;