GraphQLのMutationで何を返すべきか?
イントロ
GraphQLのMutationで単なるerrorsとして返されても困る
errorsに埋め込める情報はextensionsとかを使っても貧弱
クライアント側で
1. 「ここを修正するべきでは?」
2. 「これもう終わってて今これですよ」
みたいなことを通知することが出来ない/非常に大変
そもそもこのアプローチは型安全にならない
すなわち,codegenとかを使ってerrorsに型を付けることは出来ない
またキャッシュ的な面でも問題がある
2.のときに同時にキャッシュとして持ってるデータを更新することは出来ない
TL;DR
「クライアント側でも明らかに弾くことが出来る入力のミスはそもそもリクエストを投げるな」という観点から考えると
「IDの形式が全然違う」みたいな入力を伴うリクエストには型としてのエラーではなく普通にGraphQLErrorとして投げても良いのではないか?という気がする
自分の今までのベストプラクティスを冷静に見返す
エラーの型と成功時のデータ型のunionを返すようにしろと言うのがベストプラクティスと言われる
例えば,次の要件を考える
mutation updateVideoTitle(videoId: ID!)
要件
GraphQLのID空間ではvideo:1234みたいなIDが振り分けられているとする.
動画のタイトルは重複は許されない.
このとき,これの返り値は?
code:updateVideoTitle_1.graphql
mutation {
mutation updateVideoTitle(videoId: ID!): UpdateVideoTitleReturnUnion!
}
union UpdateVideoTitleReturnUnion =
UpdateVideoTitleInvalidVideoIdError |
UpdateVideoTitleVideoNotFoundError |
UpdateVideoTitleAlreadyRegisteredError |
UpdateVideoTitleSucceededPayload
type UpdateVideoTitleInvalidVideoIdError {
invalidId: String!
}
type UpdateVideoTitleVideoNotFoundError {
videoId: String!
}
type UpdateVideoTitleAlreadyRegisteredError {
video: Video!
}
type UpdateVideoTitleSucceededPayload {
video: Video!
}
ところが,冷静に考えて,
UpdateVideoTitleInvalidVideoIdErrorは不要な気がしてきた
これは別に