Skip to content

Commit fa5202e

Browse files
committed
Removed GraphQlClient used for EditingHandler, added GraphQLClient with customisable HeaderCollection instead
1 parent 4570f44 commit fa5202e

8 files changed

Lines changed: 108 additions & 174 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using GraphQL.Client.Abstractions;
2+
using GraphQL.Client.Http;
3+
4+
namespace Sitecore.AspNetCore.SDK.GraphQL.Request
5+
{
6+
/// <summary>
7+
/// GraphQLHttpRequestWithHeaders is a class that extends GraphQLHttpRequest. It is designed to handle GraphQL HTTP
8+
/// requests with additional header support.
9+
/// </summary>
10+
public class GraphQLHttpRequestWithHeaders : GraphQLHttpRequest
11+
{
12+
/// <summary>
13+
/// Gets or sets a dictionary that stores key-value pairs of headers, where both keys and values are strings. It allows for
14+
/// easy access and manipulation of header information.
15+
/// </summary>
16+
public Dictionary<string, string> Headers { get; set; } = [];
17+
18+
/// <summary>
19+
/// Converts the current instance into an HTTP request message for GraphQL operations.
20+
/// </summary>
21+
/// <param name="options">Specifies configuration options for the GraphQL HTTP client.</param>
22+
/// <param name="serializer">Defines the method for serializing GraphQL requests and responses.</param>
23+
/// <returns>Returns an HTTP request message with the necessary headers for the GraphQL operation.</returns>
24+
public override HttpRequestMessage ToHttpRequestMessage(GraphQLHttpClientOptions options, IGraphQLJsonSerializer serializer)
25+
{
26+
HttpRequestMessage request = base.ToHttpRequestMessage(options, serializer);
27+
28+
foreach (string headerKey in Headers.Keys)
29+
{
30+
request.Headers.Add(headerKey, Headers[headerKey]);
31+
}
32+
33+
return request;
34+
}
35+
}
36+
}

src/Sitecore.AspNetCore.SDK.Pages/Extensions/PagesAppConfigurationExtensions.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.AspNetCore.Builder;
1+
using GraphQL.Client.Abstractions;
2+
using Microsoft.AspNetCore.Builder;
23
using Microsoft.AspNetCore.Http;
34
using Microsoft.Extensions.DependencyInjection;
45
using Microsoft.Extensions.Logging;
@@ -7,7 +8,6 @@
78
using Sitecore.AspNetCore.SDK.LayoutService.Client.Request;
89
using Sitecore.AspNetCore.SDK.LayoutService.Client.Serialization;
910
using Sitecore.AspNetCore.SDK.Pages.Configuration;
10-
using Sitecore.AspNetCore.SDK.Pages.GraphQL;
1111
using Sitecore.AspNetCore.SDK.Pages.Middleware;
1212
using Sitecore.AspNetCore.SDK.Pages.Request.Handlers.GraphQL;
1313
using Sitecore.AspNetCore.SDK.Pages.Services;
@@ -75,7 +75,6 @@ public static ISitecoreRenderingEngineBuilder WithSitecorePages(this ISitecoreRe
7575
}
7676

7777
services.AddSingleton<PagesMarkerService>();
78-
services.AddSingleton<IGraphQLClientFactory>(new GraphQLClientFactory(contextId));
7978
services.AddSingleton<IDictionaryService, DictionaryService>();
8079

