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
@@ -14,6 +14,22 @@ public interface IFolderMenuItem : IBaseFolderMenuItem
public interface IMergedAccountFolderMenuItem : IBaseFolderMenuItem { }
public interface IMailCategoryMenuItem : IBaseFolderMenuItem
{
Entities.Mail.MailCategory MailCategory { get; }
string TextColorHex { get; }
string BackgroundColorHex { get; }
bool HasTextColor { get; }
}
public interface IMergedMailCategoryMenuItem : IBaseFolderMenuItem
{
IReadOnlyList<Entities.Mail.MailCategory> Categories { get; }
string TextColorHex { get; }
string BackgroundColorHex { get; }
bool HasTextColor { get; }
}
public interface IBaseFolderMenuItem : IMenuItem
{
string FolderName { get; }
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Models.Accounts;
namespace Wino.Core.Domain.Interfaces;
public interface IMailCategoryService
{
Task<List<MailCategory>> GetCategoriesAsync(Guid accountId);
Task<List<MailCategory>> GetFavoriteCategoriesAsync(Guid accountId);
Task<MailCategory> GetCategoryAsync(Guid categoryId);
Task<bool> CategoryNameExistsAsync(Guid accountId, string name, Guid? excludedCategoryId = null);
Task<MailCategory> CreateCategoryAsync(MailCategory category);
Task UpdateCategoryAsync(MailCategory category);
Task DeleteCategoryAsync(Guid categoryId);
Task DeleteCategoriesAsync(Guid accountId);
Task ToggleFavoriteAsync(Guid categoryId, bool isFavorite);
Task UpdateRemoteIdAsync(Guid categoryId, string remoteId);
Task ReplaceCategoriesAsync(Guid accountId, IEnumerable<MailCategory> categories);
Task ReplaceMailAssignmentsAsync(Guid accountId, Guid mailCopyUniqueId, IEnumerable<string> categoryNames);
Task AssignCategoryAsync(Guid categoryId, IEnumerable<Guid> mailCopyUniqueIds);
Task UnassignCategoryAsync(Guid categoryId, IEnumerable<Guid> mailCopyUniqueIds);
Task<List<MailCategory>> GetCategoriesForMailAsync(Guid accountId, IEnumerable<Guid> mailCopyUniqueIds);
Task<List<Guid>> GetAssignedCategoryIdsForAllAsync(IEnumerable<Guid> mailCopyUniqueIds);
Task<List<string>> GetCategoryNamesForMailAsync(Guid mailCopyUniqueId);
Task<List<MailCopy>> GetMailCopiesForCategoryAsync(Guid categoryId);
Task<List<UnreadCategoryCountResult>> GetUnreadCategoryCountResultsAsync(IEnumerable<Guid> accountIds);
}
@@ -11,6 +11,7 @@ using Wino.Core.Domain.Models;
using Wino.Core.Domain.Models.Accounts;
using Wino.Core.Domain.Models.Calendar;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
namespace Wino.Core.Domain.Interfaces;
@@ -52,6 +53,13 @@ public interface IMailDialogService : IDialogServiceBase
/// <returns>Created alias model if not canceled.</returns>
Task<ICreateAccountAliasDialog> ShowCreateAccountAliasDialogAsync();
/// <summary>
/// Presents a dialog to the user for mail category creation/modification.
/// </summary>
#pragma warning disable CS8625
Task<MailCategoryDialogResult> ShowEditMailCategoryDialogAsync(MailCategory category = null);
#pragma warning restore CS8625
/// <summary>
/// Presents a dialog to the user to show email source.
/// </summary>
@@ -72,3 +72,9 @@ public interface ICalendarActionRequest : IRequestBase
Guid? LocalCalendarItemId { get; }
CalendarSynchronizerOperation Operation { get; }
}
public interface ICategoryActionRequest : IRequestBase
{
Guid AccountId { get; }
CategorySynchronizerOperation Operation { get; }
}
@@ -63,6 +63,12 @@ public interface ISynchronizationManager
Task<MailSynchronizationResult> SynchronizeAliasesAsync(Guid accountId,
CancellationToken cancellationToken = default);
/// <summary>
/// Handles category synchronization for the given account.
/// </summary>
Task<MailSynchronizationResult> SynchronizeCategoriesAsync(Guid accountId,
CancellationToken cancellationToken = default);
/// <summary>
/// Handles profile synchronization for the given account.
/// </summary>
@@ -1,4 +1,6 @@
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Wino.Core.Domain.Models.Calendar;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
@@ -36,4 +38,9 @@ public interface IWinoRequestDelegator
/// </summary>
/// <param name="calendarOperationPreparationRequest">Calendar preparation request.</param>
Task ExecuteAsync(CalendarOperationPreparationRequest calendarOperationPreparationRequest);
/// <summary>
/// Queues pre-built requests for a single account and triggers synchronization.
/// </summary>
Task ExecuteAsync(Guid accountId, IEnumerable<IRequestBase> requests);
}