Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Email] Filtering for email retrievals #2275

Merged
merged 22 commits into from
Nov 21, 2024
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e356735
Add v3 interface
darjoo Oct 25, 2024
8c38f10
Fix tests
darjoo Oct 25, 2024
ffd6567
Add sanitize overload
darjoo Oct 29, 2024
4f2e84f
Add app addin
darjoo Oct 29, 2024
6ad815e
Remove var, and check for v3 before v2
darjoo Oct 29, 2024
59bda14
Replace codeunit with table for filters
darjoo Oct 29, 2024
34ecfaa
Fix obsolete reasons and consolidate dataclassification
darjoo Oct 30, 2024
a8178e5
Merge branch 'main' of https://github.com/microsoft/BCApps into priva…
darjoo Oct 30, 2024
df5c269
Merge branch 'main' of https://github.com/microsoft/BCApps into priva…
darjoo Oct 30, 2024
a328ccf
Add inherent entitlements and permissions to Email Retrieval Filters
darjoo Oct 30, 2024
3b602e3
Fix tests
darjoo Oct 31, 2024
986cc94
Update app.json for test
darjoo Oct 31, 2024
1924cff
Update app.json for test
darjoo Oct 31, 2024
8525f66
Test Email Connector v3 was looking for v2
darjoo Oct 31, 2024
4d118d0
Update test with clean tags
darjoo Oct 31, 2024
e4a1434
Merge branch 'main' of https://github.com/microsoft/BCApps into priva…
darjoo Nov 1, 2024
6e729c4
Update test
darjoo Nov 1, 2024
f4f338c
Merge branch 'main' of https://github.com/microsoft/BCApps into priva…
darjoo Nov 12, 2024
ad34b64
Fix api
darjoo Nov 12, 2024
e571695
Clean EmailMessageImpl of redundant create overloads
darjoo Nov 12, 2024
9954385
Naming convension of interface variables. Removing I prefix
darjoo Nov 13, 2024
4cf967d
Merge branch 'main' of https://github.com/microsoft/BCApps into priva…
darjoo Nov 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/System Application/App/DotNet Aliases/src/dotnet.al
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,16 @@ dotnet
}
}

assembly("Microsoft.Dynamics.Nav.AppHTMLSanitizer")
{
Culture = 'neutral';
PublicKeyToken = '31bf3856ad364e35';

type("Microsoft.Dynamics.Nav.AppHTMLSanitizer.AppHtmlSanitizer"; "AppHtmlSanitizer")
{
}
}

