Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(ApolloFederation): Add "_service" resolver #7260

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
802de4d
validator for @key directive
minhaj-shakeel Dec 17, 2020
63483fc
handle type extensions and federation extras
minhaj-shakeel Dec 23, 2020
3e0df95
add apollo queries to the schema
minhaj-shakeel Dec 23, 2020
c26d01a
handle Mutation Input Types
minhaj-shakeel Dec 23, 2020
58235a6
add Comments
minhaj-shakeel Dec 23, 2020
29777ba
add test Cases
minhaj-shakeel Dec 23, 2020
0f076ae
address Abhimanyu's comments
minhaj-shakeel Dec 30, 2020
4aa8fad
minor fix
minhaj-shakeel Dec 30, 2020
4373926
add cases in invalid schemas
minhaj-shakeel Dec 30, 2020
0d701ca
add more validations
minhaj-shakeel Dec 30, 2020
6b79aa6
refractor code
minhaj-shakeel Jan 3, 2021
fa9fd0c
add Apollo Extras only when the _Entity union is present
minhaj-shakeel Jan 3, 2021
493c4cd
modifiy dgraph schema for @external ID type
minhaj-shakeel Jan 3, 2021
29741bb
skip directives for Fields of input types
minhaj-shakeel Jan 4, 2021
89931c1
add more changes to the schema conversion
minhaj-shakeel Jan 4, 2021
ef48e4c
handle Orderable for @external fields
minhaj-shakeel Jan 5, 2021
1014f5c
modify hasOrderable
minhaj-shakeel Jan 5, 2021
8d1d58e
add _service resolver
minhaj-shakeel Jan 8, 2021
5b9d686
Merge branch 'minhaj/apollo-federation' of https://github.com/dgraph-…
minhaj-shakeel Jan 8, 2021
2635e91
acquire lock before reading schema
minhaj-shakeel Jan 10, 2021
3a50339
rewrite schema copy part
minhaj-shakeel Jan 10, 2021
92b240a
add e2e test
minhaj-shakeel Jan 10, 2021
89d1ee0
fix e2e test
minhaj-shakeel Jan 11, 2021
b241748
change expected schema string
minhaj-shakeel Jan 11, 2021
0b05309
fix e2e
minhaj-shakeel Jan 11, 2021
11f48e0
change compare method
minhaj-shakeel Jan 11, 2021
02fc286
modify output json
minhaj-shakeel Jan 11, 2021
710bfca
delete graphql file
minhaj-shakeel Jan 11, 2021
319a3de
fix expected result
minhaj-shakeel Jan 11, 2021
dd1c900
fix a test
abhimanyusinghgaur Jan 11, 2021
961b088
remove apollo queries from Type Map also
minhaj-shakeel Jan 11, 2021
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
17 changes: 17 additions & 0 deletions graphql/admin/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -861,6 +861,23 @@ func (as *adminServer) resetSchema(gqlSchema schema.Schema) {
} else {
resolverFactory = resolverFactoryWithErrorMsg(errResolverNotFound).
WithConventionResolvers(gqlSchema, as.fns)
// If the schema is a Federated Schema then attach "_service" resolver
if gqlSchema.IsFederated() {
resolverFactory.WithQueryResolver("_service", func(s schema.Query) resolve.QueryResolver {
return resolve.QueryResolverFunc(func(ctx context.Context, query schema.Query) *resolve.Resolved {
as.mux.RLock()
defer as.mux.RUnlock()
sch := as.schema.Schema
handler, _ := schema.NewHandler(sch, false)
data := handler.GQLSchemaWithoutApolloExtras()
return &resolve.Resolved{
Data: map[string]interface{}{"_service": map[string]interface{}{"sdl": data}},
Field: query,
}
})
})
}

if as.withIntrospection {
resolverFactory.WithSchemaIntrospection()
}
Expand Down
368 changes: 368 additions & 0 deletions graphql/e2e/schema/apolloServiceResponse.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,368 @@
#######################
# Input Schema
#######################

type Todo @key(fields: "id") {
id: ID!
title: String!
topic: String
}

#######################
# Extended Definitions
#######################

"""
The Int64 scalar type represents a signed 64‐bit numeric non‐fractional value.
Int64 can represent values in range [-(2^63),(2^63 - 1)].
"""
scalar Int64

"""
The DateTime scalar type represents date and time as a string in RFC3339 format.
For example: "1985-04-12T23:20:50.52Z" represents 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC.
"""
scalar DateTime

input IntRange{
min: Int!
max: Int!
}

input FloatRange{
min: Float!
max: Float!
}

input Int64Range{
min: Int64!
max: Int64!
}

input DateTimeRange{
min: DateTime!
max: DateTime!
}

input StringRange{
min: String!
max: String!
}

enum DgraphIndex {
int
int64
float
bool
hash
exact
term
fulltext
trigram
regexp
year
month
day
hour
geo
}

input AuthRule {
and: [AuthRule]
or: [AuthRule]
not: AuthRule
rule: String
}

enum HTTPMethod {
GET
POST
PUT
PATCH
DELETE
}

enum Mode {
BATCH
SINGLE
}

input CustomHTTP {
url: String!
method: HTTPMethod!
body: String
graphql: String
mode: Mode
forwardHeaders: [String!]
secretHeaders: [String!]
introspectionHeaders: [String!]
skipIntrospection: Boolean
}

type Point {
longitude: Float!
latitude: Float!
}

input PointRef {
longitude: Float!
latitude: Float!
}

input NearFilter {
distance: Float!
coordinate: PointRef!
}

input PointGeoFilter {
near: NearFilter
within: WithinFilter
}

type PointList {
points: [Point!]!
}

input PointListRef {
points: [PointRef!]!
}

type Polygon {
coordinates: [PointList!]!
}

input PolygonRef {
coordinates: [PointListRef!]!
}

type MultiPolygon {
polygons: [Polygon!]!
}

input MultiPolygonRef {
polygons: [PolygonRef!]!
}

input WithinFilter {
polygon: PolygonRef!
}

input ContainsFilter {
point: PointRef
polygon: PolygonRef
}

input IntersectsFilter {
polygon: PolygonRef
multiPolygon: MultiPolygonRef
}

input PolygonGeoFilter {
near: NearFilter
within: WithinFilter
contains: ContainsFilter
intersects: IntersectsFilter
}

input GenerateQueryParams {
get: Boolean
query: Boolean
password: Boolean
aggregate: Boolean
}

input GenerateMutationParams {
add: Boolean
update: Boolean
delete: Boolean
}

directive @hasInverse(field: String!) on FIELD_DEFINITION
directive @search(by: [DgraphIndex!]) on FIELD_DEFINITION
directive @dgraph(type: String, pred: String) on OBJECT | INTERFACE | FIELD_DEFINITION
directive @id on FIELD_DEFINITION
directive @withSubscription on OBJECT | INTERFACE
directive @secret(field: String!, pred: String) on OBJECT | INTERFACE
directive @auth(
password: AuthRule
query: AuthRule,
add: AuthRule,
update: AuthRule,
delete: AuthRule) on OBJECT | INTERFACE
directive @custom(http: CustomHTTP, dql: String) on FIELD_DEFINITION
directive @remote on OBJECT | INTERFACE | UNION | INPUT_OBJECT | ENUM
directive @cascade(fields: [String]) on FIELD
directive @lambda on FIELD_DEFINITION
directive @cacheControl(maxAge: Int!) on QUERY
directive @generate(
query: GenerateQueryParams,
mutation: GenerateMutationParams,
subscription: Boolean) on OBJECT | INTERFACE

input IntFilter {
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
between: IntRange
}

input Int64Filter {
eq: Int64
le: Int64
lt: Int64
ge: Int64
gt: Int64
between: Int64Range
}

input FloatFilter {
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
between: FloatRange
}

input DateTimeFilter {
eq: DateTime
le: DateTime
lt: DateTime
ge: DateTime
gt: DateTime
between: DateTimeRange
}

input StringTermFilter {
allofterms: String
anyofterms: String
}

input StringRegExpFilter {
regexp: String
}

input StringFullTextFilter {
alloftext: String
anyoftext: String
}

input StringExactFilter {
eq: String
in: [String]
le: String
lt: String
ge: String
gt: String
between: StringRange
}

input StringHashFilter {
eq: String
in: [String]
}

#######################
# Generated Types
#######################

type AddTodoPayload {
todo(filter: TodoFilter, order: TodoOrder, first: Int, offset: Int): [Todo]
numUids: Int
}

type DeleteTodoPayload {
todo(filter: TodoFilter, order: TodoOrder, first: Int, offset: Int): [Todo]
msg: String
numUids: Int
}

type TodoAggregateResult {
count: Int
titleMin: String
titleMax: String
topicMin: String
topicMax: String
}

type UpdateTodoPayload {
todo(filter: TodoFilter, order: TodoOrder, first: Int, offset: Int): [Todo]
numUids: Int
}

#######################
# Generated Enums
#######################

enum TodoHasFilter {
title
topic
}

enum TodoOrderable {
title
topic
}

#######################
# Generated Inputs
#######################

input AddTodoInput {
title: String!
topic: String
}

input TodoFilter {
id: [ID!]
has: TodoHasFilter
and: [TodoFilter]
or: [TodoFilter]
not: TodoFilter
}

input TodoOrder {
asc: TodoOrderable
desc: TodoOrderable
then: TodoOrder
}

input TodoPatch {
title: String
topic: String
}

input TodoRef {
id: ID
title: String
topic: String
}

input UpdateTodoInput {
filter: TodoFilter!
set: TodoPatch
remove: TodoPatch
}

#######################
# Generated Query
#######################

type Query {
getTodo(id: ID!): Todo
queryTodo(filter: TodoFilter, order: TodoOrder, first: Int, offset: Int): [Todo]
aggregateTodo(filter: TodoFilter): TodoAggregateResult
}

#######################
# Generated Mutations
#######################

type Mutation {
addTodo(input: [AddTodoInput!]!): AddTodoPayload
updateTodo(input: UpdateTodoInput!): UpdateTodoPayload
deleteTodo(filter: TodoFilter!): DeleteTodoPayload
}

Loading