public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req) { _logger.LogInformation("C# HTTP trigger function ExportTrackingReport processed a request."); string tenant = req.Headers[Constants.HEADER_TENANT]; if (String.IsNullOrWhiteSpace(tenant)) { tenant = null; } ServerSettings serverSettings = await _serverSettingsRepository.GetServerSettings(tenant); string keyWord = req.Headers[Constants.HEADER_KEYWORD]; if (String.IsNullOrEmpty(keyWord) || !serverSettings.IsAdmin(keyWord)) { _logger.LogWarning("ExportTrackingReport called with wrong keyword."); return(new BadRequestErrorMessageResult("Keyword is missing or wrong.")); } string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); TrackingReportRequest trackingRequest = JsonConvert.DeserializeObject <TrackingReportRequest>(requestBody); if (String.IsNullOrEmpty(trackingRequest.RequestorFirstName) || String.IsNullOrEmpty(trackingRequest.RequestorLastName)) { _logger.LogWarning("ExportTrackingReport called without name of requestor."); return(new BadRequestErrorMessageResult("Requestor name missing.")); } if (String.IsNullOrEmpty(trackingRequest.TrackFirstName) || String.IsNullOrEmpty(trackingRequest.TrackLastName)) { _logger.LogWarning("ExportTrackingReport called without name of person to track."); return(new BadRequestErrorMessageResult("Track name missing.")); } // Get a list of all CalendarItems IEnumerable <CalendarItem> rawListOfCalendarItems; if (null == tenant) { rawListOfCalendarItems = await _cosmosRepository.GetItems(d => (d.Tenant ?? String.Empty) == String.Empty && !d.IsCanceled); } else { rawListOfCalendarItems = await _cosmosRepository.GetItems(d => d.Tenant.Equals(tenant) && !d.IsCanceled); } List <ExtendedCalendarItem> resultCalendarItems = new List <ExtendedCalendarItem>(50); // Filter the CalendarItems that are relevant foreach (CalendarItem item in rawListOfCalendarItems) { // Read all participants for this calendar item IEnumerable <Participant> participants = await _participantRepository.GetItems(p => p.CalendarItemId.Equals(item.Id)); // Only events where the person was part of will be used. if (!item.WithoutHost && item.EqualsHost(trackingRequest.TrackFirstName, trackingRequest.TrackLastName) || null != participants.Find(trackingRequest.TrackFirstName, trackingRequest.TrackLastName)) { ExtendedCalendarItem extendedItem = new ExtendedCalendarItem(item); extendedItem.ParticipantsList = participants; resultCalendarItems.Add(extendedItem); } } IEnumerable <ExtendedCalendarItem> orderedList = resultCalendarItems.OrderBy(d => d.StartDate); // Build template for marker list corresponding to orderedList above List <CompanionCalendarInfo> relevantCalendarList = new List <CompanionCalendarInfo>(50); int calendarSize = 0; foreach (ExtendedCalendarItem e in orderedList) { relevantCalendarList.Add(new CompanionCalendarInfo(e)); ++calendarSize; } // Assemble report TrackingReport report = new TrackingReport(trackingRequest); report.CompanionList = new List <Companion>(50); report.CalendarList = relevantCalendarList; int calendarIndex = 0; foreach (ExtendedCalendarItem calendarItem in orderedList) { if (!calendarItem.WithoutHost) { report.CompanionList.AddCompanion(calendarItem.HostFirstName, calendarItem.HostLastName, calendarItem.HostAdressInfo, calendarSize, calendarIndex); } foreach (Participant p in calendarItem.ParticipantsList) { report.CompanionList.AddCompanion(p.ParticipantFirstName, p.ParticipantLastName, p.ParticipantAdressInfo, calendarSize, calendarIndex); } ++calendarIndex; } report.CreationDate = DateTime.Now; ExportLogItem log = new ExportLogItem(trackingRequest); log.TimeToLive = Constants.LOG_TTL; if (null != tenant) { log.Tenant = tenant; } await _logRepository.CreateItem(log); return(new OkObjectResult(report)); }