public virtual async Task <ISingleResourceDocument> GetRecordById(string id, HttpRequestMessage request, CancellationToken cancellationToken) { var apiBaseUrl = GetBaseUrlFromRequest(request); var singleResource = await FilterById <T>(id, _resourceTypeRegistration).FirstOrDefaultAsync(cancellationToken); if (singleResource == null) { throw JsonApiException.CreateForNotFound(string.Format("No resource of type `{0}` exists with id `{1}`.", _resourceTypeRegistration.ResourceTypeName, id)); } return(_singleResourceDocumentBuilder.BuildDocument(singleResource, apiBaseUrl, null, null)); }
public async Task <IJsonApiDocument> GetRelatedResourceDocument(string primaryResourceId, HttpRequestMessage request, CancellationToken cancellationToken) { var record = await GetRelatedRecord(primaryResourceId, cancellationToken); var baseUrl = _baseUrlService.GetBaseUrl(request); return(_singleResourceDocumentBuilder.BuildDocument(record, baseUrl, null, null)); // TODO: allow implementors to specify includes and metadata }
public async Task <IJsonApiDocument> BuildDocument(object obj, HttpRequestMessage requestMessage, CancellationToken cancellationToken) { var type = obj.GetType(); // TODO: test includes var includeExpressions = _includeExpressionExtractor.ExtractIncludeExpressions(requestMessage); var queryableInterfaces = type.GetInterfaces(); var queryableInterface = queryableInterfaces.FirstOrDefault( i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryable <>)); if (queryableInterface != null) { var queryableElementType = queryableInterface.GenericTypeArguments[0]; var buildDocumentMethod = _openBuildDocumentFromQueryableMethod.Value.MakeGenericMethod(queryableElementType); var sortExpressions = _sortExpressionExtractor.ExtractSortExpressions(requestMessage); dynamic materializedQueryTask = buildDocumentMethod.Invoke(_queryableResourceCollectionDocumentBuilder, new[] { obj, requestMessage, sortExpressions, cancellationToken, includeExpressions }); return(await materializedQueryTask); } var isCollection = false; var enumerableElementType = GetEnumerableElementType(type); if (enumerableElementType != null) { isCollection = true; } var linkBaseUrl = _baseUrlService.GetBaseUrl(requestMessage); if (isCollection) { var buildDocumentMethod = _openBuildDocumentFromEnumerableMethod.Value.MakeGenericMethod(enumerableElementType); return ((dynamic)buildDocumentMethod.Invoke(_resourceCollectionDocumentBuilder, new[] { obj, linkBaseUrl, new string[] { }, null, null })); } // Single resource object return(_singleResourceDocumentBuilder.BuildDocument(obj, linkBaseUrl, includeExpressions, null)); }
public virtual async Task <ISingleResourceDocument> GetRecordById(string id, HttpRequestMessage request, CancellationToken cancellationToken) { var entityQuery = GetByIdQuery(id); var includePaths = GetIncludePathsForSingleResource() ?? new Expression <Func <TDto, object> >[] { }; var jsonApiPaths = includePaths.Select(ConvertToJsonKeyPath).ToArray(); var mappedQuery = GetMappedQuery(entityQuery, includePaths); var primaryResource = await _queryableEnumerationTransformer.FirstOrDefault(mappedQuery, cancellationToken); if (primaryResource == null) { throw JsonApiException.CreateForNotFound( string.Format("No record exists with type `{0}` and ID `{1}`.", ResourceTypeName, id)); } await OnResourceFetched(primaryResource, cancellationToken); var baseUrl = _baseUrlService.GetBaseUrl(request); return(_singleResourceDocumentBuilder.BuildDocument(primaryResource, baseUrl, jsonApiPaths, null)); }