in src/JetBrains.Space.AspNetCore/Experimental/WebHooks/SpaceWebHookRequestHandler.cs [54:200]
public async Task HandleAsync(HttpContext context, string? optionsName)
{
// Read payload
var readPayloadResult = await TryReadPayloadFromRequestAsync(context.Request);
if (!readPayloadResult.Succeeded || readPayloadResult.PayloadJson == null || readPayloadResult.Payload == null)
{
await WriteTextResponse(context.Response, 400, "The request payload could not be read. Check the application log for more information.");
return;
}
// Determine handler
var handler = context.RequestServices.GetRequiredService<TWebHookHandler>();
// Determine options to use (in case multiple are registered)
var options = optionsName != null
? _options.Get(optionsName)
: _options.Value;
var configuredOptions = await handler.ConfigureRequestValidationOptionsAsync(
// REVIEW: Is there a faster way of doing a deep copy of an options DTO?
options: JsonSerializer.Deserialize<SpaceWebHookOptions>(JsonSerializer.Serialize(options))!,
payload: readPayloadResult.Payload);
// Validate payload
if (!await IsValidPayloadAsync(configuredOptions, context, readPayloadResult.PayloadJson, readPayloadResult.Payload))
{
await WriteTextResponse(context.Response, 400, "The request could not be validated. Check the application log for more information.");
return;
}
// Handle sync epoch header
if (configuredOptions.ServerUrl != null)
{
if (context.Request.Headers.TryGetValue(EpochTrackerHeaders.SyncEpoch, out var syncEpochHeaders) &&
syncEpochHeaders.Count > 0 &&
long.TryParse(syncEpochHeaders[0], out var syncEpoch))
{
_epochTracker.UpdateEpochFor(configuredOptions.ServerUrl, syncEpoch);
}
}
// Handle payload
switch (readPayloadResult.Payload)
{
// List commands?
case ListCommandsPayload listCommandsPayload:
var commands = await handler.HandleListCommandsAsync(listCommandsPayload);
PropagatePropertyAccessPathHelper.SetAccessPathForValue(string.Empty, false, commands);
// ReSharper disable once ConstantNullCoalescingCondition
commands.CommandsItems ??= new List<CommandDetail>();
await WriteJsonResponse(context.Response, 200, commands);
return;
// Message?
case MessagePayload messagePayload:
await handler.HandleMessageAsync(messagePayload);
await WriteTextResponse(context.Response, 200);
return;
// Action?
case MessageActionPayload actionPayload:
var actionResult = await handler.HandleMessageActionAsync(actionPayload);
await WriteJsonResponse(context.Response, 200, actionResult);
return;
// Menu action?
case MenuActionPayload menuActionPayload:
var menuActionResult = await handler.HandleMenuActionAsync(menuActionPayload);
await WriteJsonResponse(context.Response, 200, menuActionResult);
return;
// Webhook?
case WebhookRequestPayload webhookRequestPayload:
var webhookActionResult = await handler.HandleWebhookRequestAsync(webhookRequestPayload);
await WriteApplicationExecutionResultAsync(context.Response, webhookActionResult);
return;
// New external issue requests are available?
case NewExternalIssueEventPayload externalIssuePayload:
var externalIssueResult = await handler.HandleNewExternalIssueEventAsync(externalIssuePayload);
await WriteApplicationExecutionResultAsync(context.Response, externalIssueResult);
return;
// New unfurl requests are available?
case NewUnfurlQueueItemsPayload unfurlRequestPayload:
var unfurlQueueResult = await handler.HandleNewUnfurlQueueItemsAsync(unfurlRequestPayload);
await WriteApplicationExecutionResultAsync(context.Response, unfurlQueueResult);
return;
// New unfurl actions are available?
case UnfurlActionPayload unfurlActionPayload:
var unfurlActionResult = await handler.HandleUnfurlActionPayloadAsync(unfurlActionPayload);
await WriteApplicationExecutionResultAsync(context.Response, unfurlActionResult);
return;
// Custom action?
case CustomActionPayload customActionPayload:
var customActionResult = await handler.HandleCustomActionAsync(customActionPayload);
await WriteApplicationExecutionResultAsync(context.Response, customActionResult);
return;
// Application initialized in Space organization?
case InitPayload initPayload:
var initActionResult = await handler.HandleInitAsync(initPayload);
await WriteApplicationExecutionResultAsync(context.Response, initActionResult);
return;
// Application uninstalled from Space organization?
case ApplicationUninstalledPayload uninstallPayload:
var uninstallActionResult = await handler.HandleUninstalledAsync(uninstallPayload);
await WriteApplicationExecutionResultAsync(context.Response, uninstallActionResult);
return;
// Client secret updated in Space organization?
case ChangeClientSecretPayload changeClientSecretPayload:
var changeClientSecretActionResult = await handler.HandleChangeClientSecretRequestAsync(changeClientSecretPayload);
await WriteApplicationExecutionResultAsync(context.Response, changeClientSecretActionResult);
return;
// Server URL updated in Space organization?
case ChangeServerUrlPayload changeServerUrlPayload:
var changeServerUrlActionResult = await handler.HandleChangeServerUrlAsync(changeServerUrlPayload);
await WriteApplicationExecutionResultAsync(context.Response, changeServerUrlActionResult);
return;
// Create external issue?
case CreateExternalIssueRequestPayload createExternalIssueRequestPayload:
var createExternalIssueRequestResult = await handler.HandleCreateExternalIssueRequestAsync(createExternalIssueRequestPayload);
await WriteApplicationExecutionResultAsync(context.Response, createExternalIssueRequestResult);
return;
// Publication check?
case AppPublicationCheckPayload publicationCheckPayload:
var publicationCheckPayloadActionResult = await handler.HandleAppPublicationCheckAsync(publicationCheckPayload);
await WriteApplicationExecutionResultAsync(context.Response, publicationCheckPayloadActionResult);
return;
// Refresh token updated?
case RefreshTokenPayload refreshTokenPayload:
var refreshTokenResult = await handler.HandleRefreshTokenAsync(refreshTokenPayload);
await WriteApplicationExecutionResultAsync(context.Response, refreshTokenResult);
return;
}
await WriteTextResponse(context.Response, 400, "Payload is not supported.");
}