Sofa API
Sofa takes your GraphQL Schema, looks for available queries, mutations and subscriptions and turns all of that into REST API.
Installation
yarn add @graphql-yoga/plugin-sofa
Example
server.ts
import { createServer } from 'http'
import { createSchema, createYoga } from 'graphql-yoga'
import { useSofaWithSwaggerUI } 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: [
useSofaWithSwaggerUI({
basePath: '/rest',
swaggerUIEndpoint: '/swagger',
servers: [
{
url: '/', // Specify Server's URL.
description: 'Development server'
}
],
info: {
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.
Last updated on November 15, 2022