コード例 #1
0
        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
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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));
        }