Skip to content

Commit ce447f5

Browse files
authored
Merge pull request #215 from digipost/document_events
Document events
2 parents 307f6df + 3e98927 commit ce447f5

File tree

15 files changed

+385
-52
lines changed

15 files changed

+385
-52
lines changed

Digipost.Api.Client.Common.Tests/Extensions/EnumExtensionsTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ public void Converts_All_Enum_Values()
2828
}
2929
}
3030

31+
public class ToEventType
32+
{
33+
[Fact]
34+
public void Convert_All_Enum_Values()
35+
{
36+
var enumValues = Enum.GetValues(typeof(DocumentEventType));
37+
var enumValuesDto = Enum.GetValues(typeof(V8.Event_Type));
38+
39+
Assert.Equal(enumValues.Length, enumValuesDto.Length);
40+
41+
foreach (var enumValue in enumValuesDto)
42+
{
43+
var currentEnum = (V8.Event_Type) enumValue;
44+
currentEnum.ToEventType();
45+
}
46+
}
47+
}
48+
3149
public class ToSensitivityLevel
3250
{
3351
[Fact]

Digipost.Api.Client.Common/DataTransferObjectConverter.cs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
44
using System.Linq;
5-
using Digipost.Api.Client.Common.Entrypoint;
65
using Digipost.Api.Client.Common.Enums;
76
using Digipost.Api.Client.Common.Extensions;
87
using Digipost.Api.Client.Common.Identify;
98
using Digipost.Api.Client.Common.Print;
109
using Digipost.Api.Client.Common.Recipient;
1110
using Digipost.Api.Client.Common.Search;
1211
using Digipost.Api.Client.Common.SenderInfo;
12+
using Digipost.Api.Client.Common.Extensions;
1313
using Digipost.Api.Client.Send;
1414
using V8;
1515
using Identification = V8.Identification;
@@ -28,6 +28,23 @@ internal static Dictionary<string, Link> FromDataTransferObject(this IEnumerable
2828
);
2929
}
3030

31+
internal static DocumentEvents FromDataTransferObject(this Document_Events documentEvents)
32+
{
33+
return new DocumentEvents(documentEvents.Event.Select(FromDataTransferObject));
34+
}
35+
36+
private static DocumentEvent FromDataTransferObject(this Event myEvent)
37+
{
38+
var documentEvent = new DocumentEvent(Guid.Parse(myEvent.Uuid), myEvent.Type.ToEventType(), myEvent.Created, myEvent.Document_Created);
39+
40+
if (myEvent.Metadata is Request_For_Registration_Expired_Metadata forRegistrationExpiredMetadata)
41+
{
42+
documentEvent.EventMetadata = new RequestForRegistrationExpiredMetadata(forRegistrationExpiredMetadata.Fallback_Channel);
43+
}
44+
45+
return documentEvent;
46+
}
47+
3148
internal static Identification ToDataTransferObject(this IIdentification identification)
3249
{
3350
Identification identificationDto = null;
@@ -407,19 +424,5 @@ internal static SearchDetailsResult FromDataTransferObject(this V8.Recipients re
407424
};
408425
}
409426

410-
internal static HashAlgoritm ToHashAlgoritm(this V8.Hash_Algorithm hashAlgorithm)
411-
{
412-
switch (hashAlgorithm)
413-
{
414-
case Hash_Algorithm.NONE:
415-
return HashAlgoritm.NONE;
416-
case Hash_Algorithm.MD5:
417-
return HashAlgoritm.MD5;
418-
case Hash_Algorithm.SHA256:
419-
return HashAlgoritm.SHA256;
420-
default:
421-
throw new ArgumentOutOfRangeException();
422-
}
423-
}
424427
}
425428
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using Digipost.Api.Client.Common.Enums;
5+
6+
namespace Digipost.Api.Client.Common
7+
{
8+
public class DocumentEvents : IEnumerable<DocumentEvent>
9+
{
10+
private readonly IEnumerable<DocumentEvent> _events;
11+
12+
public DocumentEvents(IEnumerable<DocumentEvent> events)
13+
{
14+
_events = events;
15+
}
16+
17+
public IEnumerator<DocumentEvent> GetEnumerator()
18+
{
19+
return _events.GetEnumerator();
20+
}
21+
22+
IEnumerator IEnumerable.GetEnumerator()
23+
{
24+
return GetEnumerator();
25+
}
26+
}
27+
28+
public class DocumentEvent
29+
{
30+
public Guid Guid { get; }
31+
32+
public DocumentEventType EventType { get; }
33+
34+
public DateTime Created { get; }
35+
36+
public DateTime DocumentCreated { get; }
37+
38+
public EventMetadata EventMetadata { get; set; }
39+
40+
public DocumentEvent(Guid guid, DocumentEventType eventType, DateTime created, DateTime documentCreated)
41+
{
42+
Guid = guid;
43+
EventType = eventType;
44+
Created = created;
45+
DocumentCreated = documentCreated;
46+
}
47+
}
48+
49+
public abstract class EventMetadata
50+
{
51+
}
52+
53+
public class RequestForRegistrationExpiredMetadata : EventMetadata
54+
{
55+
/// <summary>
56+
/// Values of FallbackChannel might be 'none' or 'print'.
57+
/// </summary>
58+
public string FallbackChannel { get; }
59+
60+
public RequestForRegistrationExpiredMetadata(string fallbackChannel)
61+
{
62+
FallbackChannel = fallbackChannel;
63+
}
64+
}
65+
}

