Skip to content

Instantly share code, notes, and snippets.

@JoviDeCroock
Created August 10, 2022 11:09
Show Gist options
  • Save JoviDeCroock/7a0d892b23c4a1fa0a979e2163bef654 to your computer and use it in GitHub Desktop.
Save JoviDeCroock/7a0d892b23c4a1fa0a979e2163bef654 to your computer and use it in GitHub Desktop.
import fetch from 'node-fetch'
import { getIntrospectionQuery } from 'graphql'
// TODO: you can get a token by means of using settings --> api-tokens
const token = '';
const apiUrl = 'https://api.graphcdn.io/api'
const originUrl = 'https://trygql.formidable.dev/graphql/basic-pokedex'
// The app { config { input } } can be used to write the graphcdn.YAML file with help of libs like "@atomist/yaml-updater"
async function listOrganizations() {
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'graphcdn-token': token,
},
body: JSON.stringify({
query: /* GraphQL */ `
query {
user {
organizations {
id
name
slug
}
}
}
`,
})
})
const result = await response.json()
return result.data.user.organizations
}
async function pushAppConfig(orgId, schema) {
const config = {
name: 'node-write-test',
originUrl,
schema: originUrl,
queryDepthLimit: 20,
ignoreOriginCacheControl: true,
enablePlayground: true,
injectHeaders: true,
headers: {
'something-to-inject': '1',
},
keyFields: {
types: {
Pokemon: ['id', 'name']
}
},
scopes: {
AUTHENTICATED: 'header:Authorization',
},
rootTypeNames: { query: 'Query' },
rules: [
{ description: 'Cache all queries', maxAge: 600, swr: 900, scope: 'AUTHENTICATED', types: ['Query'] },
],
bypassCacheHeaders: [{ name: 'x-preview-token' }],
}
const result = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'graphcdn-token': token,
},
body: JSON.stringify({
query: /* GraphQL */ `
mutation (
$input: Input!
$appName: String!
$schema: IntrospectionQuery
) {
pushAppConfig(
input: $input
appName: $appName
schema: $schema
allowDeletion: true
)
}
`,
variables: {
input: config,
schema: schema,
appName: config.name,
}
})
})
}
async function createApp(orgId, schema) {
const config = {
name: 'node-write-test',
originUrl,
schema: originUrl,
queryDepthLimit: 20,
ignoreOriginCacheControl: true,
enablePlayground: true,
injectHeaders: true,
headers: {
'something-to-inject': '1',
},
keyFields: {
types: {
Pokemon: ['id', 'name']
}
},
scopes: {
AUTHENTICATED: 'header:Authorization',
},
rootTypeNames: { query: 'Query' },
rules: [
{ description: 'Cache all queries', maxAge: 600, swr: 900, scope: 'AUTHENTICATED', types: ['Query'] },
],
bypassCacheHeaders: [{ name: 'x-preview-token' }],
}
const result = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'graphcdn-token': token,
},
body: JSON.stringify({
query: /* GraphQL */ `
mutation (
$input: Input!
$schema: IntrospectionQuery
$organizationId: String!
) {
createAppCli(
input: $input
schema: $schema
organizationId: $organizationId
) {
id
config {
input
}
}
}
`,
variables: {
input: config,
schema: schema,
organizationId: orgId
}
})
})
return await result.json()
}
async function getServices(slug) {
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'graphcdn-token': token,
},
body: JSON.stringify({
query: /* GraphQL */`
query ($slug: String!) {
organization(slug: $slug) {
name
apps {
name
updatedAt
config {
input
}
}
}
}
`,
variables: { slug }
})
})
const result = await response.json()
return result.data.organization.apps
}
async function main() {
const introspectionQuery = getIntrospectionQuery()
const introspectionResponse = await fetch(originUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: introspectionQuery,
})
})
const { data: schema } = await introspectionResponse.json()
const organizations = await listOrganizations();
console.log(organizations)
const result = await createApp(organizations[0].id, schema)
console.log(result)
}
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment