public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
            ILogger log)
        {
            // Check configuration
            if (string.IsNullOrEmpty(_config["apiFunctionId"]) ||
                string.IsNullOrEmpty(_config["apiFunctionSecret"]) ||
                string.IsNullOrEmpty(_config["tenantId"]))
            {
                log.LogError("Invalid app settings configured");
                return(new InternalServerErrorResult());
            }

            // Validate the bearer token
            var validationResult = await TokenValidation.ValidateAuthorizationHeader(
                req, _config["tenantId"], _config["apiFunctionId"], log);

            // If token wasn't returned it isn't valid
            if (validationResult == null)
            {
                return(new UnauthorizedResult());
            }

            // Initialize a Graph client for this user
            var graphClient = _clientService.GetUserGraphClient(validationResult,
                                                                new[] { "https://graph.microsoft.com/.default" }, log);

            // Get the user's newest message in inbox
            // GET /me/mailfolders/inbox/messages
            var messagePage = await graphClient.Me
                              .MailFolders
                              .Inbox
                              .Messages
                              .Request()
                              // Limit the fields returned
                              .Select(m => new
            {
                m.From,
                m.ReceivedDateTime,
                m.Subject
            })
                              // Sort by received time, newest on top
                              .OrderBy("receivedDateTime DESC")
                              // Only get back one message
                              .Top(1)
                              .GetAsync();

            if (messagePage.CurrentPage.Count < 1)
            {
                return(new OkObjectResult(null));
            }

            // Return the message in the response
            return(new OkObjectResult(messagePage.CurrentPage[0]));
        }
Example #2
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            // Check configuration
            if (string.IsNullOrEmpty(_config["webHookId"]) ||
                string.IsNullOrEmpty(_config["webHookSecret"]) ||
                string.IsNullOrEmpty(_config["tenantId"]) ||
                string.IsNullOrEmpty(_config["apiFunctionId"]))
            {
                log.LogError("Invalid app settings configured");
                return(new InternalServerErrorResult());
            }

            var notificationHost = _config["ngrokUrl"];

            if (string.IsNullOrEmpty(notificationHost))
            {
                notificationHost = req.Host.Value;
            }

            // Validate the bearer token
            var validationResult = await TokenValidation.ValidateAuthorizationHeader(
                req, _config["tenantId"], _config["apiFunctionId"], log);

            // If token wasn't returned it isn't valid
            if (validationResult == null)
            {
                return(new UnauthorizedResult());
            }

            var requestBody = await new StreamReader(req.Body).ReadToEndAsync();

            var jsonOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };

            // Deserialize the JSON payload into a SetSubscriptionPayload object
            var payload = JsonSerializer.Deserialize <SetSubscriptionPayload>(requestBody, jsonOptions);

            if (payload == null)
            {
                return(new BadRequestErrorMessageResult("Invalid request payload"));
            }

            // Initialize Graph client
            var graphClient = _clientService.GetAppGraphClient(log);

            if (payload.RequestType.ToLower() == "subscribe")
            {
                if (string.IsNullOrEmpty(payload.UserId))
                {
                    return(new BadRequestErrorMessageResult("Required fields in payload missing"));
                }

                // Create a new subscription object
                var subscription = new Subscription
                {
                    ChangeType         = "created,updated",
                    NotificationUrl    = $"{notificationHost}/api/Notify",
                    Resource           = $"/users/{payload.UserId}/mailfolders/inbox/messages",
                    ExpirationDateTime = DateTimeOffset.UtcNow.AddDays(2),
                    ClientState        = Notify.ClientState
                };

                // POST /subscriptions
                var createdSubscription = await graphClient.Subscriptions
                                          .Request()
                                          .AddAsync(subscription);

                return(new OkObjectResult(createdSubscription));
            }
            else
            {
                if (string.IsNullOrEmpty(payload.SubscriptionId))
                {
                    return(new BadRequestErrorMessageResult("Subscription ID missing in payload"));
                }

                // DELETE /subscriptions/subscriptionId
                await graphClient.Subscriptions[payload.SubscriptionId]
                .Request()
                .DeleteAsync();

                return(new AcceptedResult());
            }
        }