From 1063e245c829cda7c3292814dfc9cee85b47e135 Mon Sep 17 00:00:00 2001 From: Matthew Cantelon Date: Thu, 10 Jun 2021 07:19:20 -0700 Subject: [PATCH] feat: least surprise in failures This change covers two possible failures: * a developer requesting a chain that hasn't been configured * network failures on subgraphs If a developer forgets to add to the client map, this will throw an error instead of defaulting to ethereum results. This helps the developer make changes correctly. If a network failure occurs or a developer makes a mistake, the entire membership structure is not affected via `Promise.allSettled`. This avoids confusing errors for users. --- .../remote-schemas/resolvers/daohaus/resolver.ts | 14 +++++++++----- packages/backend/src/lib/daoHausClient.ts | 11 ++++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/handlers/remote-schemas/resolvers/daohaus/resolver.ts b/packages/backend/src/handlers/remote-schemas/resolvers/daohaus/resolver.ts index f45d3f95..295802e0 100644 --- a/packages/backend/src/handlers/remote-schemas/resolvers/daohaus/resolver.ts +++ b/packages/backend/src/handlers/remote-schemas/resolvers/daohaus/resolver.ts @@ -26,16 +26,20 @@ export const getDaoHausMemberships: QueryResolvers['getDaoHausMemberships'] = as const membershipsOn = addChain(memberAddress); - const memberships = await Promise.all([ + const memberships = await Promise.allSettled([ membershipsOn('ethereum'), membershipsOn('polygon'), membershipsOn('xdai'), ]); - const members: Member[] = memberships.reduce( - (allMembers, chainMembers) => [...allMembers, ...chainMembers], - [], - ); + const members: Member[] = memberships.reduce((allMembers, chainMembers) => { + if (chainMembers.status === 'rejected') { + console.error('Pulling memberships failed:', chainMembers.reason); + return allMembers; + } + + return [...allMembers, ...chainMembers.value]; + }, []); return members; }; diff --git a/packages/backend/src/lib/daoHausClient.ts b/packages/backend/src/lib/daoHausClient.ts index 8ebd1b8a..e48e6ba3 100644 --- a/packages/backend/src/lib/daoHausClient.ts +++ b/packages/backend/src/lib/daoHausClient.ts @@ -3,13 +3,18 @@ import { GraphQLClient } from 'graphql-request'; import { CONFIG } from '../config'; import { getSdk, Sdk } from './autogen/daohaus-sdk'; -const defaultGqlClient = new GraphQLClient(CONFIG.daoHausGraphqlURL); const clients = new Map([ ['polygon', new GraphQLClient(CONFIG.daoHausPolygonGraphqlURL)], ['xdai', new GraphQLClient(CONFIG.daoHausXdaiGraphqlURL)], - ['ethereum', defaultGqlClient], + ['ethereum', new GraphQLClient(CONFIG.daoHausGraphqlURL)], ]); export function getClient(chain: string): Sdk { - return getSdk(clients.get(chain) || defaultGqlClient); + const gqlClient = clients.get(chain); + if (!gqlClient) + throw new Error( + `The '${chain}' chain is unrecognized, unable to create GQL Client`, + ); + + return getSdk(gqlClient); }