コード例 #1
0
        private static async ValueTask AddLinksAsync(
            ILogger logger,
            IApiLinkGenerator apiLinkGenerator,
            IEnumerable <IResourceLinkGenerator> generators,
            ApiOperationContext context,
            ILinkableResource result)
        {
            foreach (var resourceLinkGenerator in generators)
            {
                if (logger.IsEnabled(LogLevel.Trace))
                {
                    logger.LogTrace("Generating links. generator={0} result_type={1}", resourceLinkGenerator.GetType().Name, result.GetType().Name);
                }

                await resourceLinkGenerator.AddLinksAsync(apiLinkGenerator, context, result);
            }
        }
コード例 #2
0
 /// <inheritdoc />
 public ValueTask AddLinksAsync(IApiLinkGenerator apiLinkGenerator, ApiOperationContext context, ILinkableResource linkableResource)
 {
     if (!(linkableResource is T asTypedResource))
     {
         return(default);
コード例 #3
0
        /// <inheritdoc/>
        public async ValueTask AddLinksAsync(IApiLinkGenerator apiLinkGenerator, ApiOperationContext context, ILinkableResource linkableResource)
        {
            Guard.NotNull(nameof(context), context);
            Guard.NotNull(nameof(linkableResource), linkableResource);

            var traceLogEnabled = this._logger.IsEnabled(LogLevel.Trace);
            var links           = context.DataModel.GetLinksForResource(linkableResource.GetType());

            if (links.Count == 0)
            {
                if (traceLogEnabled)
                {
                    this._logger.LogTrace(
                        "No links have been registered for linkable resource {0}",
                        linkableResource.GetType());
                }

                return;
            }

            // When trace is enabled, log all links we would be checking, else if debug just the count, otherwise nothing logged here
            if (traceLogEnabled)
            {
                this._logger.LogTrace("Attempting to add {0} links for the linkable resource {1}.", links.Count, linkableResource.GetType());
            }

            foreach (var link in links)
            {
                var entityOperation     = link.OperationDescriptor;
                var entityOperationName = entityOperation.OperationType.Name;

                if (!entityOperation.IsExposed)
                {
                    if (traceLogEnabled)
                    {
                        this._logger.LogTrace("Operation not exposed, excluding. operation_type={0}", entityOperationName);
                    }

                    continue;
                }

                var result = await this._apiAuthoriserAggregator.CanShowLinkAsync(context, entityOperation, linkableResource);

                if (result.IsAllowed == false)
                {
                    if (traceLogEnabled)
                    {
                        this._logger.LogTrace("Operation is not allowed to be executed, excluding. operation_type={0}", entityOperationName);
                    }

                    continue;
                }

                var url = this._linkGenerator.CreateUrl(link, linkableResource);

                // We could not generate this URL, a placeholder value could not be injected. We therefore skip it
                if (url == null)
                {
                    if (traceLogEnabled)
                    {
                        this._logger.LogTrace("Cannot add link, URL was not generated. operation_type={0}", entityOperationName);
                    }

                    continue;
                }

                if (traceLogEnabled)
                {
                    this._logger.LogTrace("All checks passed. Adding link. operation_type={0}", entityOperationName);
                }

                linkableResource.AddLink(link.Rel, new Link
                {
                    Href = url,
                });
            }
        }