Skip to content

Commit aeaf698

Browse files
authored
Added FieldDef<'Val, 'Res> to support resolver changing middlewares (#492)
1 parent 4437349 commit aeaf698

File tree

25 files changed

+668
-512
lines changed

25 files changed

+668
-512
lines changed

samples/chat-app/server/Schema.fs

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ module Schema =
151151
name = nameof Member,
152152
description = "An organization member",
153153
isTypeOf = (fun o -> o :? Member),
154-
fieldsFn =
155-
fun () -> [
154+
fields = [
156155
Define.Field (
157156
"id",
158157
GuidType,
@@ -170,8 +169,7 @@ module Schema =
170169
name = nameof MeAsAMember,
171170
description = "An organization member",
172171
isTypeOf = (fun o -> o :? MeAsAMember),
173-
fieldsFn =
174-
fun () -> [
172+
fields = [
175173
Define.Field (
176174
"privId",
177175
GuidType,
@@ -193,7 +191,7 @@ module Schema =
193191
)
194192

195193
let ChatMemberType =
196-
Define.Object<ChatMember> (
194+
DefineRec.Object<ChatMember> (
197195
name = nameof ChatMember,
198196
description = "A chat member is an organization member participating in a chat room",
199197
isTypeOf = (fun o -> o :? ChatMember),
@@ -213,7 +211,7 @@ module Schema =
213211
)
214212

215213
let MeAsAChatMemberType =
216-
Define.Object<MeAsAChatMember> (
214+
DefineRec.Object<MeAsAChatMember> (
217215
name = nameof MeAsAChatMember,
218216
description = "A chat member is an organization member participating in a chat room",
219217
isTypeOf = (fun o -> o :? MeAsAChatMember),
@@ -241,7 +239,7 @@ module Schema =
241239
)
242240

243241
let ChatRoomStatsType =
244-
Define.Object<ChatRoom> (
242+
DefineRec.Object<ChatRoom> (
245243
name = nameof ChatRoom,
246244
description = "A chat room as viewed from the outside",
247245
isTypeOf = (fun o -> o :? ChatRoom),
@@ -261,7 +259,7 @@ module Schema =
261259
)
262260

263261
let ChatRoomDetailsType =
264-
Define.Object<ChatRoomForMember> (
262+
DefineRec.Object<ChatRoomForMember> (
265263
name = nameof ChatRoomForMember,
266264
description = "A chat room as viewed by a chat room member",
267265
isTypeOf = (fun o -> o :? ChatRoomForMember),
@@ -292,7 +290,7 @@ module Schema =
292290
)
293291

294292
let OrganizationStatsType =
295-
Define.Object<Organization> (
293+
DefineRec.Object<Organization> (
296294
name = nameof Organization,
297295
description = "An organization as seen from the outside",
298296
isTypeOf = (fun o -> o :? Organization),
@@ -313,7 +311,7 @@ module Schema =
313311
)
314312

315313
let OrganizationDetailsType =
316-
Define.Object<OrganizationForMember> (
314+
DefineRec.Object<OrganizationForMember> (
317315
name = nameof OrganizationForMember,
318316
description = "An organization as seen by one of the organization's members",
319317
isTypeOf = (fun o -> o :? OrganizationForMember),
@@ -354,8 +352,7 @@ module Schema =
354352
name = name,
355353
description = description,
356354
isTypeOf = (fun o -> o :? ChatRoomMessage),
357-
fieldsFn =
358-
fun () -> [
355+
fields = [
359356
Define.Field (
360357
"id",
361358
GuidType,
@@ -395,8 +392,7 @@ module Schema =
395392
name = name,
396393
description = description,
397394
isTypeOf = (fun o -> o :? unit),
398-
fieldsFn =
399-
fun () -> [
395+
fields = [
400396
Define.Field ("doNotUse", BooleanType, "this is just to satify the expected structure of this type", (fun _ _ -> true))
401397
]
402398
)
@@ -406,8 +402,7 @@ module Schema =
406402
name = name,
407403
description = description,
408404
isTypeOf = (fun o -> o :? MessageId),
409-
fieldsFn =
410-
(fun () -> [
405+
fields = [
411406
Define.Field (
412407
"messageId",
413408
GuidType,
@@ -416,16 +411,15 @@ module Schema =
416411
match x with
417412
| MessageId theId -> theId
418413
)
419-
])
414+
]
420415
)
421416

422417
let aChatRoomEventForMemberIdAndName description name =
423418
Define.Object<MemberId * string> (
424419
name = name,
425420
description = description,
426421
isTypeOf = (fun o -> o :? (MemberId * string)),
427-
fieldsFn =
428-
(fun () -> [
422+
fields = [
429423
Define.Field (
430424
"memberId",
431425
GuidType,
@@ -435,7 +429,7 @@ module Schema =
435429
| MemberId theId -> theId
436430
)
437431
Define.Field ("memberName", StringType, "this is the member's name", (fun _ (_ : MemberId, name : string) -> name))
438-
])
432+
]
439433
)
440434

441435
let newMessageDef =
@@ -478,7 +472,7 @@ module Schema =
478472
)
479473

480474
let ChatRoomEventType =
481-
Define.Object<ChatRoomEvent> (
475+
DefineRec.Object<ChatRoomEvent> (
482476
name = nameof ChatRoomEvent,
483477
description = "Something that happened in the chat room, like a new message sent",
484478
isTypeOf = (fun o -> o :? ChatRoomEvent),
@@ -831,8 +825,7 @@ module Schema =
831825
name = "Root",
832826
description = "contains general request information",
833827
isTypeOf = (fun o -> o :? Root),
834-
fieldsFn =
835-
fun () -> [
828+
fields = [
836829
Define.Field ("requestId", StringType, "The request's unique ID.", (fun _ (r : Root) -> r.RequestId))
837830
]
838831
)

samples/star-wars-api/Schema.fs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ module Schema =
155155
)
156156

157157
and HumanType : ObjectDef<Human> =
158-
Define.Object<Human> (
158+
DefineRec.Object<Human> (
159159
name = "Human",
160160
description = "A humanoid creature in the Star Wars universe.",
161161
isTypeOf = (fun o -> o :? Human),
@@ -210,7 +210,7 @@ module Schema =
210210
)
211211

212212
and DroidType =
213-
Define.Object<Droid> (
213+
DefineRec.Object<Droid> (
214214
name = "Droid",
215215
description = "A mechanical creature in the Star Wars universe.",
216216
isTypeOf = (fun o -> o :? Droid),
@@ -235,19 +235,19 @@ module Schema =
235235
name = "Planet",
236236
description = "A planet in the Star Wars universe.",
237237
isTypeOf = (fun o -> o :? Planet),
238-
fieldsFn =
239-
fun () ->
240-
[ Define.Field ("id", StringType, "The id of the planet", (fun _ p -> p.Id))
241-
Define.Field ("name", Nullable StringType, "The name of the planet.", (fun _ p -> p.Name))
242-
Define.Field ("isMoon", Nullable BooleanType, "Is that a moon?", (fun _ p -> p.IsMoon)) ]
238+
fields = [
239+
Define.Field ("id", StringType, "The id of the planet", (fun _ p -> p.Id))
240+
Define.Field ("name", Nullable StringType, "The name of the planet.", (fun _ p -> p.Name))
241+
Define.Field ("isMoon", Nullable BooleanType, "Is that a moon?", (fun _ p -> p.IsMoon))
242+
]
243243
)
244244

245245
and RootType =
246246
Define.Object<Root> (
247247
name = "Root",
248248
description = "The Root type to be passed to all our resolvers.",
249249
isTypeOf = (fun o -> o :? Root),
250-
fieldsFn = fun () -> [ Define.Field ("requestId", StringType, "The ID of the client.", (fun _ (r : Root) -> r.RequestId)) ]
250+
fields = [ Define.Field ("requestId", StringType, "The ID of the client.", (fun _ (r : Root) -> r.RequestId)) ]
251251
)
252252

253253
let Query =
@@ -281,7 +281,7 @@ module Schema =
281281
Define.Object<Root> (
282282
name = "Mutation",
283283
fields =
284-
[ Define.Field (
284+
[ Define.Field(
285285
"setMoon",
286286
Nullable PlanetType,
287287
"Defines if a planet is actually a moon or not.",
@@ -293,7 +293,8 @@ module Schema =
293293
schemaConfig.SubscriptionProvider.Publish<Planet> "watchMoon" x
294294
schemaConfig.LiveFieldSubscriptionProvider.Publish<Planet> "Planet" "isMoon" x
295295
x)
296-
) ]
296+
)
297+
]
297298
)
298299

299300
let schema : ISchema<Root> = upcast Schema (Query, Mutation, Subscription, schemaConfig)

src/FSharp.Data.GraphQL.Server.Middleware/MiddlewareDefinitions.fs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ open FsToolkit.ErrorHandling
44
open FSharp.Data.GraphQL
55
open FSharp.Data.GraphQL.Types.Patterns
66
open FSharp.Data.GraphQL.Types
7-
open FSharp.Data.GraphQL.Execution
87

98
type internal QueryWeightMiddleware(threshold : float, reportToMetadata : bool) =
9+
1010
let middleware (threshold : float) (ctx : ExecutionContext) (next : ExecutionContext -> AsyncVal<GQLExecutionResult>) =
1111
let measureThreshold (threshold : float) (fields : ExecutionInfo list) =
1212
let getWeight f =
@@ -56,13 +56,15 @@ type internal QueryWeightMiddleware(threshold : float, reportToMetadata : bool)
5656
if pass
5757
then next ctx
5858
else error ctx
59+
5960
interface IExecutorMiddleware with
6061
member _.CompileSchema = None
6162
member _.PostCompileSchema = None
6263
member _.PlanOperation = None
6364
member _.ExecuteOperationAsync = Some (middleware threshold)
6465

6566
type internal ObjectListFilterMiddleware<'ObjectType, 'ListType>(reportToMetadata : bool) =
67+
6668
let compileMiddleware (ctx : SchemaCompileContext) (next : SchemaCompileContext -> unit) =
6769
let modifyFields (object : ObjectDef<'ObjectType>) (fields : FieldDef<'ObjectType> seq) =
6870
let args = [ Define.Input("filter", Nullable ObjectListFilter) ]
@@ -78,6 +80,7 @@ type internal ObjectListFilterMiddleware<'ObjectType, 'ListType>(reportToMetadat
7880
|> Seq.cast<NamedDef>
7981
ctx.TypeMap.AddTypes(modifiedTypes, overwrite = true)
8082
next ctx
83+
8184
let reportMiddleware (ctx : ExecutionContext) (next : ExecutionContext -> AsyncVal<GQLExecutionResult>) =
8285
let rec collectArgs (acc : (string * ObjectListFilter) list) (fields : ExecutionInfo list) =
8386
let fieldArgs field =
@@ -133,6 +136,7 @@ type internal ObjectListFilterMiddleware<'ObjectType, 'ListType>(reportToMetadat
133136
type IdentityNameResolver = ObjectDef -> string
134137

135138
type internal LiveQueryMiddleware(identityNameResolver : IdentityNameResolver) =
139+
136140
let middleware (ctx : SchemaCompileContext) (next : SchemaCompileContext -> unit) =
137141
let identity (identityName : string) (x : obj) =
138142
x.GetType().GetProperty(identityName).GetValue(x)
@@ -165,6 +169,7 @@ type internal LiveQueryMiddleware(identityNameResolver : IdentityNameResolver) =
165169
if not (ctx.Schema.LiveFieldSubscriptionProvider.IsRegistered x.TypeName x.FieldName)
166170
then ctx.Schema.LiveFieldSubscriptionProvider.Register x)
167171
next ctx
172+
168173
interface IExecutorMiddleware with
169174
member _.CompileSchema = Some middleware
170175
member _.PostCompileSchema = None

src/FSharp.Data.GraphQL.Server.Middleware/TypeSystemExtensions.fs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,24 @@ open FSharp.Data.GraphQL.Types
55
/// Contains extensions for the type system.
66
[<AutoOpen>]
77
module TypeSystemExtensions =
8+
89
type FieldDef<'Val> with
10+
911
/// <summary>
1012
/// Creates a new field definition based on the existing one, containing
1113
/// the existing metadata information, plus a new entry used to calculate the query
1214
/// weight by the QueryWeightMiddleware.
1315
/// </summary>
1416
/// <param name="weight">A float value representing the weight that this field have on the query.</param>
15-
member this.WithQueryWeight(weight : float) : FieldDef<'Val> =
16-
this.WithMetadata(this.Metadata.Add("queryWeight", weight))
17+
member this.WithQueryWeight (weight : float) : FieldDef<'Val> = this.WithMetadata (this.Metadata.Add ("queryWeight", weight))
1718

1819
type ResolveFieldContext with
20+
1921
/// <summary>
2022
/// Gets the filter argument value for this field, if it does have one.
2123
/// Field argument is defined by the ObjectFilterMiddleware.
2224
/// </summary>
2325
member this.Filter =
24-
match this.Args.TryFind("filter") with
26+
match this.Args.TryFind ("filter") with
2527
| Some (:? ObjectListFilter as f) -> Some f
26-
| _ -> None
28+
| _ -> None

src/FSharp.Data.GraphQL.Server.Relay/FSharp.Data.GraphQL.Server.Relay.fsproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,4 @@
2020
<PackageReference Condition="$(IsNuGet) != ''" Include="FSharp.Data.GraphQL.Shared" VersionOverride="$(Version)" />
2121
<PackageReference Condition="$(IsNuGet) != ''" Include="FSharp.Data.GraphQL.Server" VersionOverride="$(Version)" />
2222
</ItemGroup>
23-
2423
</Project>

0 commit comments

Comments
 (0)