public async Task <IActionResult> ServiceRequestDetails(string id)
        {
            var serviceRequestDetails = await _serviceRequestOperations.GetServiceRequestByRowKey(id);

            // Access Check
            if (HttpContext.User.IsInRole(Roles.Engineer.ToString()) &&
                serviceRequestDetails.ServiceEngineer != HttpContext.User.GetCurrentUserDetails().Email)
            {
                throw new UnauthorizedAccessException();
            }

            if (HttpContext.User.IsInRole(Roles.User.ToString()) &&
                serviceRequestDetails.PartitionKey != HttpContext.User.GetCurrentUserDetails().Email)
            {
                throw new UnauthorizedAccessException();
            }

            var serviceRequestAuditDetails = await _serviceRequestOperations.GetServiceRequestAuditByPartitionKey(
                serviceRequestDetails.PartitionKey + "-" + id);

            // Select List Data
            var masterData = await _masterData.GetMasterDataCacheAsync();

            ViewBag.VehicleTypes     = masterData.Values.Where(p => p.PartitionKey == MasterKeys.VehicleType.ToString()).ToList();
            ViewBag.VehicleNames     = masterData.Values.Where(p => p.PartitionKey == MasterKeys.VehicleName.ToString()).ToList();
            ViewBag.Status           = Enum.GetValues(typeof(Status)).Cast <Status>().Select(v => v.ToString()).ToList();
            ViewBag.ServiceEngineers = await _userManager.GetUsersInRoleAsync(Roles.Engineer.ToString());

            return(View(new ServiceRequestDetailViewModel
            {
                ServiceRequest = _mapper.Map <ServiceRequest, UpdateServiceRequestViewModel>(serviceRequestDetails),
                ServiceRequestAudit = serviceRequestAuditDetails.OrderByDescending(p => p.Timestamp).ToList()
            }));
        }
        private async Task UpdateServiceRequestClients()
        {
            // Get Hub Context
            var hubContext = _signalRConnectionManager.GetHubContext <ServiceMessagesHub>();

            // Get Service Request Details
            var serviceRequest = await _serviceRequestOperations.GetServiceRequestByRowKey(_serviceRequestId);

            // Get Customer and Service Engineer names
            var customerName        = (await _userManager.FindByEmailAsync(serviceRequest.PartitionKey)).UserName;
            var serviceEngineerName = string.Empty;

            if (!string.IsNullOrWhiteSpace(serviceRequest.ServiceEngineer))
            {
                serviceEngineerName = (await _userManager.FindByEmailAsync(serviceRequest.ServiceEngineer)).UserName;
            }
            var adminName = (await _userManager.FindByEmailAsync(_options.Value.AdminEmail)).UserName;


            // check Admin, Service Engineer and customer are connected.
            var isAdminOnline = await _onlineUserOperations.GetOnlineUserAsync(_options.Value.AdminEmail);

            var isServiceEngineerOnline = false;

            if (!string.IsNullOrWhiteSpace(serviceRequest.ServiceEngineer))
            {
                isServiceEngineerOnline = await _onlineUserOperations.GetOnlineUserAsync(serviceRequest.ServiceEngineer);
            }
            var isCustomerOnline = await _onlineUserOperations.GetOnlineUserAsync(serviceRequest.PartitionKey);


            List <string> users = new List <string>();

            if (isAdminOnline)
            {
                users.Add(adminName);
            }
            if (!string.IsNullOrWhiteSpace(serviceEngineerName))
            {
                if (isServiceEngineerOnline)
                {
                    users.Add(serviceEngineerName);
                }
            }
            if (isCustomerOnline)
            {
                users.Add(customerName);
            }


            hubContext
            .Clients
            .Users(users)
            .online(new
            {
                isAd = isAdminOnline,
                isSe = isServiceEngineerOnline,
                isCu = isCustomerOnline
            });
        }
        public async Task <IActionResult> ServiceRequestDetails(string id)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                return(RedirectToAction("Error", "Home", new { id = "404" }));
            }

            ServiceRequest serviceRequestDetails = await _serviceRequestOperations
                                                   .GetServiceRequestByRowKey(rowKey : id);

            if (HttpContext.User.IsInRole(Roles.Engineer.ToString()) &&
                (serviceRequestDetails.ServiceEngineer != HttpContext.User.GetCurrentUserDetails().Email))
            {
                throw new UnauthorizedAccessException();
            }

            if (HttpContext.User.IsInRole(Roles.User.ToString()) &&
                serviceRequestDetails.PartitionKey != HttpContext.User.GetCurrentUserDetails().Email)
            {
                throw new UnauthorizedAccessException();
            }

            var serviceRequestAuditDetails = await _serviceRequestOperations
                                             .GetServiceRequestAuditByPartitionKey(serviceRequestDetails.PartitionKey + "-" + id);

            var masterData = await _masterData.GetMasterDataCacheAsync();

            ViewBag.VehicleTypes     = masterData.Values.Where(p => p.PartitionKey == MasterKeys.VehicleType.ToString()).ToList();
            ViewBag.VehicleNames     = masterData.Values.Where(p => p.PartitionKey == MasterKeys.VehicleName.ToString()).ToList();
            ViewBag.Status           = Enum.GetValues(typeof(Status)).Cast <Status>().Select(v => v.ToString()).ToList();
            ViewBag.ServiceEngineers = await _userManager.GetUsersInRoleAsync(Roles.Engineer.ToString());



            return(View(new ServiceRequestDetailViewModel
            {
                ServiceRequest = _mapper.Map <UpdateServiceRequestViewModel>(serviceRequestDetails),
                ServiceRequestAudit = serviceRequestAuditDetails.OrderByDescending(p => p.RequestedDate).ToList()
            }));
        }