Code Helper Guide for "GraphQL in Action"

Listings

1.13

{
  person(personID: 4) {
    name
    birthYear
    homeworld {
      name
    }
    filmConnection {
      films {
        title
      }
    }
  }
}

2.9

{
  viewer {
    repositories(last: 10) {
      nodes {
        name
        description
      }
    }
  }
}

2.10

{
  licenses {
    name
    url
  }
}

2.11

{
  repository(owner: "facebook", name: "graphql") {
    issues(first: 10) {
      nodes {
        title
        createdAt
        author {
          login
        }
      }
    }
  }
}

2.12

mutation {
  addStar(input: {starrableId: "MDEwOlJlcG9zaXRvcnkzODM0MjIyMQ=="}) {
    starrable {
      stargazers {
        totalCount
      }
    }
  }
}

2.13

{
  repository(name: "graphql", owner: "facebook") {
    id
  }
}

2.14

query GetIssueInfo {
  repository(owner: "jscomplete", name: "graphql-in-action") {
    issue(number: 1) {
      id
      title
    }
  }
}

2.15

mutation AddCommentToIssue {
  addComment(input: {
    subjectId: "MDU6SXNzdWUzMDYyMDMwNzk=",
    body: "Hello GraphQL"
  }) {
    commentEdge {
      node {
        createdAt
      }
    }
  }
}

2.16

{
  __schema {
    types {
      name
      description
    }
  }
}

2.17

{
  __type(name: "Commit") {
    fields {
      name
      args {
        name
      }
    }
  }
}

3.3

query OrgInfo {
  organization(login: "jscomplete") {
    name
    description
    websiteUrl
  }
}

3.4

query First10Repos {
  organization(login: "jscomplete") {
    name
    description
    websiteUrl
    repositories(first: 10) {
      nodes {
        name
      }
    }
  }
}

3.5

query orgReposByName {
  organization(login: "jscomplete") {
    repositories(first:10, orderBy:{field: NAME, direction: ASC}) {
      nodes {
        name
      }
    }
  }
}

3.6

query OrgPopularRepos {
  organization(login: "jscomplete") {
    repositories(first:10, orderBy:{field: STARGAZERS, direction: DESC}) {
      nodes {
        name
      }
    }
  }
}

3.7

query OrgRepoConnectionExample {
  organization(login: "jscomplete") {
    repositories(first:10, orderBy:{field: STARGAZERS, direction: DESC}) {
      edges {
        cursor
        node {
          name
        }
      }
    }
  }
}

3.8

query OrgPopularReposPage2 {
  organization(login: "jscomplete") {
    repositories(
      first: 10,
      after: "Y3Vyc29yOnYyOpLNOE7OAeErrQ==",
      orderBy: {field: STARGAZERS, direction: DESC}
    ) {
      edges {
        cursor
        node {
          name
        }
      }
    }
  }
}

3.9

query OrgReposMetaInfoExample {
  organization(login: "jscomplete") {
    repositories(
      first: 10,
      after: "Y3Vyc29yOnYyOpLNOE7OAeErrQ==",
      orderBy: {field: STARGAZERS, direction: DESC}
    ) {
      totalCount
      pageInfo {
        hasNextPage
      }
      edges {
        cursor
        node {
          name
        }
      }
    }
  }
}

3.10

query SearchExample {
  repository(owner: "twbs", name: "bootstrap") {
    projects(search: "v4.1", first: 10) {
      nodes {
        name
      }
    }
  }
}

3.11

query FilterExample {
  viewer {
    repositories(first: 10, affiliations: OWNER) {
      totalCount
      nodes {
        name
      }
    }
  }
}

3.12

mutation StarARepo {
  addStar(input: {starrableId: "MDEwOlJlcG9zaXRvcnkzODM0MjIyMQ=="}) {
    starrable {
      stargazers {
        totalCount
      }
    }
  }
}

3.13

query ProfileInfo {
  user(login: "samerbuna") {
    name
    company
    bio
  }
}

3.14

query ProfileInfoWithAlias {
  user(login: "samerbuna") {
    name
    companyName: company
    bio
  }
}

3.15

query AllDirectives {
  __schema {
    directives {
      name
      description
      locations
      args {
        name
        description
        defaultValue
      }
    }
  }
}

3.16

query OrgInfo($orgLogin: String!) {
  organization(login: $orgLogin) {
    name
    description
    websiteUrl
  }
}

3.17

query OrgInfoWithDefault($orgLogin: String = "facebook") {
  organization(login: $orgLogin) {
    name
    description
    websiteUrl
  }
}

3.18

