/// <inheritdoc />
        public virtual IQueryable <TResource> Get()
        {
            _logger.LogTrace($"Entering {nameof(Get)}().");

            var resourceContext = _resourceGraph.GetResourceContext <TResource>();

            return(EagerLoad(_dbSet, resourceContext.EagerLoads));
        }
        /// <inheritdoc />
        public virtual async Task <int> CountAsync(FilterExpression topFilter, CancellationToken cancellationToken)
        {
            _traceWriter.LogMethodStart(new { topFilter });

            var resourceContext = _resourceGraph.GetResourceContext <TResource>();
            var layer           = new QueryLayer(resourceContext)
            {
                Filter = topFilter
            };

            IQueryable <TResource> query = ApplyQueryLayer(layer);

            return(await query.CountAsync(cancellationToken));
        }
 public ResourceDefinition(IResourceGraph resourceGraph)
 {
     _resourceContext      = resourceGraph.GetResourceContext(typeof(TResource));
     _allowedAttributes    = _resourceContext.Attributes;
     _allowedRelationships = _resourceContext.Relationships;
     _resourceGraph        = resourceGraph;
 }
 protected QueryParameterService(IResourceGraph resourceGraph, ICurrentRequest currentRequest)
 {
     _mainRequestResource = currentRequest.GetRequestResource();
     _resourceGraph       = resourceGraph;
     _requestResource     = currentRequest.RequestRelationship != null
         ? resourceGraph.GetResourceContext(currentRequest.RequestRelationship.RightType)
         : _mainRequestResource;
 }
 public TelevisionBroadcastDefinition(IResourceGraph resourceGraph, TelevisionDbContext dbContext, IJsonApiRequest request,
                                      IEnumerable <IQueryConstraintProvider> constraintProviders)
     : base(resourceGraph)
 {
     _dbContext           = dbContext;
     _request             = request;
     _constraintProviders = constraintProviders;
     _broadcastContext    = resourceGraph.GetResourceContext <TelevisionBroadcast>();
 }
Example #6
0
        /// <inheritdoc />
        public IResourceDefinition Get(Type resourceType)
        {
            if (resourceType == null)
            {
                throw new ArgumentNullException(nameof(resourceType));
            }

            var resourceContext = _resourceContextProvider.GetResourceContext(resourceType);

            return((IResourceDefinition)_serviceProvider.GetService(resourceContext.ResourceDefinitionType));
        }
Example #7
0
        private JsonApiResourceService <TodoItem> GetService()
        {
            var options                    = new JsonApiOptions();
            var changeTracker              = new ResourceChangeTracker <TodoItem>(options, _resourceGraph, new TargetedFields());
            var serviceProvider            = new ServiceContainer();
            var resourceFactory            = new ResourceFactory(serviceProvider);
            var resourceDefinitionProvider = new ResourceDefinitionProvider(_resourceGraph, new TestScopedServiceProvider(serviceProvider));
            var paginationContext          = new PaginationContext();
            var composer                   = new QueryLayerComposer(new List <IQueryConstraintProvider>(), _resourceGraph, resourceDefinitionProvider, options, paginationContext);
            var currentRequest             = new CurrentRequest
            {
                PrimaryResource   = _resourceGraph.GetResourceContext <TodoItem>(),
                SecondaryResource = _resourceGraph.GetResourceContext <TodoItemCollection>(),
                Relationship      = _resourceGraph.GetRelationships(typeof(TodoItem))
                                    .Single(x => x.PublicName == "collection")
            };

            return(new JsonApiResourceService <TodoItem>(_repositoryMock.Object, composer, paginationContext, options,
                                                         NullLoggerFactory.Instance, currentRequest, changeTracker, resourceFactory, null));
        }