Digipost.Api.Client.Common/Entrypoint/Entrypoint.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public GetArchiveDocumentByUuidUri GetGetArchiveDocumentsByUuidUri(Guid guid)
8080
return new GetArchiveDocumentByUuidUri(Links["GET_ARCHIVE_DOCUMENT_BY_UUID"], guid);
8181
}
8282

83+
public DocumentEventsUri GetDocumentEventsUri(Sender sender, DateTime from, DateTime to, int offset, int maxResults)
84+
{
85+
return new DocumentEventsUri(Links["DOCUMENT_EVENTS"], sender, from, to, offset, maxResults);
86+
}
87+
8388
public DocumentStatusUri GetDocumentStatusUri(Guid guid)
8489
{
8590
return new DocumentStatusUri(Links["DOCUMENT_STATUS"], guid);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace Digipost.Api.Client.Common.Enums
2+
{
3+
public enum DocumentEventType
4+
{
5+
EmailNotificationFailed,
6+
EmailMessageSent,
7+
EmailMessageFailed,
8+
SmsNotificationFailed,
9+
Opened,
10+
MoveFilesFromPublicSector,
11+
Postmarked,
12+
PrintFailed,
13+
Shredded,
14+
PeppolDelivered,
15+
PeppolFailed,
16+
RequestForRegistrationExpired,
17+
RequestForRegistrationDeliveredDigipost,
18+
RequestForRegistrationFailed,
19+
}
20+
}

Digipost.Api.Client.Common/Extensions/EnumExtensions.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Linq;
3+
using System.Text.RegularExpressions;
24
using Digipost.Api.Client.Common.Enums;
35
using V8;
46

@@ -79,6 +81,21 @@ internal static DeliveryMethod ToDeliveryMethod(this V8.Channel deliveryMethod)
7981
}
8082
}
8183

84+
internal static HashAlgoritm ToHashAlgoritm(this V8.Hash_Algorithm hashAlgorithm)
85+
{
86+
switch (hashAlgorithm)
87+
{
88+
case Hash_Algorithm.NONE:
89+
return HashAlgoritm.NONE;
90+
case Hash_Algorithm.MD5:
91+
return HashAlgoritm.MD5;
92+
case Hash_Algorithm.SHA256:
93+
return HashAlgoritm.SHA256;
94+
default:
95+
throw new ArgumentOutOfRangeException();
96+
}
97+
}
98+
8299
internal static MessageStatus ToMessageStatus(this V8.Message_Status messagestatus)
83100
{
84101
switch (messagestatus)
@@ -121,5 +138,38 @@ internal static SensitivityLevel ToSensitivityLevel(this V8.Sensitivity_Level se
121138
throw new ArgumentOutOfRangeException(nameof(sensitivitylevel), sensitivitylevel, null);
122139
}
123140
}
141+
142+
internal static DocumentEventType ToEventType(this V8.Event_Type eventType)
143+
{
144+
return MapEnum<DocumentEventType>(eventType);
145+
}
146+
147+
private static TTargetEnum MapEnum<TTargetEnum>(Enum sourceEnum) where TTargetEnum : Enum
148+
{
149+
Type targetEnumType = typeof(TTargetEnum);
150+
151+
string sourceEnumName = sourceEnum.ToString();
152+
string[] targetEnumNames = Enum.GetNames(targetEnumType);
153+
154+
string mappedValueName = targetEnumNames.FirstOrDefault(
155+
targetName => string.Equals(
156+
RemoveUnderscores(targetName),
157+
RemoveUnderscores(sourceEnumName),
158+
StringComparison.OrdinalIgnoreCase
159+
)
160+
);
161+
162+
if (!string.IsNullOrEmpty(mappedValueName))
163+
{
164+
object mappedValue = Enum.Parse(targetEnumType, mappedValueName);
165+
return (TTargetEnum)mappedValue;
166+
}
167+
168+
throw new ArgumentException($"Enum value {sourceEnum} not found in {targetEnumType.Name} enum.");
169+
}
170+
private static string RemoveUnderscores(string input)
171+
{
172+
return Regex.Replace(input, "_", string.Empty);
173+
}
124174
}
125175
}

