Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.

Commit 6fac62e

Browse files
Refactor for common methods
1 parent 85cced4 commit 6fac62e

File tree

8 files changed

+95
-89
lines changed

8 files changed

+95
-89
lines changed

APIs/src/EpiServer.ContentGraph/Api/Querying/BaseTypeQueryBuilder.cs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using EPiServer.ContentGraph.Helpers;
2+
using EPiServer.ContentGraph.Helpers.Reflection;
23
using EPiServer.ContentGraph.Helpers.Text;
34
using GraphQL.Transport;
45
using System;
6+
using System.Linq.Expressions;
57

68
namespace EPiServer.ContentGraph.Api.Querying
79
{
@@ -157,7 +159,42 @@ public virtual BaseTypeQueryBuilder Children(ITypeQueryBuilder children)
157159

158160
return this;
159161
}
160-
public virtual BaseTypeQueryBuilder AddFragments(params FragmentBuilder[] fragments)
162+
protected virtual void AppendItem(string item)
163+
{
164+
if (!item.IsNullOrEmpty())
165+
{
166+
graphObject.SelectItems.Append(graphObject.SelectItems.Length > 0 ? $" {item}": item);
167+
}
168+
}
169+
}
170+
171+
public class BaseTypeQueryBuilder<T> : BaseTypeQueryBuilder
172+
{
173+
public BaseTypeQueryBuilder():base() { }
174+
public BaseTypeQueryBuilder(GraphQLRequest query): base(query) { }
175+
/// <summary>
176+
/// Select properties of an IEnumerable of <typeparamref name="TField"/>
177+
/// </summary>
178+
/// <typeparam name="TField"></typeparam>
179+
/// <param name="enumSelector">IEnumerable property of <typeparamref name="T"/></param>
180+
/// <param name="fieldSelectors">Fields of type <typeparamref name="TField"/></param>
181+
/// <returns></returns>
182+
public virtual BaseTypeQueryBuilder<T> NestedFields<TField>(Expression<Func<T, IEnumerable<TField>>> enumSelector, params Expression<Func<TField, object>>[] fieldSelectors)
183+
{
184+
enumSelector.ValidateNotNullArgument("fieldSelector");
185+
fieldSelectors.ValidateNotNullArgument("fields");
186+
var enumPath = enumSelector.GetFieldPath();
187+
string fields = string.Empty;
188+
foreach (var fieldSelector in fieldSelectors)
189+
{
190+
fields += fields.IsNullOrEmpty() ? fieldSelector.GetFieldPath() : $" {fieldSelector.GetFieldPath()}";
191+
}
192+
var combinedPath = ConvertNestedFieldToString.ConvertNestedFieldForQuery($"{enumPath}.{fields}");
193+
Field(combinedPath);
194+
return this;
195+
}
196+
197+
public virtual BaseTypeQueryBuilder<T> AddFragments(params IFragmentBuilder[] fragments)
161198
{
162199
fragments.ValidateNotNullArgument("fragments");
163200
foreach (var fragment in fragments)
@@ -166,12 +203,12 @@ public virtual BaseTypeQueryBuilder AddFragments(params FragmentBuilder[] fragme
166203
}
167204
return this;
168205
}
169-
protected virtual BaseTypeQueryBuilder AddFragment(FragmentBuilder fragment)
206+
protected virtual BaseTypeQueryBuilder<T> AddFragment(IFragmentBuilder fragment)
170207
{
171208
AddFragment(null, fragment);
172209
return this;
173210
}
174-
public virtual BaseTypeQueryBuilder AddFragment(string fieldPath, FragmentBuilder fragment)
211+
public virtual BaseTypeQueryBuilder<T> AddFragment(string fieldPath, IFragmentBuilder fragment)
175212
{
176213
fragment.ValidateNotNullArgument("fragment");
177214
string propName;
@@ -200,11 +237,11 @@ public virtual BaseTypeQueryBuilder AddFragment(string fieldPath, FragmentBuilde
200237
}
201238
return this;
202239
}
203-
private IEnumerable<FragmentBuilder> GetAllChildren(FragmentBuilder fragment)
240+
private IEnumerable<IFragmentBuilder> GetAllChildren(IFragmentBuilder fragment)
204241
{
205242
if (fragment.HasChildren)
206243
{
207-
foreach (var child in fragment.ChildrenFragments)
244+
foreach (var child in fragment.GetChildren())
208245
{
209246
if (Parent.HasFragment(child.GetName()))
210247
{
@@ -226,12 +263,5 @@ private IEnumerable<FragmentBuilder> GetAllChildren(FragmentBuilder fragment)
226263
}
227264
}
228265

229-
protected virtual void AppendItem(string item)
230-
{
231-
if (!item.IsNullOrEmpty())
232-
{
233-
graphObject.SelectItems.Append(graphObject.SelectItems.Length > 0 ? $" {item}": item);
234-
}
235-
}
236266
}
237267
}

APIs/src/EpiServer.ContentGraph/Api/Querying/FragmentBuilder.cs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010

1111
namespace EPiServer.ContentGraph.Api.Querying
1212
{
13+
public interface IFragmentBuilder
14+
{
15+
public string GetName();
16+
public GraphQLRequest GetQuery();
17+
public bool HasChildren { get; }
18+
public IEnumerable<IFragmentBuilder> GetChildren();
19+
}
1320
public class Recursion
1421
{
1522
public string FieldName { get; set; }
@@ -25,14 +32,13 @@ public override string ToString()
2532
return ConvertNestedFieldToString.ConvertNestedFieldForQuery($"{FieldName} @recursive(depth:{RecursiveDepth.Value})");
2633
}
2734
}
28-
}
29-
public class FragmentBuilder : BaseTypeQueryBuilder
35+
}
36+
public class FragmentBuilder<T> : BaseTypeQueryBuilder<T>, IFragmentBuilder
3037
{
31-
private List<FragmentBuilder> _childrenFragments;
32-
public IEnumerable<FragmentBuilder> ChildrenFragments => _childrenFragments;
38+
private List<IFragmentBuilder> _childrenFragments;
39+
public IEnumerable<IFragmentBuilder> GetChildren() => _childrenFragments;
3340
public bool HasChildren => _childrenFragments != null && _childrenFragments.Any();
34-
public FragmentBuilder() : base()
35-
{
41+
public FragmentBuilder() : base() {
3642
_query.OperationName = "sampleFragment";
3743
}
3844
public void OperationName(string name)
@@ -43,40 +49,38 @@ public void OperationName(string name)
4349
_query.OperationName = name;
4450
}
4551
}
52+
public FragmentBuilder(string name)
53+
{
54+
OperationName(name);
55+
}
4656
public string GetName()
4757
{
4858
return _query.OperationName;
4959
}
50-
public override FragmentBuilder AddFragments(params FragmentBuilder[] fragments)
60+
public override FragmentBuilder<T> AddFragments(params IFragmentBuilder[] fragments)
5161
{
5262
if (fragments.IsNotNull() && fragments.Length > 0)
5363
{
5464
if (_childrenFragments.IsNull())
5565
{
56-
_childrenFragments = new List<FragmentBuilder>();
66+
_childrenFragments = new List<IFragmentBuilder>();
5767
}
5868
base.AddFragments(fragments);
5969
_childrenFragments.AddRange(fragments);
6070
}
6171
return this;
6272
}
63-
public override FragmentBuilder AddFragment(string path, FragmentBuilder fragment)
73+
public override FragmentBuilder<T> AddFragment(string path, IFragmentBuilder fragment)
6474
{
65-
_childrenFragments ??= new List<FragmentBuilder>();
75+
if (_childrenFragments.IsNull())
76+
{
77+
_childrenFragments = new List<IFragmentBuilder>();
78+
}
6679
base.AddFragment(path, fragment);
6780
_childrenFragments.Add(fragment);
6881

6982
return this;
7083
}
71-
}
72-
73-
public class FragmentBuilder<T> : FragmentBuilder
74-
{
75-
public FragmentBuilder() : base() { }
76-
public FragmentBuilder(string name)
77-
{
78-
base.OperationName(name);
79-
}
8084
private FragmentBuilder<T> Field(Expression<Func<T, object>> fieldSelector)
8185
{
8286
fieldSelector.ValidateNotNullArgument("fieldSelector");
@@ -109,7 +113,7 @@ public FragmentBuilder<T> Children<TChildren>(TypeQueryBuilder<TChildren> childr
109113
base.Children(children);
110114
return this;
111115
}
112-
private FragmentBuilder Recursive<TSub>(params Recursion[] recursives) where TSub : T
116+
private FragmentBuilder<T> Recursive<TSub>(params Recursion[] recursives) where TSub : T
113117
{
114118
recursives.ValidateNotNullArgument("recursives");
115119
if (!recursives.Any()) throw new ArgumentException("recursives can not be empty");
@@ -203,7 +207,7 @@ public FragmentBuilder<T> AddFragment<TProp>(Expression<Func<T, TProp>> fieldSel
203207
fragment.ValidateNotNullArgument(nameof(fragment));
204208

205209
var fieldPath = fieldSelector.GetFieldPath();
206-
base.AddFragment(fieldPath, fragment);
210+
AddFragment(fieldPath, fragment);
207211
return this;
208212
}
209213
public override GraphQLRequest GetQuery()

APIs/src/EpiServer.ContentGraph/Api/Querying/GraphQueryBuilder.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class GraphQueryBuilder : IQuery
2727
private readonly OptiGraphOptions _optiGraphOptions;
2828
private const string RequestMethod = "POST";
2929
private const string UnCachedPath = "?cache=false";
30-
private Dictionary<string, FragmentBuilder> _fragmentBuilders;
30+
private Dictionary<string, IFragmentBuilder> _fragmentBuilders;
3131
private readonly List<string> typeQueries = new List<string>();
3232
public GraphQueryBuilder()
3333
{
@@ -92,15 +92,15 @@ public TypeQueryBuilder<T> ForType<T>(TypeQueryBuilder<T> typeQueryBuilder)
9292
typeQueryBuilder.Parent = this;
9393
return typeQueryBuilder;
9494
}
95-
public void AddFragment(FragmentBuilder fragmentBuilder)
95+
public void AddFragment(IFragmentBuilder fragmentBuilder)
9696
{
9797
if (_fragmentBuilders == null)
9898
{
99-
_fragmentBuilders = new Dictionary<string, FragmentBuilder>();
99+
_fragmentBuilders = new Dictionary<string, IFragmentBuilder>();
100100
}
101101
_fragmentBuilders.TryAdd(fragmentBuilder.GetName(), fragmentBuilder);
102102
}
103-
public IEnumerable<FragmentBuilder> GetFragments()
103+
public IEnumerable<IFragmentBuilder> GetFragments()
104104
{
105105
return _fragmentBuilders?.Values;
106106
}
@@ -136,12 +136,12 @@ private string GetHmacHeader(byte[] requestBody)
136136
DefaultHmacDeclarationFactory hmacDeclarationFactory =
137137
new DefaultHmacDeclarationFactory(new Sha256HmacAlgorithm(Convert.FromBase64String(_optiGraphOptions.Secret)));
138138
HmacMessage hmacMessage = GetHmacMessage(requestBody);
139-
HmacDeclaration? hmacDeclaration = hmacDeclarationFactory.Create(hmacMessage);
139+
HmacDeclaration hmacDeclaration = hmacDeclarationFactory.Create(hmacMessage);
140140
return $"{hmacDeclaration}";
141141
}
142142
private HmacMessage GetHmacMessage(byte[] requestBody)
143143
{
144-
DefaultHmacMessageBuilder? messageBuilder = new DefaultHmacMessageBuilder()
144+
DefaultHmacMessageBuilder messageBuilder = new DefaultHmacMessageBuilder()
145145
.AddApplicationKey(_optiGraphOptions.AppKey)
146146
.AddTarget(new Uri(GetServiceUrl()).PathAndQuery)
147147
.AddMethod(RequestMethod)

APIs/src/EpiServer.ContentGraph/Api/Querying/IQuery.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ public interface IQuery
77
{
88
public Task<ContentGraphResult<TResult>> GetResultAsync<TResult>();
99
public Task<ContentGraphResult> GetResultAsync();
10-
internal void AddFragment(FragmentBuilder fragmentBuilder);
1110
internal bool HasFragment(string fragmentName);
11+
internal void AddFragment(IFragmentBuilder fragmentBuilder);
1212
internal void AddQuery(string typeQuery);
1313
}
1414
}

APIs/src/EpiServer.ContentGraph/Api/Querying/SubTypeQueryBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace EPiServer.ContentGraph.Api.Querying
88
{
9-
public class SubTypeQueryBuilder<T> : BaseTypeQueryBuilder
9+
public class SubTypeQueryBuilder<T> : BaseTypeQueryBuilder<T>
1010
{
1111
public SubTypeQueryBuilder():base()
1212
{
@@ -68,12 +68,12 @@ public SubTypeQueryBuilder<T> Children<TChildren>(TypeQueryBuilder<TChildren> ch
6868
base.Children(children);
6969
return this;
7070
}
71-
public override SubTypeQueryBuilder<T> AddFragments(params FragmentBuilder[] fragments)
71+
public override SubTypeQueryBuilder<T> AddFragments(params IFragmentBuilder[] fragments)
7272
{
7373
base.AddFragments(fragments);
7474
return this;
7575
}
76-
protected override SubTypeQueryBuilder<T> AddFragment(FragmentBuilder fragment)
76+
protected override SubTypeQueryBuilder<T> AddFragment(IFragmentBuilder fragment)
7777
{
7878
base.AddFragment(fragment);
7979
return this;

APIs/src/EpiServer.ContentGraph/Api/Querying/TypeQueryBuilder.cs

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
namespace EPiServer.ContentGraph.Api.Querying
1414
{
15-
public partial class TypeQueryBuilder<T> : TypeQueryBuilder
15+
public partial class TypeQueryBuilder<T> : BaseTypeQueryBuilder<T>
1616
{
17-
private static IEnumerable<IFilterForVisitor>? _filters;
17+
private static IEnumerable<IFilterForVisitor> _filters;
1818
public TypeQueryBuilder(GraphQLRequest request) : base(request)
1919
{
2020
}
@@ -52,23 +52,23 @@ public TypeQueryBuilder<T> Children<TChildren>(TypeQueryBuilder<TChildren> child
5252
return this;
5353
}
5454
[Obsolete("Use AddFragments method instead")]
55-
public TypeQueryBuilder<T> Fragments(params FragmentBuilder[] fragments)
55+
public TypeQueryBuilder<T> Fragments(params IFragmentBuilder[] fragments)
5656
{
5757
base.AddFragments(fragments);
5858
return this;
5959
}
60-
public override TypeQueryBuilder<T> AddFragments(params FragmentBuilder[] fragments)
60+
public override TypeQueryBuilder<T> AddFragments(params IFragmentBuilder[] fragments)
6161
{
6262
base.AddFragments(fragments);
6363
return this;
6464
}
6565
[Obsolete("Use AddFragment method instead")]
66-
public TypeQueryBuilder<T> Fragment(FragmentBuilder fragment)
66+
public TypeQueryBuilder<T> Fragment(IFragmentBuilder fragment)
6767
{
6868
base.AddFragment(fragment);
6969
return this;
7070
}
71-
protected override TypeQueryBuilder<T> AddFragment(FragmentBuilder fragment)
71+
protected override TypeQueryBuilder<T> AddFragment(IFragmentBuilder fragment)
7272
{
7373
base.AddFragment(fragment);
7474
return this;
@@ -125,26 +125,9 @@ public TypeQueryBuilder<T> Fields(params Expression<Func<T, object>>[] fieldSele
125125
}
126126
return this;
127127
}
128-
/// <summary>
129-
/// Select properties of an IEnumerable of <typeparamref name="TField"/>
130-
/// </summary>
131-
/// <typeparam name="TField"></typeparam>
132-
/// <param name="enumSelector">IEnumerable property of <typeparamref name="T"/></param>
133-
/// <param name="fieldSelectors">Fields of type <typeparamref name="TField"/></param>
134-
/// <returns></returns>
135-
public TypeQueryBuilder<T> NestedFields<TField>(Expression<Func<T, IEnumerable<TField>>> enumSelector, params Expression<Func<TField, object>>[] fieldSelectors )
128+
public override TypeQueryBuilder<T> NestedFields<TField>(Expression<Func<T, IEnumerable<TField>>> enumSelector, params Expression<Func<TField, object>>[] fieldSelectors)
136129
{
137-
enumSelector.ValidateNotNullArgument("fieldSelector");
138-
fieldSelectors.ValidateNotNullArgument("fields");
139-
var enumPath = enumSelector.GetFieldPath();
140-
string fields = string.Empty;
141-
foreach (var fieldSelector in fieldSelectors)
142-
{
143-
fields += fields.IsNullOrEmpty() ? fieldSelector.GetFieldPath(): $" {fieldSelector.GetFieldPath()}";
144-
}
145-
var combinedPath = ConvertNestedFieldToString.ConvertNestedFieldForQuery($"{enumPath}.{fields}");
146-
Field(combinedPath);
147-
return this;
130+
return (TypeQueryBuilder<T>)base.NestedFields(enumSelector, fieldSelectors);
148131
}
149132
[Obsolete("Obsoleted. Use InlineFragment instead")]
150133
/// <summary>
@@ -896,15 +879,4 @@ public override GraphQueryBuilder ToQuery()
896879
return this.Parent != null ? (GraphQueryBuilder)this.Parent : new GraphQueryBuilder(_query, this);
897880
}
898881
}
899-
900-
public class TypeQueryBuilder : BaseTypeQueryBuilder
901-
{
902-
public TypeQueryBuilder(GraphQLRequest request) : base(request)
903-
{
904-
}
905-
public TypeQueryBuilder() : base()
906-
{
907-
}
908-
909-
}
910882
}

APIs/src/EpiServer.ContentGraph/Extensions/TypeSearchExtension.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,15 @@ public static GraphQueryBuilder EndType<T>(this TypeQueryBuilder<T> typeQueryBui
100100
#endregion
101101

102102
#region Get results
103-
public static async Task<ContentGraphResult<TResult>> GetResultAsync<TResult>(this TypeQueryBuilder typeQueryBuilder)
103+
public static async Task<ContentGraphResult<TResult>> GetResultAsync<T,TResult>(this TypeQueryBuilder<T> typeQueryBuilder)
104104
{
105-
return await typeQueryBuilder.ToQuery().BuildQueries().GetResultAsync<TResult>();
106-
}
107-
public static async Task<ContentGraphResult> GetResultAsync(this TypeQueryBuilder typeQueryBuilder)
105+
return await typeQueryBuilder.ToQuery().BuildQueries().GetResultAsync<TResult>();
106+
}
107+
public static async Task<ContentGraphResult> GetResultAsync<T>(this TypeQueryBuilder<T> typeQueryBuilder)
108108
{
109109
return await typeQueryBuilder.ToQuery().BuildQueries().GetResultAsync();
110110
}
111-
public static async Task<string> GetRawResultAsync(this TypeQueryBuilder typeQueryBuilder)
111+
public static async Task<string> GetRawResultAsync<T>(this TypeQueryBuilder<T> typeQueryBuilder)
112112
{
113113
return await typeQueryBuilder.ToQuery().BuildQueries().GetRawResultAsync();
114114
}

0 commit comments

Comments
 (0)