assembly("Microsoft.Dynamics.Nav.AzureADGraphClient")
{
type("Microsoft.Dynamics.Nav.AzureADGraphClient.GroupInfoPage"; "GroupInfoPage")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -387,8 +387,8 @@ page 8887 "Email Accounts"
IsSelected := not IsNullGuid(SelectedAccountId);

EmailAccount.GetAllAccounts(true, Rec); // Refresh the email accounts
if V2Filter then
FilterToConnectorv2Accounts(Rec);
if V2V3Filter then
FilterToConnectorv2v3Accounts(Rec);
EmailScenario.GetDefaultEmailAccount(DefaultEmailAccount); // Refresh the default email account

if IsSelected then begin
Expand All @@ -402,7 +402,7 @@ page 8887 "Email Accounts"
CurrPage.Update(false);
end;

local procedure FilterToConnectorv2Accounts(var EmailAccounts: Record "Email Account")
local procedure FilterToConnectorv2v3Accounts(var EmailAccounts: Record "Email Account")
var
IConnector: Interface "Email Connector";
darjoo marked this conversation as resolved.
Show resolved Hide resolved
begin
Expand All @@ -411,7 +411,13 @@ page 8887 "Email Accounts"

repeat
IConnector := EmailAccounts.Connector;
if not (IConnector is "Email Connector v2") then
#if not CLEAN26
#pragma warning disable AL0432
if not (IConnector is "Email Connector v2") and not (IConnector is "Email Connector v3") then
#pragma warning restore AL0432
#else
if not (IConnector is "Email Connector v3") then
#endif
EmailAccounts.Delete();
until EmailAccounts.Next() = 0;
end;
Expand Down Expand Up @@ -457,12 +463,24 @@ page 8887 "Email Accounts"
end;

/// <summary>
/// Filters the email accounts to only show accounts that are using the Email Connector v2.
/// Filters the email accounts to only show accounts that are using the Email Connector v2 or v3.
/// </summary>
/// <param name="Filter">True to filter the email accounts, false to show all email accounts</param>
#if not CLEAN26
[Obsolete('Replaced by FilterConnectorV3Accounts. In addition, this function now returns both v2 and v3 accounts.', '26.0')]
procedure FilterConnectorV2Accounts(Filter: Boolean)
begin
V2Filter := Filter;
V2V3Filter := Filter;
end;
#endif

/// <summary>
/// Filters the email accounts to only show accounts that are using the Email Connector v2 or v3.
/// </summary>
/// <param name="Filter">True to filter the email accounts, false to show all email accounts</param>
procedure FilterConnectorV3Accounts(Filter: Boolean)
begin
V2V3Filter := Filter;
end;

var
Expand All @@ -477,6 +495,6 @@ page 8887 "Email Accounts"
ShowLogo: Boolean;
IsLookupMode: Boolean;
HasEmailAccount: Boolean;
V2Filter: Boolean;
V2V3Filter: Boolean;
EmailConnectorHasBeenUninstalledMsg: Label 'The selected email extension has been uninstalled. To view information about the email account, you must reinstall the extension.';
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@ namespace System.Email;
/// <summary>
/// This is the default implementation of the Email Connector v2 interface which adds the reply, retrievial of emails and marking them as read functionalities.
/// </summary>
codeunit 8998 "Default Email Connector v2" implements "Email Connector v2"
#if not CLEAN26
#pragma warning disable AL0432
codeunit 8998 "Default Email Connector v2" implements "Email Connector v2", "Email Connector v3"
#pragma warning restore AL0432
#else
codeunit 8998 "Default Email Connector v2" implements "Email Connector v3"
#endif
{

procedure Send(EmailMessage: Codeunit "Email Message"; AccountId: Guid)
begin

Expand Down Expand Up @@ -50,10 +57,18 @@ codeunit 8998 "Default Email Connector v2" implements "Email Connector v2"

end;

#if not CLEAN26
[Obsolete('Replaced by RetrieveEmails with an additional Filters parameter of type Record "Email Retrieval Filters".', '26.0')]
procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox")
begin

end;
#endif

procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary)
begin

end;

procedure MarkAsRead(AccountId: Guid; ExternalId: Text)
begin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,18 @@ namespace System.Email;
/// <summary>
/// Enum that holds all of the available email connectors.
/// </summary>
enum 8889 "Email Connector" implements "Email Connector", "Email Connector v2", "Default Email Rate Limit"
#if not CLEAN26
#pragma warning disable AL0432
enum 8889 "Email Connector" implements "Email Connector", "Email Connector v2", "Email Connector v3", "Default Email Rate Limit"
#pragma warning restore AL0432
#else
enum 8889 "Email Connector" implements "Email Connector", "Email Connector v3", "Default Email Rate Limit"
#endif
{
Extensible = true;
DefaultImplementation = "Default Email Rate Limit" = "Default Email Rate Limit",
"Email Connector v2" = "Default Email Connector v2";
#if not CLEAN26
"Email Connector v2" = "Default Email Connector v2",
#endif
"Email Connector v3" = "Default Email Connector v2";
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#if not CLEAN26
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
Expand All @@ -10,6 +11,10 @@ namespace System.Email;
/// </summary>
interface "Email Connector v2" extends "Email Connector"
{
ObsoleteReason = 'Replaced by "Email Connector v3" which adds filtering capability for retrieval of emails';
ObsoleteState = Pending;
ObsoleteTag = '26.0';

/// <summary>
/// Reply to an e-mail using the provided account.
/// </summary>
Expand All @@ -30,4 +35,5 @@ interface "Email Connector v2" extends "Email Connector"
/// <param name="AccountId">The email account ID.</param>
/// <param name="ExternalId">The external ID of the email.</param>
procedure MarkAsRead(AccountId: Guid; ExternalId: Text);
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------

namespace System.Email;

/// <summary>
/// An e-mail connector interface enhances the "Email Connector" with reading, replying to e-mails and marking emails as read.
/// </summary>
interface "Email Connector v3" extends "Email Connector"
{
/// <summary>
/// Reply to an e-mail using the provided account.
/// </summary>
/// <param name="EmailMessage">The email message that is to be sent out.</param>
/// <param name="AccountId">The email account ID which is used to send out the email.</param>
procedure Reply(var EmailMessage: Codeunit "Email Message"; AccountId: Guid);

/// <summary>
/// Read e-mails from the provided account.
/// </summary>
/// <param name="AccountId">The email account ID which is used to send out the email.</param>
/// <param name="EmailInbox">The email inbox record that will store the emails.</param>
/// <param name="Filters">Filters to be used when retrieving emails.</param>
procedure RetrieveEmails(AccountId: Guid; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary);

/// <summary>
/// Mark an e-mail as read in the provided account.
/// </summary>
/// <param name="AccountId">The email account ID.</param>
/// <param name="ExternalId">The external ID of the email.</param>
procedure MarkAsRead(AccountId: Guid; ExternalId: Text);
}
15 changes: 14 additions & 1 deletion src/System Application/App/Email/src/Email/Email.Codeunit.al
Original file line number Diff line number Diff line change
Expand Up @@ -253,17 +253,30 @@ codeunit 8901 Email
#endregion

#region RetrieveEmails

#if not CLEAN26
/// <summary>
/// Retrieves emails from the email account.
/// </summary>
/// <param name="EmailAccountId">The ID of the email account to use for sending the email.</param>
/// <param name="EmailConnector">The email connector to use for sending the email.</param>
/// <param name="EmailInbox">The return record of all new emails that were retrieved.</param>
[Obsolete('Replaced by RetrieveEmails with an additional Filters parameter of type Record "Email Retrieval Filters".', '26.0')]
procedure RetrieveEmails(EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox")
begin
EmailImpl.RetrieveEmails(EmailAccountId, EmailConnector, EmailInbox);
end;
#endif
/// <summary>
/// Retrieves emails from the email account.
/// </summary>
/// <param name="EmailAccountId">The ID of the email account to use for sending the email.</param>
/// <param name="EmailConnector">The email connector to use for sending the email.</param>
/// <param name="EmailInbox">The return record of all new emails that were retrieved.</param>
/// <param name="Filters">Filters to be used when retrieving emails.</param>
procedure RetrieveEmails(EmailAccountId: Guid; EmailConnector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary)
begin
EmailImpl.RetrieveEmails(EmailAccountId, EmailConnector, EmailInbox, Filters);
end;

#endregion

Expand Down
85 changes: 74 additions & 11 deletions src/System Application/App/Email/src/Email/EmailImpl.Codeunit.al
Original file line number Diff line number Diff line change
Expand Up @@ -199,17 +199,41 @@ codeunit 8900 "Email Impl"

procedure RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox")
var
Filters: Record "Email Retrieval Filters";
begin
Filters.Insert();
RetrieveEmails(EmailAccountId, Connector, EmailInbox, Filters);
end;

procedure RetrieveEmails(EmailAccountId: Guid; Connector: Enum "Email Connector"; var EmailInbox: Record "Email Inbox"; var Filters: Record "Email Retrieval Filters" temporary)
var
#if not CLEAN26
#pragma warning disable AL0432
IEmailConnectorv2: Interface "Email Connector v2";
#pragma warning restore AL0432
#endif
IEmailConnectorv3: Interface "Email Connector v3";
begin
CheckRequiredPermissions();

if CheckAndGetEmailConnectorv3(Connector, IEmailConnectorv3) then begin
TelemetryAppsAndPublishers(TelemetryRetrieveEmailsUsedTxt);
IEmailConnectorv3.RetrieveEmails(EmailAccountId, EmailInbox, Filters);
EmailInbox.MarkedOnly(true);
exit;
end;
#if not CLEAN26
#pragma warning disable AL0432
if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then begin
#pragma warning restore AL0432
TelemetryAppsAndPublishers(TelemetryRetrieveEmailsUsedTxt);
IEmailConnectorv2.RetrieveEmails(EmailAccountId, EmailInbox);
end else
Error(EmailConnectorDoesNotSupportRetrievingEmailsErr);
EmailInbox.MarkedOnly(true);
exit;
end;
#endif

EmailInbox.MarkedOnly(true);
Error(EmailConnectorDoesNotSupportRetrievingEmailsErr);
end;

local procedure TelemetryAppsAndPublishers(Message: Text)
Expand All @@ -236,37 +260,76 @@ codeunit 8900 "Email Impl"

procedure MarkAsRead(EmailAccountId: Guid; Connector: Enum "Email Connector"; ExternalId: Text)
var
#if not CLEAN26
#pragma warning disable AL0432
IEmailConnectorv2: Interface "Email Connector v2";
#pragma warning restore AL0432
#endif
IEmailConnectorv3: Interface "Email Connector v3";
begin
CheckRequiredPermissions();

if ExternalId = '' then
Error(ExternalIdCannotBeEmptyErr);

if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then
IEmailConnectorv2.MarkAsRead(EmailAccountId, ExternalId)
else
Error(EmailConnectorDoesNotSupportMarkAsReadErr);
if CheckAndGetEmailConnectorv3(Connector, IEmailConnectorv3) then begin
IEmailConnectorv3.MarkAsRead(EmailAccountId, ExternalId);
exit;
end;
#if not CLEAN26
#pragma warning disable AL0432
if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then begin
#pragma warning restore AL0432
IEmailConnectorv2.MarkAsRead(EmailAccountId, ExternalId);
exit;
end;
#endif

Error(EmailConnectorDoesNotSupportMarkAsReadErr);
end;

procedure CheckReplySupported(Connector: Enum "Email Connector"): Boolean
var
#if not CLEAN26
#pragma warning disable AL0432
IEmailConnectorv2: Interface "Email Connector v2";
#pragma warning restore AL0432
#endif
IEmailConnectorv3: Interface "Email Connector v3";
begin
if not CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then
Error(EmailconnectorDoesNotSupportReplyingErr);
if CheckAndGetEmailConnectorv3(Connector, IEmailConnectorv3) then
exit(true);
#if not CLEAN26
#pragma warning disable AL0432
if CheckAndGetEmailConnectorv2(Connector, IEmailConnectorv2) then
exit(true);
#pragma warning restore AL0432
#endif

exit(true);
Error(EmailconnectorDoesNotSupportReplyingErr);
end;

#if not CLEAN26
#pragma warning disable AL0432
[Obsolete('Replaced by CheckAndGetEmailConnectorv3.', '26.0')]
procedure CheckAndGetEmailConnectorv2(Connector: Interface "Email Connector"; var Connectorv2: Interface "Email Connector v2"): Boolean
#pragma warning restore AL0432
begin
if Connector is "Email Connector v2" then begin
Connectorv2 := Connector as "Email Connector v2";
exit(true);
end else
exit(false);
end;
#endif

procedure CheckAndGetEmailConnectorv3(Connector: Interface "Email Connector"; var Connectorv3: Interface "Email Connector v3"): Boolean
begin
if Connector is "Email Connector v3" then begin
Connectorv3 := Connector as "Email Connector v3";
exit(true);
end else
exit(false);
end;

procedure OpenInEditor(EmailMessage: Codeunit "Email Message"; EmailScenario: Enum "Email Scenario"; IsModal: Boolean): Enum "Email Action"
var
Expand Down
Loading
Loading