public async Task Index()

in App/src/Events-TenantUserApp/Controllers/EventsController.cs [41:126]


        public async Task<ActionResult> Index(string tenant)
        {
            try
            {
                if (!string.IsNullOrEmpty(tenant))
                {
                    var tenantDetails = await _catalogRepository.GetTenant(tenant);
                    if (tenantDetails != null)
                    {
                        //Get tenant status
                        String tenantStatus = _utilities.GetTenantStatus(tenantDetails.TenantId);

                        if (tenantStatus == "Offline")
                        {
                            return View("TenantOffline", tenantDetails.TenantName);
                        }
                        else
                        {
                            var venueInfo = await _tenantRepository.GetVenueDetails(tenantDetails.TenantId);

                            //Get region of tenant database server using DNS
                            var dnsQuery = _client.Query(venueInfo.DatabaseServerName, DnsClient.QueryType.A);
                            String serverRegion = dnsQuery.Answers.ARecords().ElementAt(0).DomainName;

                            //Display events if tenant database is located in same region as app
                            if (serverRegion.Contains(_appRegion) && tenantStatus == "Online")
                            {
                                SetTenantConfig(tenantDetails.TenantId, tenantDetails.TenantIdInString);

                                var events = await _tenantRepository.GetEventsForTenant(tenantDetails.TenantId);
                                return View(events);
                            }
                            //Redirect to different app instance if tenant database is located in different region from app
                            else
                            {
                                var pairedRegion = (serverRegion.Split('-'))[0].Split('1')[0];
                                String recoveryAppInstance = "https://events-wingtip-dpt-" + pairedRegion + "-" + _configuration["User"] + ".azurewebsites.net/" + tenant;
                                return Redirect(recoveryAppInstance);
                            }
                        }                       
                    }
                    else
                    {
                        return View("TenantError", tenant);
                    }
                }
            }
            catch (Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException ex)
            {
                if (ex.ErrorCode == Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementErrorCode.MappingIsOffline)
                {
                    var tenantModel = await _catalogRepository.GetTenant(tenant);
                    _logger.LogInformation(0, ex, "Tenant is offline: {tenant}", tenantModel.TenantName);
                    return View("TenantOffline", tenantModel.TenantName);
                }
                else if (ex.ErrorCode == Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementErrorCode.MappingDoesNotExist)
                {
                    var tenantModel = await _catalogRepository.GetTenant(tenant);
                    //Fix mapping irregularities
                    _utilities.ResolveMappingDifferences(tenantModel.TenantId);

                    //Get venue details
                    String tenantStatus = _utilities.GetTenantStatus(tenantModel.TenantId);
                    if (tenantStatus == "Online")
                    {
                        var events = await _tenantRepository.GetEventsForTenant(tenantModel.TenantId);
                        return View(events);
                    }
                    else
                    {
                        return View("TenantOffline", tenantModel.TenantName);
                    }
                }
                else
                {
                    _logger.LogError(0, ex, "Tenant shard was unavailable for tenant: {tenant}", tenant);
                    return View("Error", ex.Message);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(0, ex, "Get events failed for tenant {tenant}", tenant);
                return View("Error", ex.Message);
            }
            return View("Error");
        }