public async Task <GetProfileResponse> Handle(GetProfileRequest request, CancellationToken cancellationToken)
        {
            var user = await _userAccountRepository.GetUserAccountAsync(request.User);

            var userFeeds = await _userFeedRepository.GetAsync(user);

            var apiAccesses = await _userAccountApiAccessRepository.GetAsync(user);

            var externalApiAccessModels = new List <ExternalApiAccessModel>();

            foreach (var apiAccess in apiAccesses)
            {
                var mostRecentToken = await _userAccountTokenRepository.GetLatestAsync(apiAccess);

                var lastAccessed = mostRecentToken?.CreatedDateTime ?? apiAccess.CreatedDateTime;
                externalApiAccessModels.Add(new ExternalApiAccessModel(apiAccess.UserAccountApiAccessId, apiAccess.ApiClient.DisplayName, apiAccess.CreatedDateTime, lastAccessed, apiAccess.RevokedDateTime));
            }

            var externalApiClients = await _apiClientRepository.GetAsync(user);

            return(new GetProfileResponse(
                       userFeeds.Select(uf => new FeedModel(uf.UserFeedId, uf.UserFeedIdentifier, uf.CreatedDateTime, uf.FeedType, uf.ItemDisplay)),
                       externalApiAccessModels.OrderByDescending(a => a.RevokedDateTime ?? DateTime.MaxValue).ThenByDescending(a => a.LastAccessedDateTime),
                       externalApiClients.OrderBy(a => a.DisplayName).Select(a => new ExternalApiClientModel(
                                                                                 a.ApiClientId, a.DisplayName, a.AppKey, a.RedirectUri, a.IsEnabled
                                                                                 ))));
        }
        public async Task <UserAccount> GetUserAccountAsync(ClaimsPrincipal user)
        {
            var userAccountToken = await _userAccountTokenRepository.GetAsync(user.Identity.Name);

            if (userAccountToken == null)
            {
                _logger.LogInformation($"No user account token found for: {user.Identity.Name}");
                return(null);
            }

            var userAccountApiAccess = await _userAccountApiAccessRepository.GetAsync(userAccountToken.UserAccountApiAccessId);

            if (userAccountApiAccess == null)
            {
                _logger.LogInformation($"No user account api access found with id {userAccountToken.UserAccountApiAccessId}");
                return(null);
            }

            if (userAccountApiAccess.RevokedDateTime != null)
            {
                _logger.LogInformation($"User account api access {userAccountToken.UserAccountApiAccessId} has been revoked");
                return(null);
            }

            return(await _userAccountRepository.GetAsync(userAccountApiAccess.UserAccountId));
        }
        public async Task <bool> Handle(RevokeExternalApiAccessRequest request, CancellationToken cancellationToken)
        {
            var user = await _userAccountRepository.GetUserAccountAsync(request.User);

            var userAccountApiAccess = await _userAccountApiAccessRepository.GetAsync(request.UserAccountApiAccessId);

            if (userAccountApiAccess == null)
            {
                _logger.LogInformation($"Could not find user account api access {request.UserAccountApiAccessId}");
                return(false);
            }

            if (userAccountApiAccess.UserAccountId != user.UserAccountId)
            {
                _logger.LogInformation($"User account on api access {userAccountApiAccess.UserAccountId} does not match request user {user.UserAccountId}");
                return(false);
            }

            userAccountApiAccess.RevokedDateTime = DateTime.UtcNow;
            await _userAccountApiAccessRepository.UpdateAsync(userAccountApiAccess);

            return(true);
        }