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); } }
/// <inheritdoc /> public ValueTask AddLinksAsync(IApiLinkGenerator apiLinkGenerator, ApiOperationContext context, ILinkableResource linkableResource) { if (!(linkableResource is T asTypedResource)) { return(default);
/// <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, }); } }