// 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());
}
}