* V2 output expansion + field limiting incl. deprecation of V1 APIs * Performance optimizations for Content and Block based property editors * A little formatting * Support API versioning in Delivery API endpoint matcher policy * Add V2 "expand" and "fields" to Swagger docs * Renamed route for "multiple items by ID" * Review changes * Update src/Umbraco.Cms.Api.Delivery/Controllers/Media/ByIdMediaApiController.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Update src/Umbraco.Cms.Api.Delivery/Filters/SwaggerDocumentationFilterBase.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Update src/Umbraco.Cms.Api.Delivery/Filters/SwaggerDocumentationFilterBase.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Revert "Performance optimizations for Content and Block based property editors" This reverts commit 0d5a57956b36e94ce951f1dad7a7f3f43eb1f60b. * Introduce explicit API cache levels for property expansion * Friendly handling of bad expand/fields parameters --------- Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
86 lines
4.5 KiB
C#
86 lines
4.5 KiB
C#
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
using Asp.Versioning;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Routing;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Umbraco.Cms.Api.Common.DependencyInjection;
|
|
using Umbraco.Cms.Api.Delivery.Accessors;
|
|
using Umbraco.Cms.Api.Delivery.Configuration;
|
|
using Umbraco.Cms.Api.Delivery.Handlers;
|
|
using Umbraco.Cms.Api.Delivery.Json;
|
|
using Umbraco.Cms.Api.Delivery.Rendering;
|
|
using Umbraco.Cms.Api.Delivery.Routing;
|
|
using Umbraco.Cms.Api.Delivery.Security;
|
|
using Umbraco.Cms.Api.Delivery.Services;
|
|
using Umbraco.Cms.Core;
|
|
using Umbraco.Cms.Core.DeliveryApi;
|
|
using Umbraco.Cms.Core.DependencyInjection;
|
|
using Umbraco.Cms.Core.Notifications;
|
|
using Umbraco.Cms.Infrastructure.Security;
|
|
|
|
namespace Umbraco.Extensions;
|
|
|
|
public static class UmbracoBuilderExtensions
|
|
{
|
|
public static IUmbracoBuilder AddDeliveryApi(this IUmbracoBuilder builder)
|
|
{
|
|
builder.Services.AddScoped<IRequestStartItemProvider, RequestStartItemProvider>();
|
|
builder.Services.AddScoped<RequestContextOutputExpansionStrategy>();
|
|
builder.Services.AddScoped<RequestContextOutputExpansionStrategyV2>();
|
|
builder.Services.AddScoped<IOutputExpansionStrategy>(provider =>
|
|
{
|
|
HttpContext? httpContext = provider.GetRequiredService<IHttpContextAccessor>().HttpContext;
|
|
ApiVersion? apiVersion = httpContext?.GetRequestedApiVersion();
|
|
if (apiVersion is null)
|
|
{
|
|
return provider.GetRequiredService<RequestContextOutputExpansionStrategyV2>();
|
|
}
|
|
|
|
// V1 of the Delivery API uses a different expansion strategy than V2+
|
|
return apiVersion.MajorVersion == 1
|
|
? provider.GetRequiredService<RequestContextOutputExpansionStrategy>()
|
|
: provider.GetRequiredService<RequestContextOutputExpansionStrategyV2>();
|
|
});
|
|
builder.Services.AddSingleton<IRequestCultureService, RequestCultureService>();
|
|
builder.Services.AddSingleton<IRequestRoutingService, RequestRoutingService>();
|
|
builder.Services.AddSingleton<IRequestRedirectService, RequestRedirectService>();
|
|
builder.Services.AddSingleton<IRequestPreviewService, RequestPreviewService>();
|
|
builder.Services.AddSingleton<IOutputExpansionStrategyAccessor, RequestContextOutputExpansionStrategyAccessor>();
|
|
builder.Services.AddSingleton<IRequestStartItemProviderAccessor, RequestContextRequestStartItemProviderAccessor>();
|
|
builder.Services.AddSingleton<IApiAccessService, ApiAccessService>();
|
|
builder.Services.AddSingleton<IApiContentQueryService, ApiContentQueryService>();
|
|
builder.Services.AddSingleton<IApiContentQueryProvider, ApiContentQueryProvider>();
|
|
builder.Services.AddSingleton<IApiMediaQueryService, ApiMediaQueryService>();
|
|
builder.Services.AddTransient<IMemberApplicationManager, MemberApplicationManager>();
|
|
builder.Services.AddTransient<IRequestMemberAccessService, RequestMemberAccessService>();
|
|
|
|
builder.Services.ConfigureOptions<ConfigureUmbracoDeliveryApiSwaggerGenOptions>();
|
|
builder.AddUmbracoApiOpenApiUI();
|
|
|
|
builder
|
|
.Services
|
|
.AddControllers()
|
|
.AddJsonOptions(Constants.JsonOptionsNames.DeliveryApi, options =>
|
|
{
|
|
// all Delivery API specific JSON options go here
|
|
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
|
options.JsonSerializerOptions.TypeInfoResolver = new DeliveryApiJsonTypeResolver();
|
|
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
|
|
});
|
|
|
|
builder.Services.AddAuthentication();
|
|
builder.AddUmbracoOpenIddict();
|
|
builder.AddNotificationAsyncHandler<UmbracoApplicationStartingNotification, InitializeMemberApplicationNotificationHandler>();
|
|
builder.AddNotificationAsyncHandler<MemberSavedNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
|
|
builder.AddNotificationAsyncHandler<MemberDeletedNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
|
|
builder.AddNotificationAsyncHandler<AssignedMemberRolesNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
|
|
builder.AddNotificationAsyncHandler<RemovedMemberRolesNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
|
|
|
|
// FIXME: remove this when Delivery API V1 is removed
|
|
builder.Services.AddSingleton<MatcherPolicy, DeliveryApiItemsEndpointsMatcherPolicy>();
|
|
return builder;
|
|
}
|
|
}
|
|
|