GraphQLサーバからのAPIインポートは明示的に宣言が必要
PrismaではOpenCRUDという基本的なAPIを勝手に作ってくれますが、GraphQLサーバ(apolloとかgraphgl-yogaとか)でそれを公開するには、インポート用の宣言しなければいけません。
まず、データ型は次のUser
とします。
type User {
id: ID! @unique
name: String!
}
宣言する場所は、graphql-yogaではschema.graphql
です。
下記のように記載します。
# import User from './generated/prisma.graphql'
type Query {
user(id: ID!): User
users: [User!]!
}
type Mutation {
createUser(name: String!): User
}
次に、graphqlサーバのアプリケーション内index.js
に上記宣言済みAPIのresolverを書きます。
これでPrismaで生成したOpenCRUDが、APIとつながります。
const { Prisma } = require('prisma-binding')
const resolvers = {
Query: {
user: (_, args, context, info) => {
return context.prisma.query.user({ where: { id: args.id,}},info)
},
users: (_, args, context, info) => {
return context.prisma.query.users({}, info);
},
},
Mutation: {
createUser: (_, args, context, info) => {
return context.prisma.mutation.createUser({data: {name: args.name}}, info)
},
},
}
上記resolverは、以下のようなAPIのつながりがあるということを意味します。
API種別 | 公開するAPI | 元のPrismaのAPI |
---|---|---|
Query |
user(id: ID) (少し元と違う)
|
context.prisma.query.user(where: {id: ID}) |
Query | users |
context.prisma.query.users |
Mutation |
createUser(name: String) (少し元と違う)
|
context.prisma.query.createUser(data: {name: String}) |
一部変形してAPI公開
最後のcreateUser
は少し元のAPIと違って、引数がdata: {name: String}
からname: String
になっており、dataオブジェクトを引数とするAPIから、より簡単なnameだけを引数とするAPIを作っていることがわかります。
- 変形したところ(
args.name
がdata
オブジェクトに入れられている)
createUser: (_, args, context, info) => {
return context.prisma.mutation.createUser({data: {name: args.name}}, info)
},