Example #8
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
        private string GetRelationshipId()
        {
            var resource = _currentRequest.GetRequestResource();

            if (!_currentRequest.IsRelationshipPath)
            {
                return(null);
            }
            var components = SplitCurrentPath();
            var toReturn   = components.ElementAtOrDefault(4);

            if (toReturn == null)
            {
                return(null);
            }
            var relType         = _currentRequest.RequestRelationship.RightType;
            var relResource     = _resourceGraph.GetResourceContext(relType);
            var relIdentityType = relResource.IdentityType;

            return(toReturn);
        }
Example #10
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder();

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
Example #11
0
        public void Can_add_resources_from_assembly_to_graph()
        {
            // Arrange
            var facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, LoggerFactory);

            facade.AddAssembly(typeof(Person).Assembly);

            // Act
            facade.DiscoverResources();

            // Assert
            IResourceGraph resourceGraph = _resourceGraphBuilder.Build();

            ResourceContext personResource = resourceGraph.GetResourceContext(typeof(Person));

            personResource.Should().NotBeNull();

            ResourceContext articleResource = resourceGraph.GetResourceContext(typeof(Article));

            articleResource.Should().NotBeNull();
        }
Example #12
0
        public override FilterExpression OnApplyFilter(FilterExpression existingFilter)
        {
            var resourceContext        = _resourceGraph.GetResourceContext <Company>();
            var isSoftDeletedAttribute = resourceContext.Attributes.Single(attribute => attribute.Property.Name == nameof(Company.IsSoftDeleted));

            var isNotSoftDeleted = new ComparisonExpression(ComparisonOperator.Equals,
                                                            new ResourceFieldChainExpression(isSoftDeletedAttribute), new LiteralConstantExpression("false"));

            return(existingFilter == null
                ? (FilterExpression)isNotSoftDeleted
                : new LogicalExpression(LogicalOperator.And, new[] { isNotSoftDeleted, existingFilter }));
        }
        public QueryParserBenchmarks()
        {
            IJsonApiOptions options       = new JsonApiOptions();
            IResourceGraph  resourceGraph = DependencyFactory.CreateResourceGraph();

            var currentRequest = new CurrentRequest();

            currentRequest.SetRequestResource(resourceGraph.GetResourceContext(typeof(BenchmarkResource)));

            IResourceDefinitionProvider resourceDefinitionProvider = DependencyFactory.CreateResourceDefinitionProvider(resourceGraph);

            _queryParameterDiscoveryForSort = CreateQueryParameterDiscoveryForSort(resourceGraph, currentRequest, resourceDefinitionProvider, options);
            _queryParameterDiscoveryForAll  = CreateQueryParameterDiscoveryForAll(resourceGraph, currentRequest, resourceDefinitionProvider, options);
        }
Example #14
0
        public async Task <IActionResult> SearchByKeyword([FromQuery] string keyword)
        {
            var notes = await _notes.GetByKeyword(keyword);

            var results = notes.Select(Note.FromNote);

            _currentRequest.IsReadOnly                 = true;
            _currentRequest.IsCollection               = true;
            _currentRequest.Kind                       = EndpointKind.Primary;
            _currentRequest.PrimaryResource            = _resourceGraph.GetResourceContext <Note>();
            this.HttpContext.Items["IsJsonApiRequest"] = bool.TrueString;

            return(Ok(results));
        }
 protected void DisallowLocked(IEnumerable <T> resources)
 {
     foreach (T resource in resources ?? Enumerable.Empty <T>())
     {
         if (resource.IsLocked)
         {
             throw new JsonApiException(new Error(HttpStatusCode.Forbidden)
             {
                 Title = "You are not allowed to update fields or relationships of " +
                         $"locked resource of type '{_resourceGraph.GetResourceContext<T>().PublicName}'."
             });
         }
     }
 }
        /// <inheritdoc />
        public virtual async Task <int> CountAsync(FilterExpression topFilter)
        {
            _logger.LogTrace($"Entering {nameof(CountAsync)}('{topFilter}').");

            var resourceContext = _resourceGraph.GetResourceContext <TResource>();
            var layer           = new QueryLayer(resourceContext)
            {
                Filter = topFilter
            };

            IQueryable <TResource> query = ApplyQueryLayer(layer);

            return(await query.CountAsync());
        }
        public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.Add <TestResource>();

            // Act
            IResourceGraph resourceGraph = builder.Build();

            // Assert
            ResourceContext resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Contains(resource.Attributes, attribute => attribute.PublicName == "compoundAttribute");
        }
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.Add <TestResource>();

            // Act
            IResourceGraph resourceGraph = builder.Build();

            // Assert
            ResourceContext resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("testResources", resource.PublicName);
        }
        public void Relationships_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.Add <TestResource>();

            // Act
            IResourceGraph resourceGraph = builder.Build();

            // Assert
            ResourceContext resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("relatedResource", resource.Relationships.Single(relationship => relationship is HasOneAttribute).PublicName);
            Assert.Equal("relatedResources", resource.Relationships.Single(relationship => !(relationship is HasOneAttribute)).PublicName);
        }
