Improve error handling

This commit is contained in:
Michael Bromley 2021-01-25 21:24:26 +01:00
parent 695caba290
commit d4e8105ce0
8 changed files with 152 additions and 40 deletions

View File

@ -1,15 +1,21 @@
import type { ServerResponse } from 'http' import type { ServerResponse } from 'http'
import type { LoginMutation, LoginMutationVariables } from '../schema' import type { LoginMutation, LoginMutationVariables } from '../schema'
import type { RecursivePartial } from '../api/utils/types'
import concatHeader from '../api/utils/concat-cookie' import concatHeader from '../api/utils/concat-cookie'
import { VendureConfig, getConfig } from '../api' import { getConfig, VendureConfig } from '../api'
import { CommerceError } from '@commerce/utils/errors'
import { ErrorResult } from '../schema'
export const loginMutation = /* GraphQL */ ` export const loginMutation = /* GraphQL */ `
mutation loginServer($email: String!, $password: String!) { mutation loginServer($email: String!, $password: String!) {
login(username: $email, password: $password) { login(username: $email, password: $password) {
__typename
... on CurrentUser { ... on CurrentUser {
id id
} }
... on ErrorResult {
errorCode
message
}
} }
} }
` `
@ -44,10 +50,11 @@ async function login({
}): Promise<LoginResult> { }): Promise<LoginResult> {
config = getConfig(config) config = getConfig(config)
const { data, res } = await config.fetch<RecursivePartial<LoginMutation>>( const { data, res } = await config.fetch<LoginMutation>(query, { variables })
query,
{ variables } if (data.login.__typename !== 'CurrentUser') {
) throw new CommerceError({ message: (data.login as ErrorResult).message })
}
// Bigcommerce returns a Set-Cookie header with the auth cookie // Bigcommerce returns a Set-Cookie header with the auth cookie
let cookie = res.headers.get('Set-Cookie') let cookie = res.headers.get('Set-Cookie')
@ -68,7 +75,7 @@ async function login({
} }
return { return {
result: data.login?.result, result: data.login.id.toString(),
} }
} }

View File

