diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 656149b99..dcc658e09 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -954,7 +954,7 @@ export type ImportFromIntegrationResult = ImportFromIntegrationError | ImportFro export type ImportFromIntegrationSuccess = { __typename?: 'ImportFromIntegrationSuccess'; - success: Scalars['Boolean']; + count: Scalars['Int']; }; export type Integration = { @@ -4807,7 +4807,7 @@ export type ImportFromIntegrationResultResolvers = { - success?: Resolver; + count?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 651eafbff..22eb9d4dc 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -847,7 +847,7 @@ enum ImportFromIntegrationErrorCode { union ImportFromIntegrationResult = ImportFromIntegrationError | ImportFromIntegrationSuccess type ImportFromIntegrationSuccess { - success: Boolean! + count: Int! } type Integration { diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 4e2228ccb..f5624512c 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -62,6 +62,7 @@ import { googleLoginResolver, googleSignupResolver, groupsResolver, + importFromIntegrationResolver, integrationsResolver, joinGroupResolver, labelsResolver, @@ -202,6 +203,7 @@ export const functionResolvers = { uploadImportFile: uploadImportFileResolver, markEmailAsItem: markEmailAsItemResolver, bulkAction: bulkActionResolver, + importFromIntegration: importFromIntegrationResolver, }, Query: { me: getMeUserResolver, @@ -650,4 +652,5 @@ export const functionResolvers = { ...resultResolveTypeResolver('RecentEmails'), ...resultResolveTypeResolver('MarkEmailAsItem'), ...resultResolveTypeResolver('BulkAction'), + ...resultResolveTypeResolver('ImportFromIntegration'), } diff --git a/packages/api/src/resolvers/integrations/index.ts b/packages/api/src/resolvers/integrations/index.ts index 9aa2c8b3e..b2cf17f88 100644 --- a/packages/api/src/resolvers/integrations/index.ts +++ b/packages/api/src/resolvers/integrations/index.ts @@ -3,10 +3,14 @@ import { DeleteIntegrationError, DeleteIntegrationErrorCode, DeleteIntegrationSuccess, + ImportFromIntegrationError, + ImportFromIntegrationErrorCode, + ImportFromIntegrationSuccess, IntegrationsError, IntegrationsErrorCode, IntegrationsSuccess, MutationDeleteIntegrationArgs, + MutationImportFromIntegrationArgs, MutationSetIntegrationArgs, SetIntegrationError, SetIntegrationErrorCode, @@ -222,3 +226,45 @@ export const deleteIntegrationResolver = authorized< } } }) + +export const importFromIntegrationResolver = authorized< + ImportFromIntegrationSuccess, + ImportFromIntegrationError, + MutationImportFromIntegrationArgs +>(async (_, { integrationId }, { claims: { uid }, log }) => { + log.info('importFromIntegrationResolver') + + try { + const integration = await getRepository(Integration).findOne({ + where: { id: integrationId, user: { id: uid } }, + relations: ['user'], + }) + + if (!integration) { + return { + errorCodes: [ImportFromIntegrationErrorCode.Unauthorized], + } + } + + const integrationService = getIntegrationService(integration.name) + const count = await integrationService.import(integration) + + analytics.track({ + userId: uid, + event: 'integration_import', + properties: { + integrationId, + }, + }) + + return { + count, + } + } catch (error) { + log.error(error) + + return { + errorCodes: [ImportFromIntegrationErrorCode.BadRequest], + } + } +}) diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 7751f0c33..e45f278c7 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2424,7 +2424,7 @@ const schema = gql` | ImportFromIntegrationError type ImportFromIntegrationSuccess { - success: Boolean! + count: Int! } type ImportFromIntegrationError {