Skip to content
Snippets Groups Projects
SubmissionBuilder.cs 2.86 KiB
Newer Older
using System.Net.Mime;
using System.Text.RegularExpressions;
Klaus Fischer's avatar
Klaus Fischer committed
using System.Xml;
using FitConnect.Models;
Klaus Fischer's avatar
Klaus Fischer committed
using Newtonsoft.Json;

namespace FitConnect;

public class SubmissionBuilder : ISubmissionWithDestination,
    ISubmissionWithServiceType, ISubmissionWithData {
    protected readonly SendableSubmission _submissionToSend;
    private protected SubmissionBuilder(string destinationId) {
        _submissionToSend = new SendableSubmission(destinationId);
    public ISubmissionWithData WithAttachments(List<Attachment> attachments) {
        return WithAttachments(attachments.ToArray());
    }
    public ISubmissionWithData WithAttachments(params Attachment[] attachments) {
        _submissionToSend.Attachments = attachments;
        return this;
    }

    public SendableSubmission Build() {
        return _submissionToSend;
    }

    public ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey) {
        if (string.IsNullOrWhiteSpace(leikaKey) || !Regex.IsMatch(leikaKey,
                FitConnectClient.LeikaKeyPattern))
            throw new ArgumentException("Invalid leika key");

        _submissionToSend.ServiceName = serviceName;
        _submissionToSend.LeikaKey = leikaKey;
        return this;
    }

Klaus Fischer's avatar
Klaus Fischer committed
    public ISubmissionWithData WithXmlData(string data) {
        try {
            var doc = new XmlDocument();
            doc.LoadXml(data);
        }
        catch (Exception e) {
            throw new ArgumentException("The data must be valid XML string", e);
        }

        _submissionToSend.Data = data;
        _submissionToSend.DataMimeType = MediaTypeNames.Application.Xml;
Klaus Fischer's avatar
Klaus Fischer committed
        return this;
    }

Klaus Fischer's avatar
Klaus Fischer committed
    public ISubmissionWithData WithJsonData(string data) {
Klaus Fischer's avatar
Klaus Fischer committed
        try {
            JsonConvert.DeserializeObject(data);
        }
        catch (Exception e) {
            throw new ArgumentException("The data must be valid JSON string", e);
        }

        _submissionToSend.Data = data;
        _submissionToSend.DataMimeType = MediaTypeNames.Application.Json;
    public static ISubmissionWithDestination WithDestination(string destinationId) {
        if (!Regex.IsMatch(destinationId,
                FitConnectClient.GuidPattern))
            throw new ArgumentException("The destination must be a valid GUID");
        var result = new SubmissionBuilder(destinationId);
        return result;
    }
}

public interface ISubmissionWithDestination {
    ISubmissionWithServiceType WithServiceType(string serviceName, string leikaKey);
}

public interface ISubmissionWithServiceType {
    ISubmissionWithData WithJsonData(string data);
Klaus Fischer's avatar
Klaus Fischer committed
    ISubmissionWithData WithXmlData(string data);
}

public interface ISubmissionWithData {
    ISubmissionWithData WithAttachments(params Attachment[] attachments);
    ISubmissionWithData WithAttachments(List<Attachment> attachments);

    SendableSubmission Build();
}