sp-dev-fx-webparts/samples/react-realtime-incidentdash.../backend/O365Clinic.Function.Webhooks/SPWebhookReceiver.cs

80 lines
3.1 KiB
C#

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Queue;
using O365Clinic.Function.Webhooks.Model;
using System.Text;
using Azure.Storage.Queues;
using O365Clinic.Function.Webhooks.Models;
using System.Collections.Generic;
using O365Clinic.Function.Webhooks.Services;
using O365Clinic.Function.Webhooks.Interfaces;
using Microsoft.AspNetCore.Mvc.Filters;
namespace O365Clinic.Function.Webhooks
{
public class SPWebhookReceiver
{
private readonly AzureFunctionSettings _configSettings;
public SPWebhookReceiver(
ILoggerFactory loggerFactory,
AzureFunctionSettings settings
)
{
_configSettings = settings;
}
[FunctionName("SPWebhookReceiver")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
[Queue("o365c-webhookqueue", Connection = "AzureWebJobsStorage")] QueueClient outputQueue, ILogger log, ExecutionContext execution)
{
log.LogInformation($"Webhook was triggered!");
// Grab the validationToken URL parameter
string validationToken = req.Query["validationtoken"];
// If a validation token is present, we need to respond within 5 seconds by
// returning the given validation token. This only happens when a new
// webhook is being added
if (validationToken != null)
{
log.LogInformation($"Validation token {validationToken} received");
return new OkObjectResult(validationToken);
}
log.LogInformation($"SharePoint triggered our webhook...great :-)");
var content = await new StreamReader(req.Body).ReadToEndAsync();
log.LogInformation($"Received following payload: {content}");
var notifications = JsonConvert.DeserializeObject<ResponseModel<NotificationModel>>(content).Value;
log.LogInformation($"Found {notifications.Count} notifications");
if (notifications.Count > 0)
{
log.LogInformation($"Processing notifications...");
foreach (var notification in notifications)
{
// add message to the queue
string message = JsonConvert.SerializeObject(notification);
log.LogInformation($"Before adding a message to the queue. Message content: {message}");
await outputQueue.SendMessageAsync(message);
log.LogInformation($"Message added :-)");
}
}
// if we get here we assume the request was well received
return new OkObjectResult($"Added to queue");
}
}
}