Skip to content

Commit

Permalink
Merge pull request #215 from digipost/document_events
Browse files Browse the repository at this point in the history
Document events
  • Loading branch information
eivinhb authored Nov 10, 2023
2 parents 307f6df + 3e98927 commit ce447f5
Show file tree
Hide file tree
Showing 15 changed files with 385 additions and 52 deletions.
18 changes: 18 additions & 0 deletions Digipost.Api.Client.Common.Tests/Extensions/EnumExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,24 @@ public void Converts_All_Enum_Values()
}
}

public class ToEventType
{
[Fact]
public void Convert_All_Enum_Values()
{
var enumValues = Enum.GetValues(typeof(DocumentEventType));
var enumValuesDto = Enum.GetValues(typeof(V8.Event_Type));

Assert.Equal(enumValues.Length, enumValuesDto.Length);

foreach (var enumValue in enumValuesDto)
{
var currentEnum = (V8.Event_Type) enumValue;
currentEnum.ToEventType();
}
}
}

public class ToSensitivityLevel
{
[Fact]
Expand Down
33 changes: 18 additions & 15 deletions Digipost.Api.Client.Common/DataTransferObjectConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Digipost.Api.Client.Common.Entrypoint;
using Digipost.Api.Client.Common.Enums;
using Digipost.Api.Client.Common.Extensions;
using Digipost.Api.Client.Common.Identify;
using Digipost.Api.Client.Common.Print;
using Digipost.Api.Client.Common.Recipient;
using Digipost.Api.Client.Common.Search;
using Digipost.Api.Client.Common.SenderInfo;
using Digipost.Api.Client.Common.Extensions;
using Digipost.Api.Client.Send;
using V8;
using Identification = V8.Identification;
Expand All @@ -28,6 +28,23 @@ internal static Dictionary<string, Link> FromDataTransferObject(this IEnumerable
);
}

internal static DocumentEvents FromDataTransferObject(this Document_Events documentEvents)
{
return new DocumentEvents(documentEvents.Event.Select(FromDataTransferObject));
}

private static DocumentEvent FromDataTransferObject(this Event myEvent)
{
var documentEvent = new DocumentEvent(Guid.Parse(myEvent.Uuid), myEvent.Type.ToEventType(), myEvent.Created, myEvent.Document_Created);

if (myEvent.Metadata is Request_For_Registration_Expired_Metadata forRegistrationExpiredMetadata)
{
documentEvent.EventMetadata = new RequestForRegistrationExpiredMetadata(forRegistrationExpiredMetadata.Fallback_Channel);
}

return documentEvent;
}

internal static Identification ToDataTransferObject(this IIdentification identification)
{
Identification identificationDto = null;
Expand Down Expand Up @@ -407,19 +424,5 @@ internal static SearchDetailsResult FromDataTransferObject(this V8.Recipients re
};
}