8180
if (options != null)
@@ -114,7 +113,7 @@ public static ISitecoreLayoutClientBuilder AddSitecorePagesHandler(
114113
builder.AddHandler(name, sp
115114
=> ActivatorUtilities.CreateInstance<GraphQLEditingServiceHandler>(
116115
sp,
117-
sp.GetRequiredService<IGraphQLClientFactory>(),
116+
sp.GetRequiredService<IGraphQLClient>(),
118117
sp.GetRequiredService<ISitecoreLayoutSerializer>(),
119118
sp.GetRequiredService<ILogger<GraphQLEditingServiceHandler>>()));
120119

src/Sitecore.AspNetCore.SDK.Pages/GraphQL/GraphQLClientFactory.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/Sitecore.AspNetCore.SDK.Pages/GraphQL/IGraphQLClientFactory.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/Sitecore.AspNetCore.SDK.Pages/Request/Handlers/GraphQL/GraphQLEditingServiceHandler.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using GraphQL;
33
using GraphQL.Client.Abstractions;
44
using Microsoft.Extensions.Logging;
5+
using Sitecore.AspNetCore.SDK.GraphQL.Request;
56
using Sitecore.AspNetCore.SDK.LayoutService.Client.Exceptions;
67
using Sitecore.AspNetCore.SDK.LayoutService.Client.Interfaces;
78
using Sitecore.AspNetCore.SDK.LayoutService.Client.Request;
@@ -10,7 +11,6 @@
1011
using Sitecore.AspNetCore.SDK.LayoutService.Client.Response.Model;
1112
using Sitecore.AspNetCore.SDK.LayoutService.Client.Serialization;
1213
using Sitecore.AspNetCore.SDK.LayoutService.Client.Serialization.Fields;
13-
using Sitecore.AspNetCore.SDK.Pages.GraphQL;
1414
using Sitecore.AspNetCore.SDK.Pages.Properties;
1515
using Sitecore.AspNetCore.SDK.Pages.Services;
1616

@@ -20,17 +20,17 @@ namespace Sitecore.AspNetCore.SDK.Pages.Request.Handlers.GraphQL;
2020
/// <summary>
2121
/// Initializes a new instance of the <see cref="GraphQLEditingServiceHandler"/> class.
2222
/// </summary>
23+
/// <param name="client">The GraphQL Client used for requests</param>
2324
/// <param name="logger">The <see cref="ILogger"/> to use for logging.</param>
2425
/// <param name="dictionaryService">DictionaryService used to return all dictionary items for a Sitecore site.</param>
25-
/// <param name="clientFactory">The GraphQlClientFactory used to generate instances of the GraphQl client.</param>
2626
/// <param name="serializer">The serializer to handle response data.</param>
27-
public partial class GraphQLEditingServiceHandler(IGraphQLClientFactory clientFactory,
27+
public partial class GraphQLEditingServiceHandler(IGraphQLClient client,
2828
ISitecoreLayoutSerializer serializer,
2929
ILogger<GraphQLEditingServiceHandler> logger,
3030
IDictionaryService dictionaryService)
3131
: ILayoutRequestHandler
3232
{
33-
private readonly IGraphQLClientFactory clientFactory = clientFactory ?? throw new ArgumentNullException(nameof(clientFactory));
33+
private readonly IGraphQLClient client = client ?? throw new ArgumentNullException(nameof(client));
3434
private readonly ISitecoreLayoutSerializer serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));
3535
private readonly ILogger<GraphQLEditingServiceHandler> logger = logger ?? throw new ArgumentNullException(nameof(logger));
3636
private readonly IDictionaryService dictionaryService = dictionaryService ?? throw new ArgumentNullException(nameof(dictionaryService));
@@ -267,7 +267,7 @@ private static string GetRequestArgValue(SitecoreLayoutRequest request, string a
267267
return headers[argName].FirstOrDefault() ?? string.Empty;
268268
}
269269

270-
private static GraphQLRequest BuildEditingLayoutRequest(SitecoreLayoutRequest request, string requestLanguage)
270+
private static GraphQLHttpRequestWithHeaders BuildEditingLayoutRequest(SitecoreLayoutRequest request, string requestLanguage)
271271
{
272272
return new()
273273
{
@@ -288,14 +288,19 @@ query EditingQuery(
288288
itemId = GetRequestArgValue(request, "sc_itemid"),
289289
language = requestLanguage,
290290
version = GetRequestArgValue(request, "sc_version")
291+
},
292+
Headers = new Dictionary<string, string>
293+
{
294+
{ "sc_layoutKind", GetRequestArgValue(request, "sc_layoutKind") },
295+
{ "sc_editmode", (GetRequestArgValue(request, "mode") == "edit").ToString() }
291296
}
292297
};
293298
}
294299

295300
private async Task<SitecoreLayoutResponseContent?> HandleEditingLayoutRequest(SitecoreLayoutRequest request, string requestLanguage, List<SitecoreLayoutServiceClientException> errors)
296301
{
297-
IGraphQLClient client = clientFactory.GenerateClient(GetRequestArgValue(request, "sc_layoutKind"), GetRequestArgValue(request, "mode") == "edit");
298302
GraphQLResponse<EditingLayoutQueryResponse> response = await client.SendQueryAsync<EditingLayoutQueryResponse>(BuildEditingLayoutRequest(request, requestLanguage)).ConfigureAwait(false);
303+
299304
if (response?.Data == null)
300305
{
301306
throw new Exception(Resources.Exception_UableToProcessEditingResponse);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
using AutoFixture;
3+
using FluentAssertions;
4+
using GraphQL.Client.Abstractions;
5+
using GraphQL.Client.Http;
6+
using NSubstitute;
7+
using Sitecore.AspNetCore.SDK.AutoFixture.Attributes;
8+
using Sitecore.AspNetCore.SDK.GraphQL.Request;
9+
using Xunit;
10+
11+
namespace Sitecore.AspNetCore.SDK.GraphQL.Tests.Request;
12+
13+
public class GraphQLHttpRequestWithHeadersFixture
14+
{
15+
[ExcludeFromCodeCoverage]
16+
public static Action<IFixture> AutoSetup => f =>
17+
{
18+
GraphQLHttpClientOptions options = Substitute.For<GraphQLHttpClientOptions> ();
19+
f.Inject(options);
20+
21+
IGraphQLJsonSerializer serializer = Substitute.For<IGraphQLJsonSerializer>();
22+
f.Inject(serializer);
23+
};
24+
25+
[Theory]
26+
[AutoNSubstituteData]
27+
public void ToHttpRequestMessage_HeadersAreAddedToReturnedMessage(GraphQLHttpRequestWithHeaders sut, GraphQLHttpClientOptions options, IGraphQLJsonSerializer serializer)
28+
{
29+
// Arrange
30+
sut.Headers = new Dictionary<string, string>
31+
{
32+
{ "key1", "value1" },
33+
{ "key2", "value2" }
34+
};
35+
36+
// Act
37+
HttpRequestMessage result = sut.ToHttpRequestMessage(options, serializer);
38+
39+
// Assert
40+
result.Should().NotBeNull();
41+
result.Headers.GetValues("key1").Should().Contain("value1");
42+
result.Headers.GetValues("key2").Should().Contain("value2");
43+
}
44+
}

tests/Sitecore.AspNetCore.SDK.Pages.Tests/GraphQL/GraphQLClientFactoryFixture.cs

Lines changed: 0 additions & 79 deletions
This file was deleted.

0 commit comments

Comments
 (0)