* feat(content api): add error endpoint
Add an endpoint to return the details of a Supabase error, given the
error code and service.
Schema additions:
```graphql
type RootQueryType {
"...previous root queries"
"""Get the details of an error code returned from a Supabase service"""
error(code: String!, service: Service!): Error
}
"""An error returned by a Supabase service"""
type Error {
"""
The unique code identifying the error. The code is stable, and can be used for string matching during error handling.
"""
code: String!
"""The Supabase service that returns this error."""
service: Service!
"""The HTTP status code returned with this error."""
httpStatusCode: Int
"""
A human-readable message describing the error. The message is not stable, and should not be used for string matching during error handling. Use the code instead.
"""
message: String
}
enum Service {
AUTH
REALTIME
STORAGE
}
```
* test(content api): add tests for top-level query `error`
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { GraphQLError, GraphQLNonNull, GraphQLResolveInfo, GraphQLString } from 'graphql'
|
|
import { type RootQueryTypeErrorArgs } from '~/__generated__/graphql'
|
|
import { convertUnknownToApiError } from '~/app/api/utils'
|
|
import { Result } from '~/features/helpers.fn'
|
|
import { ErrorModel } from './errorModel'
|
|
import {
|
|
GRAPHQL_FIELD_ERROR_GLOBAL,
|
|
GraphQLEnumTypeService,
|
|
GraphQLObjectTypeError,
|
|
} from './errorSchema'
|
|
|
|
async function resolveSingleError(
|
|
_parent: unknown,
|
|
args: RootQueryTypeErrorArgs,
|
|
_context: unknown,
|
|
_info: GraphQLResolveInfo
|
|
): Promise<ErrorModel | GraphQLError> {
|
|
return (
|
|
await Result.tryCatchFlat(ErrorModel.loadSingleError, convertUnknownToApiError, args)
|
|
).match(
|
|
(data) => data,
|
|
(error) => {
|
|
console.error(`Error resolving ${GRAPHQL_FIELD_ERROR_GLOBAL}:`, error)
|
|
return new GraphQLError(error.isPrivate() ? 'Internal Server Error' : error.message)
|
|
}
|
|
)
|
|
}
|
|
|
|
export const errorRoot = {
|
|
[GRAPHQL_FIELD_ERROR_GLOBAL]: {
|
|
description: 'Get the details of an error code returned from a Supabase service',
|
|
args: {
|
|
code: {
|
|
type: new GraphQLNonNull(GraphQLString),
|
|
},
|
|
service: {
|
|
type: new GraphQLNonNull(GraphQLEnumTypeService),
|
|
},
|
|
},
|
|
type: GraphQLObjectTypeError,
|
|
resolve: resolveSingleError,
|
|
},
|
|
}
|