internal static HashAlgoritm ToHashAlgoritm(this V8.Hash_Algorithm hashAlgorithm)
{
switch (hashAlgorithm)
{
case Hash_Algorithm.NONE:
return HashAlgoritm.NONE;
case Hash_Algorithm.MD5:
return HashAlgoritm.MD5;
case Hash_Algorithm.SHA256:
return HashAlgoritm.SHA256;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
65 changes: 65 additions & 0 deletions Digipost.Api.Client.Common/DocumentEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Digipost.Api.Client.Common.Enums;

namespace Digipost.Api.Client.Common
{
public class DocumentEvents : IEnumerable<DocumentEvent>
{
private readonly IEnumerable<DocumentEvent> _events;

public DocumentEvents(IEnumerable<DocumentEvent> events)
{
_events = events;
}

public IEnumerator<DocumentEvent> GetEnumerator()
{
return _events.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

public class DocumentEvent
{
public Guid Guid { get; }

public DocumentEventType EventType { get; }

public DateTime Created { get; }

public DateTime DocumentCreated { get; }

public EventMetadata EventMetadata { get; set; }

public DocumentEvent(Guid guid, DocumentEventType eventType, DateTime created, DateTime documentCreated)
{
Guid = guid;
EventType = eventType;
Created = created;
DocumentCreated = documentCreated;
}
}

public abstract class EventMetadata
{
}

public class RequestForRegistrationExpiredMetadata : EventMetadata
{
/// <summary>
/// Values of FallbackChannel might be 'none' or 'print'.
/// </summary>
public string FallbackChannel { get; }

public RequestForRegistrationExpiredMetadata(string fallbackChannel)
{
FallbackChannel = fallbackChannel;
}
}
}
5 changes: 5 additions & 0 deletions Digipost.Api.Client.Common/Entrypoint/Entrypoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ public GetArchiveDocumentByUuidUri GetGetArchiveDocumentsByUuidUri(Guid guid)
return new GetArchiveDocumentByUuidUri(Links["GET_ARCHIVE_DOCUMENT_BY_UUID"], guid);
}

public DocumentEventsUri GetDocumentEventsUri(Sender sender, DateTime from, DateTime to, int offset, int maxResults)
{
return new DocumentEventsUri(Links["DOCUMENT_EVENTS"], sender, from, to, offset, maxResults);
}

public DocumentStatusUri GetDocumentStatusUri(Guid guid)
{
return new DocumentStatusUri(Links["DOCUMENT_STATUS"], guid);
Expand Down
20 changes: 20 additions & 0 deletions Digipost.Api.Client.Common/Enums/DocumentEventType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Digipost.Api.Client.Common.Enums
{
public enum DocumentEventType
{
EmailNotificationFailed,
EmailMessageSent,
EmailMessageFailed,
SmsNotificationFailed,
Opened,
MoveFilesFromPublicSector,
Postmarked,
PrintFailed,
Shredded,
PeppolDelivered,
PeppolFailed,
RequestForRegistrationExpired,
RequestForRegistrationDeliveredDigipost,
RequestForRegistrationFailed,
}
}
50 changes: 50 additions & 0 deletions Digipost.Api.Client.Common/Extensions/EnumExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Linq;
using System.Text.RegularExpressions;
using Digipost.Api.Client.Common.Enums;
using V8;

Expand Down Expand Up @@ -79,6 +81,21 @@ internal static DeliveryMethod ToDeliveryMethod(this V8.Channel deliveryMethod)
}
}

internal static HashAlgoritm ToHashAlgoritm(this V8.Hash_Algorithm hashAlgorithm)
{
switch (hashAlgorithm)
{
case Hash_Algorithm.NONE:
return HashAlgoritm.NONE;
case Hash_Algorithm.MD5:
return HashAlgoritm.MD5;
case Hash_Algorithm.SHA256:
return HashAlgoritm.SHA256;
default:
throw new ArgumentOutOfRangeException();
}
}

internal static MessageStatus ToMessageStatus(this V8.Message_Status messagestatus)
{
switch (messagestatus)
Expand Down Expand Up @@ -121,5 +138,38 @@ internal static SensitivityLevel ToSensitivityLevel(this V8.Sensitivity_Level se
throw new ArgumentOutOfRangeException(nameof(sensitivitylevel), sensitivitylevel, null);
}
}

internal static DocumentEventType ToEventType(this V8.Event_Type eventType)
{
return MapEnum<DocumentEventType>(eventType);
}

private static TTargetEnum MapEnum<TTargetEnum>(Enum sourceEnum) where TTargetEnum : Enum
{
Type targetEnumType = typeof(TTargetEnum);

string sourceEnumName = sourceEnum.ToString();
string[] targetEnumNames = Enum.GetNames(targetEnumType);

string mappedValueName = targetEnumNames.FirstOrDefault(
targetName => string.Equals(
RemoveUnderscores(targetName),
RemoveUnderscores(sourceEnumName),
StringComparison.OrdinalIgnoreCase
)
);

if (!string.IsNullOrEmpty(mappedValueName))
{
object mappedValue = Enum.Parse(targetEnumType, mappedValueName);
return (TTargetEnum)mappedValue;
}

throw new ArgumentException($"Enum value {sourceEnum} not found in {targetEnumType.Name} enum.");
}
private static string RemoveUnderscores(string input)
{
return Regex.Replace(input, "_", string.Empty);
}
}
}
17 changes: 15 additions & 2 deletions Digipost.Api.Client.Common/Relations/ApiRelations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,11 @@ public class SenderInformationUri : Uri
public SenderInformationUri(Link link, Sender sender)
: base($"{link.Uri}/{sender.Id}", UriKind.Absolute)
{

}

public SenderInformationUri(Link link, string organisationNumber, string partId)
: base($"{link.Uri}?org_id={organisationNumber}&part_id={partId}", UriKind.Absolute)
{

}
}

Expand Down Expand Up @@ -174,6 +173,20 @@ public ArchiveDocumentDeleteUri(Link link)
}
}

public class DocumentEventsUri : Uri
{
public DocumentEventsUri(Link link, Sender sender, DateTime from, DateTime to, int offset, int maxResults)
: base($"{link.Uri}?sender={sender.Id}&from={DatetimeFormatter(from)}&to={DatetimeFormatter(to)}&offset={offset}&maxResults={maxResults}", UriKind.Absolute)
{

}

private static string DatetimeFormatter(DateTime? dt)
{
return HttpUtility.UrlEncode(dt?.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK"));
}
}

public class DocumentStatusUri : Uri
{
public DocumentStatusUri(Link link, Guid guid)
Expand Down
22 changes: 18 additions & 4 deletions Digipost.Api.Client.Docs/DocumentsExamples.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Digipost.Api.Client.Common;
using Digipost.Api.Client.Common.Enums;
using Digipost.Api.Client.Send;

namespace Digipost.Api.Client.Docs
Expand All @@ -11,15 +14,26 @@ public class DocumentsExamples
private static readonly Sender Sender;
#pragma warning restore 0649

public void Hent_document_status()
public async void Hent_document_status()
{
DocumentStatus documentStatus = Client.GetDocumentStatus(Sender)
.GetDocumentStatus(Guid.Parse("10ff4c99-8560-4741-83f0-1093dc4deb1c"))
.Result;
DocumentStatus documentStatus = await Client.DocumentsApi()
.GetDocumentStatus(Guid.Parse("10ff4c99-8560-4741-83f0-1093dc4deb1c"));

// example information:
// documentStatus.DeliveryStatus => DELIVERED
// documentStatus.DeliveryMethod => PRINT
}

public async void Hent_document_events_last_5_minutes_max100()
{
// Fetch max 100 events last 5 minutes
// Beware that there might be more events. So you must fetch more events by adding to the offset
// until you get 0 or less than 100 events.
// Then you can start again from the previous `to` datetime as `from`
DocumentEvents events = await Client.DocumentsApi(Sender)
.GetDocumentEvents(from: DateTime.Now.Subtract(TimeSpan.FromMinutes(5)), to: DateTime.Now, offset: 0, maxResults: 100);

IEnumerable<DocumentEventType> documentEventTypes = events.Select(aEvent => aEvent.EventType);
}
}
}
3 changes: 1 addition & 2 deletions Digipost.Api.Client.Docs/SendExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using Digipost.Api.Client.Common.Identify;
using Digipost.Api.Client.Common.Print;
using Digipost.Api.Client.Common.Recipient;
using Digipost.Api.Client.Common.Relations;
using Digipost.Api.Client.Common.Utilities;
using Digipost.Api.Client.DataTypes.Core;
using Digipost.Api.Client.Send;
Expand Down Expand Up @@ -428,7 +427,7 @@ public void SendMessageWithExternalLinkMetadata()

public void SendMessageWithSenderInformation()
{
var senderInformation = client.GetSenderInformation(sender, new SenderOrganisation("9876543210", "thePartId"));
var senderInformation = client.GetSenderInformation(new SenderOrganisation("9876543210", "thePartId"));

var message = new Message(
senderInformation.Sender,
Expand Down
Loading

0 comments on commit ce447f5

Please sign in to comment.