public async Task HandleAsync()

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.");
    }