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

namespace FitConnect;

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

    public ISubmissionWithData WithData(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;
        return this;
    }

    public SendableSubmission Build() => _submissionToSend;
public class SendableSubmission {
    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; }

    internal SendableSubmission(string destinationId) {
        DestinationId = destinationId;
    }
}

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

public interface ISubmissionWithServiceType {
    ISubmissionWithAttachments WithAttachments(params Attachment[] attachments);
Klaus Fischer's avatar
Klaus Fischer committed
    ISubmissionWithAttachments WithAttachments(List<Attachment> attachments);
}

public interface ISubmissionWithAttachments {
    ISubmissionWithData WithData(string data);
}

public interface ISubmissionWithData {
    SendableSubmission Build();
}