Merge branch 'codex/mail-categories-v1'

This commit is contained in:
Burak Kaan Köse
2026-04-15 01:18:12 +02:00
61 changed files with 2171 additions and 75 deletions
@@ -370,6 +370,26 @@ public class SynchronizationManager : ISynchronizationManager, IRecipient<Accoun
return await SynchronizeMailAsync(options, cancellationToken);
}
/// <summary>
/// Handles category synchronization for the given account.
/// </summary>
/// <param name="accountId">Account ID to synchronize categories for</param>
/// <param name="cancellationToken">Cancellation token</param>
/// <returns>Synchronization result</returns>
public async Task<MailSynchronizationResult> SynchronizeCategoriesAsync(Guid accountId,
CancellationToken cancellationToken = default)
{
EnsureInitialized();
var options = new MailSynchronizationOptions
{
AccountId = accountId,
Type = MailSynchronizationType.Categories
};
return await SynchronizeMailAsync(options, cancellationToken);
}
/// <summary>
/// Handles profile synchronization for the given account.
/// </summary>
+5 -2
View File
@@ -26,6 +26,7 @@ public class SynchronizerFactory : ISynchronizerFactory
private readonly ICalDavClient _calDavClient;
private readonly IAutoDiscoveryService _autoDiscoveryService;
private readonly ICalendarService _calendarService;
private readonly IMailCategoryService _mailCategoryService;
private readonly List<IWinoSynchronizerBase> synchronizerCache = new();
@@ -41,7 +42,8 @@ public class SynchronizerFactory : ISynchronizerFactory
UnifiedImapSynchronizer unifiedImapSynchronizer,
ICalDavClient calDavClient,
IAutoDiscoveryService autoDiscoveryService,
ICalendarService calendarService)
ICalendarService calendarService,
IMailCategoryService mailCategoryService)
{
_outlookChangeProcessor = outlookChangeProcessor;
_gmailChangeProcessor = gmailChangeProcessor;
@@ -56,6 +58,7 @@ public class SynchronizerFactory : ISynchronizerFactory
_calDavClient = calDavClient;
_autoDiscoveryService = autoDiscoveryService;
_calendarService = calendarService;
_mailCategoryService = mailCategoryService;
}
public async Task<IWinoSynchronizerBase> GetAccountSynchronizerAsync(Guid accountId)
@@ -86,7 +89,7 @@ public class SynchronizerFactory : ISynchronizerFactory
{
case Domain.Enums.MailProviderType.Outlook:
var outlookAuthenticator = _authenticationProvider.GetAuthenticator(Domain.Enums.MailProviderType.Outlook) as IOutlookAuthenticator;
return new OutlookSynchronizer(mailAccount, outlookAuthenticator, _outlookChangeProcessor, _outlookSynchronizerErrorHandlerFactory);
return new OutlookSynchronizer(mailAccount, outlookAuthenticator, _outlookChangeProcessor, _outlookSynchronizerErrorHandlerFactory, _mailCategoryService);
case Domain.Enums.MailProviderType.Gmail:
var gmailAuthenticator = _authenticationProvider.GetAuthenticator(Domain.Enums.MailProviderType.Gmail) as IGmailAuthenticator;
return new GmailSynchronizer(mailAccount, gmailAuthenticator, _gmailChangeProcessor, _gmailSynchronizerErrorHandlerFactory);
@@ -207,6 +207,21 @@ public class WinoRequestDelegator : IWinoRequestDelegator
await QueueCalendarSynchronizationAsync(accountId);
}
public async Task ExecuteAsync(Guid accountId, IEnumerable<IRequestBase> requests)
{
var requestList = requests?.Where(a => a != null).ToList() ?? [];
if (requestList.Count == 0)
return;
foreach (var request in requestList)
{
await QueueRequestAsync(request, accountId).ConfigureAwait(false);
}
await SendSyncActionsAddedAsync(requestList, accountId).ConfigureAwait(false);
await QueueSynchronizationAsync(accountId).ConfigureAwait(false);
}
private async Task<IRequestBase> CreateCalendarEventRequestAsync(CalendarOperationPreparationRequest calendarPreparationRequest)
{
var composeResult = calendarPreparationRequest.ComposeResult