Skip to content

Commit d7ca6f4

Browse files
authored
Add IEnumerable and IQueryable connections (#121)
1 parent c213420 commit d7ca6f4

26 files changed

+971
-78
lines changed

.vscode/tasks.json

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
{
2-
"version": "0.1.0",
3-
"command": "dotnet",
4-
"isShellCommand": true,
5-
"args": [],
6-
"tasks": [
7-
{
8-
"taskName": "build",
9-
"args": [
10-
"${workspaceRoot}/src/GraphQL.Relay.Todo/GraphQL.Relay.Todo.csproj"
11-
],
12-
"isBuildCommand": true,
13-
"problemMatcher": "$msCompile"
14-
}
15-
]
2+
"version": "2.0.0",
3+
"tasks": [
4+
{
5+
"label": "build",
6+
"type": "shell",
7+
"command": "dotnet",
8+
"args": [
9+
"build",
10+
"${workspaceRoot}/src/GraphQL.Relay.Todo/GraphQL.Relay.Todo.csproj"
11+
],
12+
"problemMatcher": "$msCompile",
13+
"group": {
14+
"kind": "build",
15+
"isDefault": true
16+
}
17+
}
18+
]
1619
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"main": "index.js",
66
"scripts": {
7-
"test": "dotnet test src/GraphQL.Relay.Tests",
7+
"test": "dotnet test src/GraphQL.Relay.Test",
88
"pack": "rimraf nuget/* && dotnet pack src/GraphQL.Relay -o nuget -c Release --include-source --include-symbols",
99
"version": "node tools/version",
1010
"release": "npm run test && npm run pack && cd nuget && nuget push *.symbols.nupkg -s https://www.nuget.org/api/v2/package"

src/GraphQL.Relay.ApiTests/GraphQL.Relay.approved.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,21 @@ namespace GraphQL.Relay.Types
135135
{
136136
public QueryGraphType() { }
137137
}
138+
public static class SliceMetrics
139+
{
140+
public static GraphQL.Relay.Types.SliceMetrics<TSource> Create<TSource>(System.Linq.IQueryable<TSource> source, GraphQL.Builders.IResolveConnectionContext context) { }
141+
public static GraphQL.Relay.Types.SliceMetrics<TSource> Create<TSource>(System.Collections.Generic.IEnumerable<TSource> source, GraphQL.Builders.IResolveConnectionContext context, int? totalCount = default) { }
142+
}
143+
public class SliceMetrics<TSource>
144+
{
145+
public SliceMetrics(System.Collections.Generic.IList<TSource> source, GraphQL.Relay.Utilities.EdgeRange edges, int totalCount) { }
146+
public bool HasNext { get; }
147+
public bool HasPrevious { get; }
148+
public System.Collections.Generic.IEnumerable<TSource> Slice { get; }
149+
public int SliceSize { get; }
150+
public int StartIndex { get; }
151+
public int TotalCount { get; }
152+
}
138153
}
139154
namespace GraphQL.Relay.Utilities
140155
{
@@ -156,6 +171,11 @@ namespace GraphQL.Relay.Utilities
156171
{
157172
public static GraphQL.Relay.Utilities.EdgeRange CalculateEdgeRange(int edgeCount, int? first = default, string after = null, int? last = default, string before = null) { }
158173
}
174+
public static class ResolveConnectionContextExtensions
175+
{
176+
public static GraphQL.Relay.Utilities.EdgeRange EdgesToReturn(this GraphQL.Builders.IResolveConnectionContext context, int edgeCount) { }
177+
public static GraphQL.Types.Relay.DataObjects.Connection<TSource> ToConnection<TSource>(this GraphQL.Builders.IResolveConnectionContext context, System.Collections.Generic.IEnumerable<TSource> items, int? totalCount = default) { }
178+
}
159179
public static class StringExtensions
160180
{
161181
public static string Base64Decode(this string value) { }

src/GraphQL.Relay.StarWars/Api/Swapi.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,26 +74,23 @@ private static bool DoneFetching(int count, ConnectionArguments args)
7474
return count >= args.First.Value;
7575
}
7676

77-
public async Task<List<T>> GetConnectionAsync<T>(ConnectionArguments args)
77+
public async Task<ConnectionEntities<T>> GetConnectionAsync<T>(ConnectionArguments args)
7878
where T : Entity
7979
{
80+
var count = 0;
8081
var nextUrl = new Uri($"{API_BASE}/{typeof(T).Name.ToLower()}/");
8182
var entities = new List<T>();
82-
var canStopEarly = // TODO: unused ?
83-
args.After != null ||
84-
args.Before != null ||
85-
args.Last != null ||
86-
args.First == null;
8783

8884
EntityList<T> page;
8985
while (nextUrl != null && !DoneFetching(entities.Count, args))
9086
{
9187
page = await Fetch<EntityList<T>>(nextUrl);
9288
entities.AddRange(page.Results);
9389
nextUrl = page.Next;
90+
count = page.Count;
9491
}
9592

96-
return entities;
93+
return ConnectionEntities.Create(entities, count);
9794
}
9895

9996
private static T DeserializeObject<T>(string payload)

src/GraphQL.Relay.StarWars/Types/Film.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GraphQL.Relay.StarWars.Api;
22
using GraphQL.Relay.Types;
3+
using GraphQL.Relay.Utilities;
34

45
namespace GraphQL.Relay.StarWars.Types
56
{
@@ -24,35 +25,35 @@ public FilmGraphType(Swapi api)
2425
.Name("characters")
2526
.ResolveAsync(async ctx => await api
2627
.GetMany<People>(ctx.Source.Characters)
27-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
28+
.ContinueWith(t => ctx.ToConnection(t.Result))
2829
);
2930

3031
Connection<PlanetGraphType>()
3132
.Name("planets")
3233
.ResolveAsync(async ctx => await api
3334
.GetMany<Planets>(ctx.Source.Planets)
34-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
35+
.ContinueWith(t => ctx.ToConnection(t.Result))
3536
);
3637

3738
Connection<SpeciesGraphType>()
3839
.Name("species")
3940
.ResolveAsync(async ctx => await api
4041
.GetMany<Species>(ctx.Source.Species)
41-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
42+
.ContinueWith(t => ctx.ToConnection(t.Result))
4243
);
4344

4445
Connection<StarshipGraphType>()
4546
.Name("starships")
4647
.ResolveAsync(async ctx => await api
4748
.GetMany<Starships>(ctx.Source.Starships)
48-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
49+
.ContinueWith(t => ctx.ToConnection(t.Result))
4950
);
5051

5152
Connection<VehicleGraphType>()
5253
.Name("vehicles")
5354
.ResolveAsync(async ctx => await api
5455
.GetMany<Vehicles>(ctx.Source.Vehicles)
55-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
56+
.ContinueWith(t => ctx.ToConnection(t.Result))
5657
);
5758
}
5859

src/GraphQL.Relay.StarWars/Types/People.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GraphQL.Relay.StarWars.Api;
22
using GraphQL.Relay.Types;
3+
using GraphQL.Relay.Utilities;
34

45
namespace GraphQL.Relay.StarWars.Types
56
{
@@ -32,28 +33,28 @@ public PeopleGraphType(Swapi api)
3233
.Name("films")
3334
.ResolveAsync(async ctx => await api
3435
.GetMany<Films>(ctx.Source.Films)
35-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
36+
.ContinueWith(t => ctx.ToConnection(t.Result))
3637
);
3738

3839
Connection<SpeciesGraphType>()
3940
.Name("species")
4041
.ResolveAsync(async ctx => await api
4142
.GetMany<Species>(ctx.Source.Species)
42-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
43+
.ContinueWith(t => ctx.ToConnection(t.Result))
4344
);
4445

4546
Connection<StarshipGraphType>()
4647
.Name("starships")
4748
.ResolveAsync(async ctx => await api
4849
.GetMany<Starships>(ctx.Source.Starships)
49-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
50+
.ContinueWith(t => ctx.ToConnection(t.Result))
5051
);
5152

5253
Connection<VehicleGraphType>()
5354
.Name("vehicles")
5455
.ResolveAsync(async ctx => await api
5556
.GetMany<Vehicles>(ctx.Source.Vehicles)
56-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
57+
.ContinueWith(t => ctx.ToConnection(t.Result))
5758
);
5859
}
5960

src/GraphQL.Relay.StarWars/Types/Planet.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GraphQL.Relay.StarWars.Api;
22
using GraphQL.Relay.Types;
3+
using GraphQL.Relay.Utilities;
34

45
namespace GraphQL.Relay.StarWars.Types
56
{
@@ -28,14 +29,14 @@ public PlanetGraphType(Swapi api)
2829
.Name("residents")
2930
.ResolveAsync(async ctx => await api
3031
.GetMany<People>(ctx.Source.Residents)
31-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
32+
.ContinueWith(t => ctx.ToConnection(t.Result))
3233
);
3334

3435
Connection<FilmGraphType>()
3536
.Name("films")
3637
.ResolveAsync(async ctx => await api
3738
.GetMany<Films>(ctx.Source.Films)
38-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
39+
.ContinueWith(t => ctx.ToConnection(t.Result))
3940
);
4041
}
4142

src/GraphQL.Relay.StarWars/Types/Species.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GraphQL.Relay.StarWars.Api;
22
using GraphQL.Relay.Types;
3+
using GraphQL.Relay.Utilities;
34

45
namespace GraphQL.Relay.StarWars.Types
56
{
@@ -34,14 +35,14 @@ public SpeciesGraphType(Swapi api)
3435
.Name("people")
3536
.ResolveAsync(async ctx => await api
3637
.GetMany<People>(ctx.Source.People)
37-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
38+
.ContinueWith(t => ctx.ToConnection(t.Result))
3839
);
3940

4041
Connection<FilmGraphType>()
4142
.Name("films")
4243
.ResolveAsync(async ctx => await api
4344
.GetMany<Films>(ctx.Source.Films)
44-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
45+
.ContinueWith(t => ctx.ToConnection(t.Result))
4546
);
4647
}
4748

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
using GraphQL.Relay.StarWars.Api;
32
using GraphQL.Relay.StarWars.Utilities;
43
using GraphQL.Relay.Types;
@@ -13,45 +12,27 @@ public StarWarsQuery(Swapi api)
1312

1413
Connection<FilmGraphType>()
1514
.Name("films")
16-
.ResolveAsync(async ctx => await api
17-
.GetConnectionAsync<Films>(ctx.GetConnectionArguments())
18-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
19-
);
15+
.ResolveApiConnection<Films>(api);
2016

2117
Connection<PeopleGraphType>()
2218
.Name("people")
23-
.ResolveAsync(async ctx => await api
24-
.GetConnectionAsync<People>(ctx.GetConnectionArguments())
25-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
26-
);
19+
.ResolveApiConnection<People>(api);
2720

2821
Connection<PlanetGraphType>()
2922
.Name("planets")
30-
.ResolveAsync(async ctx => await api
31-
.GetConnectionAsync<Planets>(ctx.GetConnectionArguments())
32-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
33-
);
23+
.ResolveApiConnection<Planets>(api);
3424

3525
Connection<SpeciesGraphType>()
3626
.Name("species")
37-
.ResolveAsync(async ctx => await api
38-
.GetConnectionAsync<Species>(ctx.GetConnectionArguments())
39-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
40-
);
27+
.ResolveApiConnection<Species>(api);
4128

4229
Connection<StarshipGraphType>()
4330
.Name("starships")
44-
.ResolveAsync(async ctx => await api
45-
.GetConnectionAsync<Starships>(ctx.GetConnectionArguments())
46-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
47-
);
31+
.ResolveApiConnection<Starships>(api);
4832

4933
Connection<VehicleGraphType>()
5034
.Name("vehicles")
51-
.ResolveAsync(async ctx => await api
52-
.GetConnectionAsync<Vehicles>(ctx.GetConnectionArguments())
53-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
54-
);
35+
.ResolveApiConnection<Vehicles>(api);
5536
}
5637
}
5738
}

src/GraphQL.Relay.StarWars/Types/Starship.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GraphQL.Relay.StarWars.Api;
22
using GraphQL.Relay.Types;
3+
using GraphQL.Relay.Utilities;
34

45
namespace GraphQL.Relay.StarWars.Types
56
{
@@ -32,14 +33,14 @@ public StarshipGraphType(Swapi api)
3233
.Name("pilots")
3334
.ResolveAsync(async ctx => await api
3435
.GetMany<People>(ctx.Source.Pilots)
35-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
36+
.ContinueWith(t => ctx.ToConnection(t.Result))
3637
);
3738

3839
Connection<FilmGraphType>()
3940
.Name("films")
4041
.ResolveAsync(async ctx => await api
4142
.GetMany<Films>(ctx.Source.Films)
42-
.ContinueWith(t => ConnectionUtils.ToConnection(t.Result, ctx))
43+
.ContinueWith(t => ctx.ToConnection(t.Result))
4344
);
4445
}
4546

0 commit comments

Comments
 (0)