Workshop - U Lékaře
API Orchestrace
Silně typovaný jazyk pro definici API schématu
Slouží naráz jako:
type Query {
songs: [Song!]!
}
type Song {
id: ID!
name: String!
description: String!
...
}
query {
songs {
name
}
}{
"data": {
"songs": [
{
"name": "Bad Dream Baby"
},
...
]
}
}Základní operace:
scalar NonNegativeInt
type Query
# -----------------------------------
extend type Query {
song(id: ID!): Song!
songs: [Song!]!
search(name: String!): [Song!]!
}
# -----------------------------------
type Song {
id: ID!
name: String!
artist: String!
cover: String!
description: String!
listens: NonNegativeInt!
tags: [Tag!]!
audio: String
isLiked: Boolean
comments: [Comment!]
}
type Tag {
value: String!
isImportant: Boolean
}
type Comment {
user: User!
text: String!
}
# -----------------------------------
interface User {
name: String!
avatar: String!
isArtist: Boolean
}
# -----------------------------------
type RegularUser implements User {
name: String!
avatar: String!
isArtist: Boolean
}
type ArtistUser implements User {
name: String!
avatar: String!
isArtist: Boolean
}
type Mutation
# -----------------------------------
extend type Mutation {
setLike(songId: ID!, like: Toggle!): Song!
addComment(songId: ID!, comment: CommentInput!): Song!
}
# -----------------------------------
enum Toggle {
ADD
REMOVE
}
# -----------------------------------
input CommentInput {
user: UserInput!
text: String!
}
input UserInput {
name: String!
avatar: String!
isArtist: Boolean
}
directive @songExists on FIELD_DEFINITION
# ---------------------------------------------------------
type Subscription
# -----------------------------------
extend type Subscription {
commentAdded(songId: ID!): Comment! @songExists
listens(songId: ID!): NonNegativeInt! @songExists
}
query AllSongs {
songs {
name
artist
cover
description
listens
tags {
value
isImportant
}
audio
isLiked
comments {
user {
name
avatar
isArtist
}
text
}
}
}fragment SongFragment on Song {
name
artist
cover
description
listens
tags {
value
isImportant
}
audio
isLiked
comments {
user {
name
avatar
isArtist
}
text
}
}query AllSongs {
songs {
...SongFragment
}
}Možnosti kombinace GraphQL s REST API přináší další výhody
Platforma a tooling
*What is your view in REST?
parent
argumenty
kontext
+ graphql query info
Definice zdrojů dat pro aplikaci a její schéma
Jejich programová logika a pojetí jsou velmi flexibilní dle potřeby
Problém na který se v GraphQL může snadno narazit
Má však hned několik řešení:
type Book {
author: Author!
}
type Author {
name: String!
}
type Query {
getAllBooks: [Book!]!
}*Pilotní ukázka bez větších detailů
**Zapojení FE ukáže ještě Radim
* CloudFormation export
** Game Service