-
Klaus Fischer authoredKlaus Fischer authored
SubmissionBuilder.cs 2.73 KiB
using System.Text.RegularExpressions;
using FitConnect.Interfaces.Sender;
using FitConnect.Models;
using Microsoft.Extensions.Logging;
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(params Attachment[] attachments) {
_submissionToSend.Attachments = attachments;
return this;
}
public ISubmissionWithData WithData(string data) {
_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);
}
public interface ISubmissionWithAttachments {
ISubmissionWithData WithData(string data);
}
public interface ISubmissionWithData {
SubmissionBuilder.SubmissionToSend Build();
}