2024-04-18 01:44:37 +02:00
using System ;
using System.Collections.Generic ;
2024-08-25 02:01:08 +02:00
using System.Threading ;
2024-04-18 01:44:37 +02:00
using System.Threading.Tasks ;
2025-02-15 12:53:32 +01:00
using MailKit ;
2024-11-10 23:28:25 +01:00
using Wino.Core.Domain.Entities.Mail ;
using Wino.Core.Domain.Entities.Shared ;
2024-04-18 01:44:37 +02:00
using Wino.Core.Domain.Models.MailItem ;
2025-02-16 11:54:23 +01:00
namespace Wino.Core.Domain.Interfaces ;
public interface IMailService
2024-04-18 01:44:37 +02:00
{
2025-02-16 11:54:23 +01:00
Task < MailCopy > GetSingleMailItemAsync ( string mailCopyId , string remoteFolderId ) ;
Task < MailCopy > GetSingleMailItemAsync ( Guid uniqueMailId ) ;
2025-02-22 00:22:00 +01:00
/// <summary>
/// Returns the single mail item with the given mail copy id.
/// Caution: This method is not safe. Use other overrides.
/// </summary>
/// <param name="mailCopyId"></param>
/// <returns></returns>
Task < MailCopy > GetSingleMailItemAsync ( string mailCopyId ) ;
2025-02-16 11:54:23 +01:00
Task < List < IMailItem > > FetchMailsAsync ( MailListInitializationOptions options , CancellationToken cancellationToken = default ) ;
/// <summary>
/// Deletes all mail copies for all folders.
/// </summary>
/// <param name="accountId">Account to remove from</param>
/// <param name="mailCopyId">Mail copy id to remove.</param>
Task DeleteMailAsync ( Guid accountId , string mailCopyId ) ;
Task ChangeReadStatusAsync ( string mailCopyId , bool isRead ) ;
Task ChangeFlagStatusAsync ( string mailCopyId , bool isFlagged ) ;
Task CreateAssignmentAsync ( Guid accountId , string mailCopyId , string remoteFolderId ) ;
Task DeleteAssignmentAsync ( Guid accountId , string mailCopyId , string remoteFolderId ) ;
Task < bool > CreateMailAsync ( Guid accountId , NewMailItemPackage package ) ;
/// <summary>
/// Maps new mail item with the existing local draft copy.
/// In case of failure, it returns false.
/// Then synchronizers must insert a new mail item.
/// </summary>
/// <param name="accountId">Id of the account. It's important to map to the account since if the user use the same account with different providers, this call must map the correct one.</param>
/// <param name="localDraftCopyUniqueId">UniqueId of the local draft copy.</param>
/// <param name="newMailCopyId">New assigned remote mail item id.</param>
/// <param name="newDraftId">New assigned draft id if exists.</param>
/// <param name="newThreadId">New message's thread/conversation id.</param>
/// <returns>True if mapping is done. False if local copy doesn't exists.</returns>
Task < bool > MapLocalDraftAsync ( Guid accountId , Guid localDraftCopyUniqueId , string newMailCopyId , string newDraftId , string newThreadId ) ;
/// <summary>
/// Maps new mail item with the existing local draft copy.
/// </summary>
/// <param name="newMailCopyId"></param>
/// <param name="newDraftId"></param>
/// <param name="newThreadId"></param>
Task MapLocalDraftAsync ( string newMailCopyId , string newDraftId , string newThreadId ) ;
Task UpdateMailAsync ( MailCopy mailCopy ) ;
/// <summary>
/// Gets the new inserted unread mails after the synchronization.
/// </summary>
/// <param name="accountId">Account id.</param>
/// <param name="downloadedMailCopyIds">
/// Mail ids that synchronizer tried to download. If there was an issue with the
/// Items that tried and actually downloaded may differ. This function will return only new inserted ones.
/// </param>
/// <returns>Newly inserted unread mails inside the Inbox folder.</returns>
Task < List < MailCopy > > GetDownloadedUnreadMailsAsync ( Guid accountId , IEnumerable < string > downloadedMailCopyIds ) ;
/// <summary>
/// Returns the account that this mail copy unique id is assigned.
/// Used in toast notification handler.
/// </summary>
/// <param name="uniqueMailId">Unique id of the mail item.</param>
/// <returns>Account that mail belongs to.</returns>
Task < MailAccount > GetMailAccountByUniqueIdAsync ( Guid uniqueMailId ) ;
/// <summary>
/// Checks whether the given mail copy id exists in the database.
/// Safely used for Outlook to prevent downloading the same mail twice.
/// For Gmail, it should be avoided since one mail may belong to multiple folders.
/// </summary>
/// <param name="mailCopyId">Native mail id of the message.</param>
Task < bool > IsMailExistsAsync ( string mailCopyId ) ;
/// <summary>
/// Returns all mails for given folder id.
/// </summary>
/// <param name="folderId">Folder id to get mails for</param>
Task < List < MailCopy > > GetMailsByFolderIdAsync ( Guid folderId ) ;
/// <summary>
/// Returns all unread mails for given folder id.
/// </summary>
/// <param name="folderId">Folder id to get unread mails for.</param>
Task < List < MailCopy > > GetUnreadMailsByFolderIdAsync ( Guid folderId ) ;
/// <summary>
/// Checks whether the mail exists in the folder.
/// When deciding Create or Update existing mail, we need to check if the mail exists in the folder.
/// </summary>
/// <param name="mailCopyId">MailCopy id</param>
/// <param name="folderId">Folder's local id.</param>
/// <returns>Whether mail exists in the folder or not.</returns>
Task < bool > IsMailExistsAsync ( string mailCopyId , Guid folderId ) ;
/// <summary>
/// Creates a draft MailCopy and MimeMessage based on the given options.
/// For forward/reply it would include the referenced message.
/// </summary>
/// <param name="accountId">AccountId which should have new draft.</param>
/// <param name="draftCreationOptions">Options like new email/forward/draft.</param>
/// <returns>Draft MailCopy and Draft MimeMessage as base64.</returns>
Task < ( MailCopy draftMailCopy , string draftBase64MimeMessage ) > CreateDraftAsync ( Guid accountId , DraftCreationOptions draftCreationOptions ) ;
/// <summary>
/// Returns ids
/// </summary>
/// <param name="folderId"></param>
/// <param name="uniqueIds"></param>
/// <returns></returns>
Task < List < MailCopy > > GetExistingMailsAsync ( Guid folderId , IEnumerable < UniqueId > uniqueIds ) ;
2025-02-22 00:22:00 +01:00
/// <summary>
/// Creates a new mail from a package without doing any existence check.
/// Use it with caution.
/// </summary>
/// <param name="account">Account that mail belongs to.</param>
/// <param name="mailItemFolder">Assigned folder.</param>
/// <param name="package">Mail creation package.</param>
/// <returns></returns>
Task CreateMailRawAsync ( MailAccount account , MailItemFolder mailItemFolder , NewMailItemPackage package ) ;
2025-02-22 23:09:53 +01:00
/// <summary>
/// Checks whether the account has any draft mail locally.
/// </summary>
/// <param name="accountId">Account id.</param>
Task < bool > HasAccountAnyDraftAsync ( Guid accountId ) ;
2025-02-23 17:05:46 +01:00
/// <summary>
/// Compares the ids returned from online search result for Archive folder against the local database.
/// </summary>
/// <param name="archiveFolderId">Archive folder id.</param>
/// <param name="onlineArchiveMailIds">Retrieved MailCopy ids from search result.</param>
/// <returns>Result model that contains added and removed mail copy ids.</returns>
Task < GmailArchiveComparisonResult > GetGmailArchiveComparisonResultAsync ( Guid archiveFolderId , List < string > onlineArchiveMailIds ) ;
2024-04-18 01:44:37 +02:00
}