query OrgInfo($orgLogin: String!, $fullDetails: Boolean!) {
  organization(login: $orgLogin) {
    name
    description
    websiteUrl @include(if: $fullDetails)
  }
}

3.19

query OrgInfo($orgLogin: String!, $partialDetails: Boolean!) {
  organization(login: $orgLogin) {
    name
    description
    websiteUrl @skip(if: $partialDetails)
  }
}

3.20

query OrgInfo($orgLogin: String!, $partialDetails: Boolean!) {
  organization(login: $orgLogin) {
    name
    description
    websiteUrl @skip(if: $partialDetails) @include(if: false)
  }
}

3.24

query MyRepos {
  viewer {
    ownedRepos: repositories(affiliations: OWNER, first: 10) {
      nodes {
        nameWithOwner
        description
        forkCount
      }
    }
    orgsRepos: repositories(affiliations: ORGANIZATION_MEMBER, first: 10) {
      nodes {
        nameWithOwner
        description
        forkCount
      }
    }
  }
}

3.25

query MyRepos {
  viewer {
    ownedRepos: repositories(affiliations: OWNER, first: 10) {
      ...repoInfo
    }
    orgsRepos: repositories(affiliations: ORGANIZATION_MEMBER, first: 10) {
      ...repoInfo
    }
  }
}

fragment repoInfo on RepositoryConnection {
  nodes {
    nameWithOwner
    description
    forkCount
  }
}

3.34

query InlineFragmentExample {
  repository(owner: "facebook", name: "graphql") {
    ref(qualifiedName: "master") {
      target {
        ... on Commit {
          message
        }
      }
    }
  }
}

3.35

query RepoUnionExample {
  repository(owner: "facebook", name: "graphql") {
    issueOrPullRequest(number: 3) {
      __typename
    }
  }
}

3.36

query RepoUnionExampleFull {
  repository(owner: "facebook", name: "graphql") {
    issueOrPullRequest(number: 5) {
      ... on PullRequest {
        merged
        mergedAt
      }
      ... on Issue {
        closed
        closedAt
      }
    }
  }
}

3.37

query TestSearch {
  search(first: 100, query: "graphql", type: USER) {
    nodes {
      ... on User {
        name
        bio
      }
      ... on Organization {
        login
        description
      }
    }
  }
}

Full API Schema

type Query {
  currentTime: String
  numbersInRange(begin: Int!, end: Int!): NumbersInRange
  taskMainList: [Task!]
  search(term: String!): [SearchResultItem!]
  taskInfo(id: ID!): Task
  me: Me
}

"""Aggregate info on a range of numbers"""
type NumbersInRange {
  sum: Int!
  count: Int!
}

type Task implements SearchResultItem {
  id: ID!
  createdAt: String!
  content: String!
  tags: [String!]!
  approachCount: Int!
  author: User!
  approachList: [Approach!]!
}

interface SearchResultItem {
  id: ID!
  content: String!
}

type User {
  id: ID!
  email: String
  name: String
  createdAt: String!
}

type Approach implements SearchResultItem {
  id: ID!
  createdAt: String!
  content: String!
  voteCount: Int!
  task: Task!
  author: User!
  detailList: [ApproachDetail!]!
}

type ApproachDetail {
  content: String!
  category: ApproachDetailCategory!
}

enum ApproachDetailCategory {
  NOTE
  EXPLANATION
  WARNING
}

type Me {
  id: ID!
  username: String!
  name: String
  createdAt: String!
  taskList: [Task!]!
}

type Mutation {
  userCreate(input: UserInput!): UserPayload
  userLogin(input: AuthInput!): UserPayload
  taskCreate(input: TaskInput!): TaskPayload
  approachCreate(taskId: ID!, input: ApproachInput!): ApproachPayload
  approachVote(approachId: ID!, input: ApproachVoteInput!): ApproachPayload
}

type UserPayload {
  errors: [UserError!]!
  user: User
  authToken: String
}

type UserError {
  message: String!
}

input UserInput {
  email: String!
  password: String!
  firstName: String
  lastName: String
}

input AuthInput {
  email: String!
  password: String!
}

type TaskPayload {
  errors: [UserError!]!
  task: Task
}

input TaskInput {
  content: String!
  tags: [String!]!
  isPrivate: Boolean!
}

type ApproachPayload {
  errors: [UserError!]!
  approach: Approach
}

input ApproachInput {
  content: String!
  detailList: [ApproachDetailInput!]!
}

input ApproachDetailInput {
  content: String!
  category: ApproachDetailCategory!
}

input ApproachVoteInput {
  up: Boolean!
}

type Subscription {
  voteChanged(taskId: ID!): Approach!
  taskMainListChanged: [Task!]
}