Skip to content

Introduction to GraphQL

GraphQL is a query language and runtime for APIs that was developed by Facebook in 2012 and open-sourced in 2015. It provides a more efficient, powerful, and flexible alternative to traditional REST APIs. This guide introduces you to GraphQL concepts and how they apply to the CoCore platform.

What is GraphQL?

GraphQL is a specification for how to talk to an API. It's typically served over HTTP via a single endpoint which expresses the full set of capabilities of the service. Unlike REST APIs that expose multiple endpoints for different resources, GraphQL uses a single endpoint and allows clients to specify exactly what data they need.

Key Characteristics

  • Single Endpoint: One URL handles all API requests
  • Strongly Typed: Every piece of data is backed by a specific type
  • Hierarchical: Mirrors the way your UI components are structured
  • Introspective: The API can describe itself to clients
  • Version-free: Evolution without versioning by adding fields and types

Core GraphQL Concepts

The Schema

The schema is the contract between your client and server. It defines:

  • What queries clients can make
  • What mutations (writes) are possible
  • What subscriptions (real-time updates) are available
  • The shape and types of all data

In CoCore, our schema includes resources like:

  • Users and authentication
  • Print jobs and production workflows
  • Devices and their statuses
  • Orders and commerce data
  • Inventory and logistics
  • Analytics and reporting data

Types

GraphQL has several built-in scalar types:

  • String: UTF‐8 character sequences
  • Int: 32‐bit integers
  • Float: Double-precision floating-point values
  • Boolean: true or false
  • ID: Unique identifiers

Custom object types represent your business domain:

graphql
type PrintJob {
  id: ID!
  title: String!
  status: JobStatus!
  createdAt: DateTime!
  customer: Customer
  files: [File!]!
  estimatedCost: Money
}

type Customer {
  id: ID!
  name: String!
  email: String!
  orders: [Order!]!
}

Queries

Queries are how you read data. They specify exactly which fields you want:

graphql
query GetPrintJob {
  getPrintJob(id: "123") {
    id
    title
    status
    customer {
      name
      email
    }
    files {
      filename
      size
    }
  }
}

This returns only the requested fields in the shape you specified.

Mutations

Mutations are how you modify data. They're like functions that change state:

graphql
mutation CreatePrintJob {
  createPrintJob(input: {
    title: "Business Cards"
    customerId: "456"
    priority: HIGH
  }) {
    result {
      id
      title
      status
    }
    errors {
      message
    }
  }
}

Subscriptions

Subscriptions provide real-time updates when data changes:

graphql
subscription JobStatusUpdates {
  printJobUpdated(filter: { status: PRINTING }) {
    id
    title
    status
    progress
  }
}

This is particularly powerful in CoCore for monitoring device status, job progress, and system alerts.

Arguments

Fields can accept arguments to customize their behavior:

graphql
query GetRecentJobs {
  printJobs(
    first: 10
    filter: {
      status: [PENDING, PRINTING]
      createdAfter: "2024-01-01"
    }
    sort: { field: CREATED_AT, direction: DESC }
  ) {
    id
    title
    status
    createdAt
  }
}

Why GraphQL for CoCore?

Perfect Data Fetching

REST APIs often lead to over-fetching (getting too much data) or under-fetching (needing multiple requests). GraphQL solves both:

Over-fetching Problem: A REST endpoint might return:

json
{
  "id": 123,
  "title": "Business Cards",
  "description": "500 business cards...",
  "customer": {
    "id": 456,
    "name": "John Doe",
    "address": "...",
    "phone": "...",
    "preferences": {...},
    "orderHistory": [...]
  },
  "files": [...],
  "pricing": {...},
  "timeline": {...}
}

But you only needed the title and customer name.

GraphQL Solution: Request exactly what you need:

graphql
{
  getPrintJob(id: 123) {
    title
    customer {
      name
    }
  }
}

Real-time Capabilities

CoCore's manufacturing environment requires real-time updates:

  • Device status changes
  • Job progress updates
  • Inventory level changes
  • System alerts and notifications

GraphQL subscriptions provide efficient real-time data flow without polling.

Complex Relationships

Print jobs relate to customers, files, devices, inventory, and more. GraphQL naturally handles these relationships:

graphql
{
  printJob(id: "123") {
    title
    customer {
      name
      recentOrders(limit: 5) {
        total
        items {
          name
        }
      }
    }
    assignedDevice {
      name
      status
      currentLoad
    }
    requiredMaterials {
      item {
        name
        currentStock
      }
      quantity
    }
  }
}

Evolutionary API Design

As CoCore grows, new features and fields can be added without breaking existing clients. Old fields can be deprecated rather than removed, providing smooth upgrade paths.

Developer Experience

GraphQL's introspection allows tools to provide:

  • Auto-completion in queries
  • Real-time validation
  • Automatic documentation
  • Interactive explorers

GraphQL vs REST: Key Differences

AspectRESTGraphQL
EndpointsMultiple URLsSingle endpoint
Data FetchingFixed structureClient-specified
Over/Under-fetchingCommon problemSolved by design
CachingHTTP cachingRequires custom logic
Real-timePolling/WebSocketsBuilt-in subscriptions
VersioningURL/header versioningField-level evolution
Learning CurveFamiliarRequires new concepts

Common GraphQL Patterns in CoCore

Pagination

For large datasets, use cursor-based pagination:

graphql
{
  printJobs(first: 20, after: "cursor123") {
    edges {
      node {
        id
        title
      }
      cursor
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

Error Handling

Mutations return both data and errors:

graphql
mutation {
  createPrintJob(input: {...}) {
    result {
      id
      title
    }
    errors {
      message
      field
      code
    }
  }
}

Fragments

Reuse field selections across queries:

graphql
fragment JobDetails on PrintJob {
  id
  title
  status
  createdAt
  estimatedCompletion
}

query GetJobs {
  activeJobs: printJobs(filter: {status: ACTIVE}) {
    ...JobDetails
  }
  pendingJobs: printJobs(filter: {status: PENDING}) {
    ...JobDetails
  }
}

Getting Started with CoCore's GraphQL API

  1. Explore the Schema: Use GraphiQL or GraphQL Playground to browse available types and operations
  2. Start Simple: Begin with basic queries for users, jobs, or devices
  3. Build Incrementally: Add fields and relationships as needed
  4. Use Real-time: Implement subscriptions for live updates
  5. Optimize: Use fragments and efficient query patterns

Next Steps

  • Learn about GraphQL tooling for development
  • Understand how GraphQL compares to XML and REST
  • Explore CoCore's specific schema and domain models
  • Try building your first queries and mutations

GraphQL's flexibility and efficiency make it an ideal choice for CoCore's complex, real-time manufacturing environment. By learning these core concepts, you'll be well-equipped to build powerful integrations and applications on the CoCore platform.

Connect. Combine. Collaborate.
The pioneering open integration platform, dedicated to transforming connectivity in the printing industry.