Newer
Older
using System.Text.RegularExpressions;
using FitConnect.Interfaces.Sender;
using FitConnect.Models;
using Microsoft.Extensions.Logging;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace FitConnect;
public class SubmissionBuilder : IEmptySubmission, ISubmissionWithDestination,
ISubmissionWithServiceType, ISubmissionWithAttachments, ISubmissionWithData {
public class SubmissionToSend {
public string? DestinationId { get; internal set; }
public string? ServiceName { get; internal set; }
public string? LeikaKey { get; internal set; }
public Attachment[]? Attachments { get; internal set; }
public string? Data { get; internal set; }
}
private SubmissionToSend _submissionToSend;
private ILogger? _logger;
public static IEmptySubmission Create(ILogger? logger = null) {
return new SubmissionBuilder(logger);
}
private SubmissionBuilder(ILogger? logger) {
_submissionToSend = new SubmissionToSend();
_logger = logger;
}
public ISubmissionWithDestination WithDestination(string destinationId) {
if (!Regex.IsMatch(destinationId,
"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"))
throw new ArgumentException("The destination must be a valid GUID");
_submissionToSend.DestinationId = destinationId;
return this;
}
public ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey) {
if (string.IsNullOrWhiteSpace(leikaKey) || !Regex.IsMatch(leikaKey,
"^urn:[a-z0-9][a-z0-9-]{0,31}:[a-z0-9()+,.:=@;$_!*'%/?#-]+$")) {
_logger?.LogError("The leikaKey must be a valid URN");
throw new ArgumentException("Invalid leika key");
}
_submissionToSend.ServiceName = serviceName;
_submissionToSend.LeikaKey = leikaKey;
return this;
}
public ISubmissionWithAttachments WithAttachments(List<Attachment> attachments) =>
WithAttachments(attachments.ToArray());
public ISubmissionWithAttachments WithAttachments(params Attachment[] attachments) {
_submissionToSend.Attachments = attachments;
return this;
}
public ISubmissionWithData WithData(string data) {
try {
JsonConvert.DeserializeObject(data);
}
catch (Exception e) {
throw new ArgumentException("The data must be valid JSON string", e);
}
_submissionToSend.Data = data;
return this;
}
public SubmissionToSend Build() => _submissionToSend;
}
public interface IEmptySubmission {
ISubmissionWithDestination WithDestination(string destinationId);
}
public interface ISubmissionWithDestination {
ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey);
}
public interface ISubmissionWithServiceType {
ISubmissionWithAttachments WithAttachments(params Attachment[] attachments);
ISubmissionWithAttachments WithAttachments(List<Attachment> attachments);