public async Task <FindTeamLogProjection> HandleAsync(FindTeamLogQuery query, CancellationToken cancellationToken) { if (_authenticatedUserAccessor.AuthenticatedUser.Teams.All(t => t.Id != query.TeamId)) { throw new UserNotAddedToTeamException ( _authenticatedUserAccessor.AuthenticatedUser.Id, query.TeamId ); } var log = await _cache.GetOrSetAsync ( _cacheKey.FindTeamLog(query.TeamId, query.LogId), async() => await _logsCollection.Find(l => l.TeamId == query.TeamId && l.Id == query.LogId) .Project(l => new FindTeamLogProjection ( l.Id.ToString(), l.TeamId.ToString(), l.StubIds.Select(sId => sId.ToString()).ToList(), new RequestLog ( l.Request.HttpMethod, l.Request.Path, l.Request.QueryStringParameters.Select(qsp => new QueryStringParameter(qsp.Key, qsp.Value)) .ToList(), l.Request.Body, l.Request.Headers.Select(qsp => new Header(qsp.Key, qsp.Value)).ToList() ), new ResponseLog ( l.Response.HttpStatusCode, l.Response.Body, l.Response.Headers.Select(qsp => new Header(qsp.Key, qsp.Value)).ToList() ), l.Id.CreationTime )) .SingleOrDefaultAsync(cancellationToken) ); if (log == null) { throw new LogNotFoundException ( query.LogId, query.TeamId ); } return(log); }