⚠️
This is the documentation for the old GraphQL Yoga version 4. We recommend upgrading to the latest GraphQL Yoga version 5.
Migrate to GraphQL Yoga v5
Migrate to GraphQL Yoga v5
Sofa API
Sofa takes your GraphQL Schema, looks for available queries, mutations and subscriptions and turns all of that into REST API.
Installation
npm i @graphql-yoga/plugin-sofa
Example
server.ts
import { createServer } from 'http'
import { createSchema, createYoga } from 'graphql-yoga'
import { useSofa } from '@graphql-yoga/plugin-sofa'
const books = [
{ id: 1, title: 'Book A', type: 'AUDIO' },
{ id: 2, title: 'Book B', type: 'LEGACY' }
]
const users = [
{
id: 1,
name: 'User A',
favoriteBook: books[0],
shelf: books
},
{
id: 2,
name: 'User B',
favoriteBook: books[1],
shelf: books
}
]
const UsersCollection = {
get(id: string | number) {
const uid = typeof id === 'string' ? parseInt(id, 10) : id
return users.find(u => u.id === uid)
},
all() {
return users
}
}
const BooksCollection = {
get(id: string | number) {
const bid = typeof id === 'string' ? parseInt(id, 10) : id
return books.find(u => u.id === bid)
},
all() {
return books
},
add(title: string) {
const book = {
id: parseInt(Math.random().toString(10).substr(2), 10),
title,
type: 'LEGACY'
}
books.push(book)
return book
}
}
const schema = createSchema({
typeDefs: /* GraphQL */ `
type Book {
id: ID!
title: String!
type: BookType!
}
enum BookType {
AUDIO
LEGACY
}
type User {
id: ID!
name: String!
favoriteBook: Book!
shelf: [Book!]!
}
type Query {
user(id: ID!): User
users: [User!]
book(id: ID!): Book
books: [Book!]
}
type Mutation {
addBook(title: String!): Book
}
schema {
query: Query
mutation: Mutation
}
`,
resolvers: {
Query: {
user(_: any, { id }: any) {
return UsersCollection.get(id)
},
users() {
return UsersCollection.all()
},
book(_: any, { id }: any) {
return BooksCollection.get(id)
},
books() {
return BooksCollection.all()
}
},
Mutation: {
addBook(_: any, { title }: any) {
const book = BooksCollection.add(title)
return book
}
}
}
})
export const yoga = createYoga({
schema,
plugins: [
useSofa({
basePath: '/rest',
swaggerUI: {
endpoint: '/swagger'
},
title: 'Example API',
version: '1.0.0'
})
]
})
const server = createServer(yoga)
server.listen(4000, () => {
console.info('Server is running on http://localhost:4000/graphql')
})
You can start the server and visit http://localhost:4000/swagger to see the Swagger UI.