Example #20
0
        public QueryParserBenchmarks()
        {
            IJsonApiOptions options = new JsonApiOptions
            {
                EnableLegacyFilterNotation = true
            };

            IResourceGraph resourceGraph = DependencyFactory.CreateResourceGraph(options);

            var request = new JsonApiRequest
            {
                PrimaryResource = resourceGraph.GetResourceContext(typeof(BenchmarkResource))
            };

            _queryStringReaderForSort = CreateQueryParameterDiscoveryForSort(resourceGraph, request, options, _queryStringAccessor);
            _queryStringReaderForAll  = CreateQueryParameterDiscoveryForAll(resourceGraph, request, options, _queryStringAccessor);
        }
Example #21
0
        public void Can_add_resource_from_current_assembly_to_graph()
        {
            // Arrange
            var facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, LoggerFactory);

            facade.AddCurrentAssembly();

            // Act
            facade.DiscoverResources();

            // Assert
            IResourceGraph resourceGraph = _resourceGraphBuilder.Build();

            ResourceContext resource = resourceGraph.GetResourceContext(typeof(TestResource));

            resource.Should().NotBeNull();
        }
Example #22
0
        /// <summary>
        /// Gets the current entity that we need for serialization and deserialization.
        /// </summary>
        /// <returns></returns>
        private ResourceContext GetCurrentEntity()
        {
            var controllerName = (string)_routeValues["controller"];

            if (controllerName == null)
            {
                return(null);
            }
            var resourceType    = _controllerResourceMapping.GetAssociatedResource(controllerName);
            var requestResource = _resourceGraph.GetResourceContext(resourceType);

            if (requestResource == null)
            {
                return(null);
            }
            if (_routeValues.TryGetValue("relationshipName", out object relationshipName))
            {
                _currentRequest.RequestRelationship = requestResource.Relationships.SingleOrDefault(r => r.PublicRelationshipName == (string)relationshipName);
            }
            return(requestResource);
        }
Example #23
0
        /// <inheritdoc />
        public void Apply(ApplicationModel application)
        {
            if (application == null)
            {
                throw new ArgumentNullException(nameof(application));
            }

            foreach (var controller in application.Controllers)
            {
                var resourceType = ExtractResourceTypeFromController(controller.ControllerType);

                if (resourceType != null)
                {
                    var resourceContext = _resourceGraph.GetResourceContext(resourceType);

                    if (resourceContext != null)
                    {
                        _registeredResources.Add(controller.ControllerName, resourceContext);
                    }
                }

                if (!RoutingConventionDisabled(controller))
                {
                    continue;
                }

                var template = TemplateFromResource(controller) ?? TemplateFromController(controller);
                if (template == null)
                {
                    throw new InvalidConfigurationException(
                              $"Controllers with overlapping route templates detected: {controller.ControllerType.FullName}");
                }

                controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel {
                    Template = template
                };
            }
        }
 /// <inheritdoc/>
 public IResourceDefinition Get(Type resourceType)
 {
     return((IResourceDefinition)_serviceProvider.GetService(_resourceContextProvider.GetResourceContext(resourceType).ResourceDefinitionType));
 }