Skip to content
Snippets Groups Projects
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();
}