@ -3,7 +3,11 @@ import type { HookFetcher } from '@commerce/utils/types'
import { CommerceError } from '@commerce/utils/errors' import { CommerceError } from '@commerce/utils/errors'
import useCommerceLogin from '@commerce/use-login' import useCommerceLogin from '@commerce/use-login'
import useCustomer from '../customer/use-customer' import useCustomer from '../customer/use-customer'
import { LoginMutation, LoginMutationVariables } from '@framework/schema' import {
ErrorResult,
LoginMutation,
LoginMutationVariables,
} from '@framework/schema'
export const loginMutation = /* GraphQL */ ` export const loginMutation = /* GraphQL */ `
mutation login($username: String!, $password: String!) { mutation login($username: String!, $password: String!) {
@ -12,6 +16,10 @@ export const loginMutation = /* GraphQL */ `
... on CurrentUser { ... on CurrentUser {
id id
} }
... on ErrorResult {
errorCode
message
}
} }
} }
` `
@ -49,7 +57,9 @@ export function extendHook(customFetcher: typeof fetcher) {
password: input.password, password: input.password,
}) })
if (data.login.__typename !== 'CurrentUser') { if (data.login.__typename !== 'CurrentUser') {
throw new CommerceError({ message: 'The credentials are not valid' }) throw new CommerceError({
message: (data.login as ErrorResult).message,
})
} }
await revalidate() await revalidate()
return data return data

View File

@ -3,14 +3,23 @@ import type { HookFetcher } from '@commerce/utils/types'
import { CommerceError } from '@commerce/utils/errors' import { CommerceError } from '@commerce/utils/errors'
import useCommerceSignup from '@commerce/use-signup' import useCommerceSignup from '@commerce/use-signup'
import useCustomer from '../customer/use-customer' import useCustomer from '../customer/use-customer'
import { SignupMutation, SignupMutationVariables } from '@framework/schema' import {
ErrorResult,
SignupMutation,
SignupMutationVariables,
} from '@framework/schema'
export const signupMutation = /* GraphQL */ ` export const signupMutation = /* GraphQL */ `
mutation signup($input: RegisterCustomerInput!) { mutation signup($input: RegisterCustomerInput!) {
registerCustomerAccount(input: $input) { registerCustomerAccount(input: $input) {
__typename
... on Success { ... on Success {
success success
} }
... on ErrorResult {
errorCode
message
}
} }
} }
` `
@ -52,7 +61,7 @@ export function extendHook(customFetcher: typeof fetcher) {
return useCallback( return useCallback(
async function signup(input: SignupInput) { async function signup(input: SignupInput) {
const data = await fn({ const { registerCustomerAccount } = await fn({
input: { input: {
firstName: input.firstName, firstName: input.firstName,
lastName: input.lastName, lastName: input.lastName,
@ -60,8 +69,13 @@ export function extendHook(customFetcher: typeof fetcher) {
password: input.password, password: input.password,
}, },
}) })
if (registerCustomerAccount.__typename !== 'Success') {
throw new CommerceError({
message: (registerCustomerAccount as ErrorResult).message,
})
}
await revalidate() await revalidate()
return data return { registerCustomerAccount }
}, },
[fn] [fn]
) )

View File

@ -8,12 +8,18 @@ import { cartFragment } from '../api/fragments/cart'
import { import {
AddItemToOrderMutation, AddItemToOrderMutation,
AddItemToOrderMutationVariables, AddItemToOrderMutationVariables,
ErrorResult,
} from '@framework/schema' } from '@framework/schema'
export const addItemToOrderMutation = /* GraphQL */ ` export const addItemToOrderMutation = /* GraphQL */ `
mutation addItemToOrder($variantId: ID!, $quantity: Int!) { mutation addItemToOrder($variantId: ID!, $quantity: Int!) {
addItemToOrder(productVariantId: $variantId, quantity: $quantity) { addItemToOrder(productVariantId: $variantId, quantity: $quantity) {
__typename
...Cart ...Cart
... on ErrorResult {
errorCode
message
}
} }
} }
${cartFragment} ${cartFragment}
@ -39,9 +45,6 @@ export const fetcher: HookFetcher<
...options, ...options,
query: addItemToOrderMutation, query: addItemToOrderMutation,
variables: { variantId, quantity: quantity || 1 }, variables: { variantId, quantity: quantity || 1 },
}).then((res) => {
console.log({ res })
return res
}) })
} }
@ -52,12 +55,18 @@ export function extendHook(customFetcher: typeof fetcher) {
return useCallback( return useCallback(
async function addItem(input: AddItemInput) { async function addItem(input: AddItemInput) {
const data = await fn({ const { addItemToOrder } = await fn({
quantity: input.quantity || 1, quantity: input.quantity || 1,
variantId: input.variantId, variantId: input.variantId,
}) })
await mutate(data, false) if (addItemToOrder.__typename === 'Order') {
return data await mutate({ addItemToOrder }, false)
} else {
throw new CommerceError({
message: (addItemToOrder as ErrorResult).message,
})
}
return { addItemToOrder }
}, },
[fn, mutate] [fn, mutate]
) )

View File

@ -30,7 +30,7 @@ export function extendHook(
swrOptions?: SwrOptions<any | null> swrOptions?: SwrOptions<any | null>
) { ) {
const useCart = () => { const useCart = () => {
const response = useData<Cart>( const response = useData<CartResult>(
{ query: getCartQuery }, { query: getCartQuery },
[], [],
customFetcher, customFetcher,

View File

@ -4,15 +4,21 @@ import useCartRemoveItem from '@commerce/cart/use-remove-item'
import useCart from './use-cart' import useCart from './use-cart'
import { cartFragment } from '@framework/api/fragments/cart' import { cartFragment } from '@framework/api/fragments/cart'
import { import {
ErrorResult,
RemoveOrderLineMutation, RemoveOrderLineMutation,
RemoveOrderLineMutationVariables, RemoveOrderLineMutationVariables,
} from '@framework/schema' } from '@framework/schema'
import { CommerceError } from '@commerce/utils/errors'
export const removeOrderLineMutation = /* GraphQL */ ` export const removeOrderLineMutation = /* GraphQL */ `
mutation removeOrderLine($orderLineId: ID!) { mutation removeOrderLine($orderLineId: ID!) {
removeOrderLine(orderLineId: $orderLineId) { removeOrderLine(orderLineId: $orderLineId) {
__typename __typename
...Cart ...Cart
... on ErrorResult {
errorCode
message
}
} }
} }
${cartFragment} ${cartFragment}
@ -42,6 +48,10 @@ export function extendHook(customFetcher: typeof fetcher) {
const { removeOrderLine } = await fn({ orderLineId: input.id }) const { removeOrderLine } = await fn({ orderLineId: input.id })
if (removeOrderLine.__typename === 'Order') { if (removeOrderLine.__typename === 'Order') {
await mutate({ removeOrderLine }, false) await mutate({ removeOrderLine }, false)
} else {
throw new CommerceError({
message: (removeOrderLine as ErrorResult).message,
})
} }
return { removeOrderLine } return { removeOrderLine }
}, },

View File

@ -7,12 +7,19 @@ import { cartFragment } from '@framework/api/fragments/cart'
import { import {
AdjustOrderLineMutation, AdjustOrderLineMutation,
AdjustOrderLineMutationVariables, AdjustOrderLineMutationVariables,
ErrorResult,
} from '@framework/schema' } from '@framework/schema'
import { CommerceError } from '@commerce/utils/errors'
export const adjustOrderLineMutation = /* GraphQL */ ` export const adjustOrderLineMutation = /* GraphQL */ `
mutation adjustOrderLine($orderLineId: ID!, $quantity: Int!) { mutation adjustOrderLine($orderLineId: ID!, $quantity: Int!) {
adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity) { adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity) {
__typename
...Cart ...Cart
... on ErrorResult {
errorCode
message
}
} }
} }
${cartFragment} ${cartFragment}
@ -44,6 +51,10 @@ function extendHook(customFetcher: typeof fetcher, cfg?: { wait?: number }) {
}) })
if (adjustOrderLine.__typename === 'Order') { if (adjustOrderLine.__typename === 'Order') {
await mutate({ adjustOrderLine }, false) await mutate({ adjustOrderLine }, false)
} else {
throw new CommerceError({
message: (adjustOrderLine as ErrorResult).message,
})
} }
return { adjustOrderLine } return { adjustOrderLine }
}, cfg?.wait ?? 500), }, cfg?.wait ?? 500),

View File

@ -2843,10 +2843,19 @@ export type LoginServerMutationVariables = Exact<{
export type LoginServerMutation = { __typename?: 'Mutation' } & { export type LoginServerMutation = { __typename?: 'Mutation' } & {
login: login:
| ({ __typename?: 'CurrentUser' } & Pick<CurrentUser, 'id'>) | ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
| { __typename?: 'InvalidCredentialsError' } | ({ __typename: 'InvalidCredentialsError' } & Pick<
| { __typename?: 'NotVerifiedError' } InvalidCredentialsError,
| { __typename?: 'NativeAuthStrategyError' } 'errorCode' | 'message'
>)
| ({ __typename: 'NotVerifiedError' } & Pick<
NotVerifiedError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
} }
export type LoginMutationVariables = Exact<{ export type LoginMutationVariables = Exact<{
@ -2857,9 +2866,18 @@ export type LoginMutationVariables = Exact<{
export type LoginMutation = { __typename?: 'Mutation' } & { export type LoginMutation = { __typename?: 'Mutation' } & {
login: login:
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>) | ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
| { __typename: 'InvalidCredentialsError' } | ({ __typename: 'InvalidCredentialsError' } & Pick<
| { __typename: 'NotVerifiedError' } InvalidCredentialsError,
| { __typename: 'NativeAuthStrategyError' } 'errorCode' | 'message'
>)
| ({ __typename: 'NotVerifiedError' } & Pick<
NotVerifiedError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
} }
export type LogoutMutationVariables = Exact<{ [key: string]: never }> export type LogoutMutationVariables = Exact<{ [key: string]: never }>
@ -2874,9 +2892,15 @@ export type SignupMutationVariables = Exact<{
export type SignupMutation = { __typename?: 'Mutation' } & { export type SignupMutation = { __typename?: 'Mutation' } & {
registerCustomerAccount: registerCustomerAccount:
| ({ __typename?: 'Success' } & Pick<Success, 'success'>) | ({ __typename: 'Success' } & Pick<Success, 'success'>)
| { __typename?: 'MissingPasswordError' } | ({ __typename: 'MissingPasswordError' } & Pick<
| { __typename?: 'NativeAuthStrategyError' } MissingPasswordError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
} }
export type AddItemToOrderMutationVariables = Exact<{ export type AddItemToOrderMutationVariables = Exact<{
@ -2886,11 +2910,23 @@ export type AddItemToOrderMutationVariables = Exact<{
export type AddItemToOrderMutation = { __typename?: 'Mutation' } & { export type AddItemToOrderMutation = { __typename?: 'Mutation' } & {
addItemToOrder: addItemToOrder:
| ({ __typename?: 'Order' } & CartFragment) | ({ __typename: 'Order' } & CartFragment)
| { __typename?: 'OrderModificationError' } | ({ __typename: 'OrderModificationError' } & Pick<
| { __typename?: 'OrderLimitError' } OrderModificationError,
| { __typename?: 'NegativeQuantityError' } 'errorCode' | 'message'
| { __typename?: 'InsufficientStockError' } >)
| ({ __typename: 'OrderLimitError' } & Pick<
OrderLimitError,
'errorCode' | 'message'
>)
| ({ __typename: 'NegativeQuantityError' } & Pick<
NegativeQuantityError,
'errorCode' | 'message'
>)
| ({ __typename: 'InsufficientStockError' } & Pick<
InsufficientStockError,
'errorCode' | 'message'
>)
} }
export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }> export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }>
@ -2906,7 +2942,10 @@ export type RemoveOrderLineMutationVariables = Exact<{
export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & { export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & {
removeOrderLine: removeOrderLine:
| ({ __typename: 'Order' } & CartFragment) | ({ __typename: 'Order' } & CartFragment)
| { __typename: 'OrderModificationError' } | ({ __typename: 'OrderModificationError' } & Pick<
OrderModificationError,
'errorCode' | 'message'
>)
} }
export type AdjustOrderLineMutationVariables = Exact<{ export type AdjustOrderLineMutationVariables = Exact<{
@ -2916,11 +2955,23 @@ export type AdjustOrderLineMutationVariables = Exact<{
export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & { export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & {
adjustOrderLine: adjustOrderLine:
| ({ __typename?: 'Order' } & CartFragment) | ({ __typename: 'Order' } & CartFragment)
| { __typename?: 'OrderModificationError' } | ({ __typename: 'OrderModificationError' } & Pick<
| { __typename?: 'OrderLimitError' } OrderModificationError,
| { __typename?: 'NegativeQuantityError' } 'errorCode' | 'message'
| { __typename?: 'InsufficientStockError' } >)
| ({ __typename: 'OrderLimitError' } & Pick<
OrderLimitError,
'errorCode' | 'message'
>)
| ({ __typename: 'NegativeQuantityError' } & Pick<
NegativeQuantityError,
'errorCode' | 'message'
>)
| ({ __typename: 'InsufficientStockError' } & Pick<
InsufficientStockError,
'errorCode' | 'message'
>)
} }
export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }> export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }>