tyranid-graphql
v0.5.25
Published
GraphQL plugin for tyranid
Downloads
11
Readme
GraphQL frontend for Tyranid
This library adds a graphql query interpreter for the tyranid
mongodb ORM. The graphql schema is created from tyranid collection schemas using graphql-js
.
Quick Example
After calling graphqlize(Tyr)
on tyranid, use graphql queries for complex populations...
import { Tyr } from 'tyranid';
import { graphqlize } from 'tyranid-graphql';
// ...
graphqlize(Tyr); // (synchronous)
// ...
// template tag syntax
const results = await Tyr.graphql`
query userTeams {
users {
name
teamIds {
name,
organizationId {
name
}
}
}
}
`;
console.log(users[1].teamIds[2].organizationId.name); // => "Chipotle"
Interactive graphql server Example
To see an example of apollo-server
(http://dev.apollodata.com/core/)
being used with a generated schema from tyranid, clone the repo, install deps...
npm install
and run the example server
npm start
Detailed Code Example
Say we have the following tyranid collections...
import { Tyr } from 'tyranid';
export const User = new Tyr.Collection({
id: 'u00',
name: 'user',
dbName: 'users',
fields: {
_id: { is: 'mongoid' },
name: { is: 'string' },
teamIds: {
is: 'array',
of: {
link: 'team'
}
},
organizationId: { link: 'organization' }
}
});
export const Team = new Tyr.Collection({
id: 't00',
name: 'team',
dbName: 'teams',
fields: {
_id: { is: 'mongoid' },
name: { is: 'string' },
organizationId: { link: 'organization' }
}
});
export const Organization = new Tyr.Collection({
id: 'o00',
name: 'organization',
dbName: 'organizations',
fields: {
_id: { is: 'mongoid' },
name: { is: 'string' }
}
});
We then can add graphql functionality to tyranid as follows
import { Tyr } from 'tyranid';
import { graphqlize } from 'tyranid-graphql';
(async() => {
const db = await mongodb
.MongoClient
.connect('mongodb://127.0.0.1:27017/tyranid_gracl_test');
Tyr.config({
db: db,
validate: [
{ dir: __dirname,
fileMatch: 'models.js' }
]
});
graphqlize(Tyr);
})();
Then, elsewhere in the app, we can use graphql queries for complex population of linked collections.
Additionally, if a Tyr.secure
plugin like tyranid-gracl
is being utilized,
we can provide auth
and perm
parameters to have
properties / documents filtered by user permissions.
const results = await Tyr.graphql({
query: `
query userTeams {
users {
name
teamIds {
name,
organizationId {
name
}
}
}
}
`
auth: req.user,
perm: 'view'
});
// result === {
// 'data': {
// 'users': [
// {
// 'name': 'ben',
// 'teamIds': [
// {
// 'name': 'burritoMakers',
// 'organizationId': {
// 'name': 'Chipotle'
// }
// },
// {
// 'name': 'chipotleMarketing',
// 'organizationId': {
// 'name': 'Chipotle'
// }
// }
// ]
// },
// {
// 'name': 'ted',
// 'teamIds': [
// {
// 'name': 'cavaEngineers',
// 'organizationId': {
// 'name': 'Cava'
// }
// }
// ]
// },
// {
// 'name': 'noTeams',
// 'teamIds': []
// }
// ]
// }
// };
Installation
npm install tyranid-graphql
License
MIT