Digipost.Api.Client.Common/Relations/ApiRelations.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ public class SenderInformationUri : Uri
2121
public SenderInformationUri(Link link, Sender sender)
2222
: base($"{link.Uri}/{sender.Id}", UriKind.Absolute)
2323
{
24-
2524
}
25+
2626
public SenderInformationUri(Link link, string organisationNumber, string partId)
2727
: base($"{link.Uri}?org_id={organisationNumber}&part_id={partId}", UriKind.Absolute)
2828
{
29-
3029
}
3130
}
3231

@@ -174,6 +173,20 @@ public ArchiveDocumentDeleteUri(Link link)
174173
}
175174
}
176175

176+
public class DocumentEventsUri : Uri
177+
{
178+
public DocumentEventsUri(Link link, Sender sender, DateTime from, DateTime to, int offset, int maxResults)
179+
: base($"{link.Uri}?sender={sender.Id}&from={DatetimeFormatter(from)}&to={DatetimeFormatter(to)}&offset={offset}&maxResults={maxResults}", UriKind.Absolute)
180+
{
181+
182+
}
183+
184+
private static string DatetimeFormatter(DateTime? dt)
185+
{
186+
return HttpUtility.UrlEncode(dt?.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK"));
187+
}
188+
}
189+
177190
public class DocumentStatusUri : Uri
178191
{
179192
public DocumentStatusUri(Link link, Guid guid)
Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using Digipost.Api.Client.Common;
5+
using Digipost.Api.Client.Common.Enums;
36
using Digipost.Api.Client.Send;
47

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

14-
public void Hent_document_status()
17+
public async void Hent_document_status()
1518
{
16-
DocumentStatus documentStatus = Client.GetDocumentStatus(Sender)
17-
.GetDocumentStatus(Guid.Parse("10ff4c99-8560-4741-83f0-1093dc4deb1c"))
18-
.Result;
19+
DocumentStatus documentStatus = await Client.DocumentsApi()
20+
.GetDocumentStatus(Guid.Parse("10ff4c99-8560-4741-83f0-1093dc4deb1c"));
1921

2022
// example information:
2123
// documentStatus.DeliveryStatus => DELIVERED
2224
// documentStatus.DeliveryMethod => PRINT
2325
}
26+
27+
public async void Hent_document_events_last_5_minutes_max100()
28+
{
29+
// Fetch max 100 events last 5 minutes
30+
// Beware that there might be more events. So you must fetch more events by adding to the offset
31+
// until you get 0 or less than 100 events.
32+
// Then you can start again from the previous `to` datetime as `from`
33+
DocumentEvents events = await Client.DocumentsApi(Sender)
34+
.GetDocumentEvents(from: DateTime.Now.Subtract(TimeSpan.FromMinutes(5)), to: DateTime.Now, offset: 0, maxResults: 100);
35+
36+
IEnumerable<DocumentEventType> documentEventTypes = events.Select(aEvent => aEvent.EventType);
37+
}
2438
}
2539
}

Digipost.Api.Client.Docs/SendExamples.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Digipost.Api.Client.Common.Identify;
55
using Digipost.Api.Client.Common.Print;
66
using Digipost.Api.Client.Common.Recipient;
7-
using Digipost.Api.Client.Common.Relations;
87
using Digipost.Api.Client.Common.Utilities;
98
using Digipost.Api.Client.DataTypes.Core;
109
using Digipost.Api.Client.Send;
@@ -428,7 +427,7 @@ public void SendMessageWithExternalLinkMetadata()
428427

429428
public void SendMessageWithSenderInformation()
430429
{
431-
var senderInformation = client.GetSenderInformation(sender, new SenderOrganisation("9876543210", "thePartId"));
430+
var senderInformation = client.GetSenderInformation(new SenderOrganisation("9876543210", "thePartId"));
432431

433432
var message = new Message(
434433
senderInformation.Sender,

0 commit comments

Comments
 (0)