Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using GraphQL.Client.Abstractions;
using GraphQL.Client.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Sitecore.AspNetCore.SDK.GraphQL.Client.Models;
using Sitecore.AspNetCore.SDK.GraphQL.Exceptions;
using Sitecore.AspNetCore.SDK.GraphQL.Properties;
Expand All @@ -23,20 +24,21 @@ public static IServiceCollection AddGraphQlClient(this IServiceCollection servic
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(configuration);

services.Configure(configuration);
services.Configure<SitecoreGraphQlClientOptions>(x => TryGetConfiguration(x, configuration));

SitecoreGraphQlClientOptions options = TryGetConfiguration(configuration);

services.AddSingleton<IGraphQLClient, GraphQLHttpClient>(_ =>
services.AddSingleton<IGraphQLClient, GraphQLHttpClient>(sp =>
{
var options = sp.GetRequiredService<IOptions<SitecoreGraphQlClientOptions>>().Value;
ValidateOptions(options);

if (!string.IsNullOrWhiteSpace(options.ContextId))
{
options.EndPoint = options.EndPoint.AddQueryString(
SitecoreGraphQlClientOptions.ContextIdQueryStringKey,
options.ContextId);
}

GraphQLHttpClient graphQlHttpClient = new(options.EndPoint!, options.GraphQlJsonSerializer);
GraphQLHttpClient graphQlHttpClient = new(options, options.GraphQlJsonSerializer);

if (!string.IsNullOrWhiteSpace(options.ApiKey))
{
Expand All @@ -49,11 +51,20 @@ public static IServiceCollection AddGraphQlClient(this IServiceCollection servic
return services;
}

private static SitecoreGraphQlClientOptions TryGetConfiguration(Action<SitecoreGraphQlClientOptions> configuration)
private static SitecoreGraphQlClientOptions TryGetConfiguration(SitecoreGraphQlClientOptions options, Action<SitecoreGraphQlClientOptions> configuration)
{
SitecoreGraphQlClientOptions options = new();
configuration.Invoke(options);

if (options.EndPoint == null && !string.IsNullOrWhiteSpace(options.ContextId))
{
options.EndPoint = SitecoreGraphQlClientOptions.DefaultEdgeEndpoint;
}

return options;
}

private static void ValidateOptions(SitecoreGraphQlClientOptions options)
{
if (string.IsNullOrWhiteSpace(options.ApiKey) && string.IsNullOrWhiteSpace(options.ContextId))
{
throw new InvalidGraphQlConfigurationException(Resources.Exception_MissingApiKeyAndContextId);
Expand All @@ -67,7 +78,5 @@ private static SitecoreGraphQlClientOptions TryGetConfiguration(Action<SitecoreG
{
throw new InvalidGraphQlConfigurationException(Resources.Exception_MissingEndpoint);
}

return options;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Sitecore.AspNetCore.SDK.LayoutService.Client.Configuration;
using Sitecore.AspNetCore.SDK.LayoutService.Client.Interfaces;
using Sitecore.AspNetCore.SDK.LayoutService.Client.Properties;
Expand Down Expand Up @@ -329,8 +330,14 @@ public static ILayoutRequestHandlerBuilder<GraphQlLayoutServiceHandler> AddGraph
uri ??= new Uri("https://edge-platform.sitecorecloud.io/v1/content/api/graphql/v1");
uri = uri.AddQueryString("sitecoreContextId", contextId)!;

GraphQLHttpClient client = new(uri, new SystemTextJsonSerializer());
builder.Services.TryAddKeyedSingleton<IGraphQLClient>(name, client);
builder.Services.TryAddKeyedSingleton<IGraphQLClient>(name, (sp, serviceKey) =>
{
var optionsKeyed = sp.GetKeyedService<IOptions<GraphQLHttpClientOptions>>(serviceKey) ?? sp.GetRequiredService<IOptions<GraphQLHttpClientOptions>>();
var clientOptions = optionsKeyed.Value;
clientOptions.EndPoint = uri;
GraphQLHttpClient client = new(clientOptions, new SystemTextJsonSerializer());
return client;
});

builder.WithDefaultRequestOptions(request =>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ public void AddGraphQlClient_NullProperties_ThrowsExceptions(IServiceCollection
[Fact]
public void AddGraphQlClient_EmptyApiKey_InConfiguration_ThrowsExceptions()
{
Func<IServiceCollection> act =
() => Substitute.For<IServiceCollection>().AddGraphQlClient(_ => { });
var services = new ServiceCollection();
services.AddGraphQlClient(_ => { });
var sp = services.BuildServiceProvider();
Func<IGraphQLClient> act = () => sp.GetRequiredService<IGraphQLClient>();
act.Should().Throw<InvalidGraphQlConfigurationException>()
.WithMessage(Resources.Exception_MissingApiKeyAndContextId);
}
Expand All @@ -41,11 +43,13 @@ public void AddGraphQlClient_EmptyApiKey_InConfiguration_ThrowsExceptions()
[AutoData]
public void AddGraphQlClient_EmptyEndpoint_WithApiKey_ThrowsExceptions(string apiKey)
{
Func<IServiceCollection> act =
() => Substitute.For<IServiceCollection>().AddGraphQlClient(options =>
{
options.ApiKey = apiKey;
});
var services = new ServiceCollection();
services.AddGraphQlClient(options =>
{
options.ApiKey = apiKey;
});
var sp = services.BuildServiceProvider();
Func<IGraphQLClient> act = () => sp.GetRequiredService<IGraphQLClient>();
act.Should().Throw<InvalidGraphQlConfigurationException>()
.WithMessage(Resources.Exception_MissingEndpoint);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using GraphQL.Client.Serializer.SystemTextJson;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using NSubstitute.Extensions;
using Sitecore.AspNetCore.SDK.AutoFixture.Attributes;
using Sitecore.AspNetCore.SDK.AutoFixture.Mocks;
using Sitecore.AspNetCore.SDK.LayoutService.Client.Extensions;
Expand Down Expand Up @@ -40,13 +41,7 @@ public async Task ContextRequest_Ok(string handlerName, string contextId)
};
message.Content.Headers.ContentType = new MediaTypeHeaderValue("application/graphql+json");
result.Responses.Push(message);
ServiceDescriptor gqlClient = services.Single(s => s.ServiceKey?.ToString() == handlerName);
GraphQLHttpClientOptions options = ((GraphQLHttpClient)gqlClient.KeyedImplementationInstance!).Options;
options.HttpMessageHandler = result;
services.RemoveAllKeyed<IGraphQLClient>(handlerName);
services.AddKeyedSingleton<IGraphQLClient>(handlerName, new GraphQLHttpClient(
options,
new SystemTextJsonSerializer()));
services.Configure<GraphQLHttpClientOptions>(options => options.HttpMessageHandler = result);

// Build and grab the sut
IServiceProvider provider = services.BuildServiceProvider();
Expand Down