Adding contact details for loaded mails and fixing background notification actions.

This commit is contained in:
Burak Kaan Köse
2024-08-23 01:07:00 +02:00
parent 0fbeb11304
commit f45580be70
26 changed files with 523 additions and 427 deletions

View File

@@ -41,15 +41,15 @@ namespace Wino.Core.Extensions
}
}
public static AddressInformation ToAddressInformation(this MailboxAddress address)
public static AccountContact ToAddressInformation(this MailboxAddress address)
{
if (address == null)
return new AddressInformation() { Name = Translator.UnknownSender, Address = Translator.UnknownAddress };
return new AccountContact() { Name = Translator.UnknownSender, Address = Translator.UnknownAddress };
if (string.IsNullOrEmpty(address.Name))
address.Name = address.Address;
return new AddressInformation() { Name = address.Name, Address = address.Address };
return new AccountContact() { Name = address.Name, Address = address.Address };
}
/// <summary>

View File

@@ -10,8 +10,8 @@ namespace Wino.Core.Services
{
public interface IContactService
{
Task<List<AddressInformation>> GetAddressInformationAsync(string queryText);
Task<AddressInformation> GetAddressInformationByAddressAsync(string address);
Task<List<AccountContact>> GetAddressInformationAsync(string queryText);
Task<AccountContact> GetAddressInformationByAddressAsync(string address);
Task SaveAddressInformationAsync(MimeMessage message);
}
@@ -19,24 +19,24 @@ namespace Wino.Core.Services
{
public ContactService(IDatabaseService databaseService) : base(databaseService) { }
public Task<List<AddressInformation>> GetAddressInformationAsync(string queryText)
public Task<List<AccountContact>> GetAddressInformationAsync(string queryText)
{
if (queryText == null || queryText.Length < 2)
return Task.FromResult<List<AddressInformation>>(null);
return Task.FromResult<List<AccountContact>>(null);
var query = new Query(nameof(AddressInformation));
var query = new Query(nameof(AccountContact));
query.WhereContains("Address", queryText);
query.OrWhereContains("Name", queryText);
var rawLikeQuery = query.GetRawQuery();
return Connection.QueryAsync<AddressInformation>(rawLikeQuery);
return Connection.QueryAsync<AccountContact>(rawLikeQuery);
}
public async Task<AddressInformation> GetAddressInformationByAddressAsync(string address)
public async Task<AccountContact> GetAddressInformationByAddressAsync(string address)
{
return await Connection.Table<AddressInformation>().Where(a => a.Address == address).FirstOrDefaultAsync()
?? new AddressInformation() { Name = address, Address = address };
return await Connection.Table<AccountContact>().Where(a => a.Address == address).FirstOrDefaultAsync()
?? new AccountContact() { Name = address, Address = address };
}
public async Task SaveAddressInformationAsync(MimeMessage message)
@@ -45,7 +45,7 @@ namespace Wino.Core.Services
.GetRecipients(true)
.Where(a => !string.IsNullOrEmpty(a.Name) && !string.IsNullOrEmpty(a.Address));
var addressInformations = recipients.Select(a => new AddressInformation() { Name = a.Name, Address = a.Address });
var addressInformations = recipients.Select(a => new AccountContact() { Name = a.Name, Address = a.Address });
foreach (var info in addressInformations)
await Connection.InsertOrReplaceAsync(info).ConfigureAwait(false);

View File

@@ -57,7 +57,7 @@ namespace Wino.Core.Services
typeof(MailItemFolder),
typeof(MailAccount),
typeof(TokenInformation),
typeof(AddressInformation),
typeof(AccountContact),
typeof(CustomServerInformation),
typeof(AccountSignature),
typeof(MergedInbox),

View File

@@ -201,6 +201,7 @@ namespace Wino.Core.Services
Dictionary<Guid, MailItemFolder> folderCache = [];
Dictionary<Guid, MailAccount> accountCache = [];
Dictionary<string, AccountContact> contactCache = [];
// Populate Folder Assignment for each single mail, to be able later group by "MailAccountId".
// This is needed to execute threading strategy by account type.
@@ -255,7 +256,9 @@ namespace Wino.Core.Services
return threadedItems;
// Recursive function to populate folder and account assignments for each mail item.
async Task LoadAssignedPropertiesWithCacheAsync(IMailItem mail, Dictionary<Guid, MailItemFolder> folderCache, Dictionary<Guid, MailAccount> accountCache)
async Task LoadAssignedPropertiesWithCacheAsync(IMailItem mail,
Dictionary<Guid, MailItemFolder> folderCache,
Dictionary<Guid, MailAccount> accountCache)
{
if (mail is ThreadMailItem threadMailItem)
{
@@ -276,6 +279,7 @@ namespace Wino.Core.Services
folderAssignment = await _folderService.GetFolderAsync(mailCopy.FolderId).ConfigureAwait(false);
_ = folderCache.TryAdd(mailCopy.FolderId, folderAssignment);
}
if (folderAssignment != null)
{
var isAccountCached = accountCache.TryGetValue(folderAssignment.MailAccountId, out accountAssignment);
@@ -283,11 +287,21 @@ namespace Wino.Core.Services
{
accountAssignment = await _accountService.GetAccountAsync(folderAssignment.MailAccountId).ConfigureAwait(false);
_ = accountCache.TryAdd(folderAssignment.MailAccountId, accountAssignment);
}
}
bool isContactCached = contactCache.TryGetValue(mailCopy.FromAddress, out AccountContact contactAssignment);
if (!isContactCached && accountAssignment != null)
{
contactAssignment = await GetSenderContactForAccountAsync(accountAssignment, mailCopy.FromAddress).ConfigureAwait(false);
_ = contactCache.TryAdd(mailCopy.FromAddress, contactAssignment);
}
mailCopy.AssignedFolder = folderAssignment;
mailCopy.AssignedAccount = accountAssignment;
mailCopy.SenderContact = contactAssignment;
}
}
}
@@ -304,11 +318,23 @@ namespace Wino.Core.Services
return mailCopies;
}
private Task<AccountContact> GetSenderContactForAccountAsync(MailAccount account, string fromAddress)
{
if (fromAddress == account.Address)
{
return Task.FromResult(new AccountContact() { Address = account.Address, Name = account.SenderName, Base64ContactPicture = account.Base64ProfilePictureData });
}
else
{
return _contactService.GetAddressInformationByAddressAsync(fromAddress);
}
}
private async Task LoadAssignedPropertiesAsync(MailCopy mailCopy)
{
if (mailCopy == null) return;
// Load AssignedAccount and AssignedFolder.
// Load AssignedAccount, AssignedFolder and SenderContact.
var folder = await _folderService.GetFolderAsync(mailCopy.FolderId);
@@ -320,6 +346,7 @@ namespace Wino.Core.Services
mailCopy.AssignedAccount = account;
mailCopy.AssignedFolder = folder;
mailCopy.SenderContact = await GetSenderContactForAccountAsync(account, mailCopy.FromAddress).ConfigureAwait(false);
}
public async Task<MailCopy> GetSingleMailItemWithoutFolderAssignmentAsync(string mailCopyId)
@@ -579,6 +606,7 @@ namespace Wino.Core.Services
mailCopy.UniqueId = Guid.NewGuid();
mailCopy.AssignedAccount = account;
mailCopy.AssignedFolder = assignedFolder;
mailCopy.SenderContact = await GetSenderContactForAccountAsync(account, mailCopy.FromAddress).ConfigureAwait(false);
mailCopy.FolderId = assignedFolder.Id;
// Only save MIME files if they don't exists.