// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System.Text.Json.Serialization; using Microsoft.Teams.Apps.Handlers.TaskModules; namespace Microsoft.Teams.Apps.Handlers.MessageExtension; /// /// Represents a response from a message extension action that can contain either a task module or compose extension response. /// public class MessageExtensionActionResponse { /// /// The task module result. /// [JsonPropertyName("task")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public Response? Task { get; set; } /// /// The compose extension result (for message extension results, auth, config, etc.). /// [JsonPropertyName("composeExtension")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public ComposeExtension? ComposeExtension { get; set; } /// /// Creates a new builder for MessageExtensionActionResponse. /// public static MessageExtensionActionResponseBuilder CreateBuilder() { return new MessageExtensionActionResponseBuilder(); } } /// /// Builder for MessageExtensionActionResponse. /// public class MessageExtensionActionResponseBuilder { private TaskModuleResponse? _taskResponse; private MessageExtensionResponse? _extensionResponse; /// /// Sets the task module response using a TaskModuleResponseBuilder. /// public MessageExtensionActionResponseBuilder WithTask(TaskModuleResponseBuilder builder) { ArgumentNullException.ThrowIfNull(builder); _taskResponse = builder.Validate(); return this; } /// /// Sets the compose extension response using a MessageExtensionResponseBuilder. /// public MessageExtensionActionResponseBuilder WithComposeExtension(MessageExtensionResponseBuilder builder) { ArgumentNullException.ThrowIfNull(builder); _extensionResponse = builder.Validate(); return this; } /// /// Validates and builds the MessageExtensionActionResponse. /// private MessageExtensionActionResponse Validate() { if (_taskResponse == null && _extensionResponse == null) { throw new InvalidOperationException("Either Task or ComposeExtension must be set. Use WithTask() or WithComposeExtension()."); } if (_taskResponse != null && _extensionResponse != null) { throw new InvalidOperationException("Cannot set both Task and ComposeExtension. Use either WithTask() or WithComposeExtension(), not both."); } return new MessageExtensionActionResponse { Task = _taskResponse?.Task, ComposeExtension = _extensionResponse?.ComposeExtension }; } /// /// Builds the MessageExtensionActionResponse and wraps it in an . /// /// The HTTP status code (default: 200). public InvokeResponse Build(int statusCode = 200) { return new InvokeResponse(statusCode, Validate()); } }