type Query {
user(id: ID!): User
post(id: ID!): Post
users(
filter: UserFilter
limit: Int = 20
offset: Int = 0
orderBy: SortOrder = DESC
): UserConnection!
posts(
filter: PostFilter
first: Int
after: String
): PostConnection!
search(query: String!): [SearchResult!]!
me: User
}
type UserConnection {
edges: [UserEdge!]!
pageInfo: PageInfo!
totalCount: Int!
}
type UserEdge {
node: User!
cursor: String!
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
query {
user(id: "1") {
name
email
}
}
query GetUser($id: ID!) {
user(id: $id) {
name
email
posts {
title
published
}
}
}
fragment UserFields on User {
id
name
email
}
query {
user(id: "1") {
...UserFields
posts {
title
}
}
}
query GetPosts($first: Int!, $after: String) {
posts(first: $first, after: $after) {
edges {
node {
id
title
}
cursor
}
pageInfo {
hasNextPage
endCursor
}
}
}
type Mutation {
createUser(input: CreateUserInput!): User!
updateUser(id: ID!, input: UpdateUserInput!): User!
deleteUser(id: ID!): Boolean!
createPost(input: CreatePostInput!): Post!
publishPost(id: ID!): Post!
login(email: String!, password: String!): AuthPayload!
}
type AuthPayload {
token: String!
user: User!
}
mutation CreateUser($input: CreateUserInput!) {
createUser(input: $input) {
id
email
name
}
}
mutation Login($email: String!, $password: String!) {
login(email: $email, password: $password) {
token
user {
id
name
}
}
}
const resolvers = {
Query: {
user: (_, { id }, context) => context.db.user.findUnique({ where: { id } }),
users: (_, { filter, limit, offset }, context) =>
context.db.user.findMany({ where: filter, take: limit, skip: offset }),
me: (_, __, context) => context.currentUser,
},
Mutation: {
createUser: (_, { input }, context) =>
context.db.user.create({ data: input }),
updateUser: (_, { id, input }, context) =>
context.db.user.update({ where: { id }, data: input }),
},
User: {
posts: (user, _, context) =>
context.db.post.findMany({ where: { authorId: user.id } }),
},
};
type CreateUserResult = CreateUserSuccess | ValidationError | EmailTakenError
type CreateUserSuccess {
user: User!
}
type ValidationError {
message: String!
field: String!
}
type EmailTakenError {
message: String!
suggestedEmail: String
}
type Mutation {
createUser(input: CreateUserInput!): CreateUserResult!
}