From c8ec84562bb05a34af5f3b712f0bfaa5ee4bd91b Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 27 Feb 2023 18:27:17 +0800 Subject: [PATCH] Create an import from integration cloud task --- .../api/src/resolvers/integrations/index.ts | 12 ++++--- packages/api/src/utils/createTask.ts | 33 +++++++++++++++++++ packages/web/pages/settings/integrations.tsx | 5 ++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/api/src/resolvers/integrations/index.ts b/packages/api/src/resolvers/integrations/index.ts index 0618bf3ec..25f1643fe 100644 --- a/packages/api/src/resolvers/integrations/index.ts +++ b/packages/api/src/resolvers/integrations/index.ts @@ -22,7 +22,11 @@ import { Integration, IntegrationType } from '../../entity/integration' import { analytics } from '../../utils/analytics' import { env } from '../../env' import { getIntegrationService } from '../../services/integrations' -import { deleteTask, enqueueSyncWithIntegration } from '../../utils/createTask' +import { + deleteTask, + enqueueImportFromIntegration, + enqueueSyncWithIntegration, +} from '../../utils/createTask' export const setIntegrationResolver = authorized< SetIntegrationSuccess, @@ -239,8 +243,8 @@ export const importFromIntegrationResolver = authorized< } } - const integrationService = getIntegrationService(integration.name) - const count = await integrationService.import(integration) + // create a task to import all the pages + await enqueueImportFromIntegration(uid, integration.id) analytics.track({ userId: uid, @@ -251,7 +255,7 @@ export const importFromIntegrationResolver = authorized< }) return { - count, + success: true, } } catch (error) { log.error(error) diff --git a/packages/api/src/utils/createTask.ts b/packages/api/src/utils/createTask.ts index d83f7b7c8..6e984966d 100644 --- a/packages/api/src/utils/createTask.ts +++ b/packages/api/src/utils/createTask.ts @@ -441,4 +441,37 @@ export const enqueueRecommendation = async ( return createdTasks[0].name } +export const enqueueImportFromIntegration = async ( + userId: string, + integrationId: string +): Promise => { + const { GOOGLE_CLOUD_PROJECT } = process.env + // use pubsub data format to send the userId to the task handler + const payload = { + userId, + integrationId, + } + + // If there is no Google Cloud Project Id exposed, it means that we are in local environment + if (env.dev.isLocal || !GOOGLE_CLOUD_PROJECT) { + return nanoid() + } + + const createdTasks = await createHttpTaskWithToken({ + project: GOOGLE_CLOUD_PROJECT, + payload, + taskHandlerUrl: `${env.queue.integrationTaskHandlerUrl}/import`, + priority: 'low', + }) + + if (!createdTasks || !createdTasks[0].name) { + logger.error(`Unable to get the name of the task`, { + payload, + createdTasks, + }) + throw new CreateTaskError(`Unable to get the name of the task`) + } + return createdTasks[0].name +} + export default createHttpTaskWithToken diff --git a/packages/web/pages/settings/integrations.tsx b/packages/web/pages/settings/integrations.tsx index d4d16ce76..5a1d472af 100644 --- a/packages/web/pages/settings/integrations.tsx +++ b/packages/web/pages/settings/integrations.tsx @@ -129,7 +129,10 @@ export default function Integrations(): JSX.Element { } } if (!router.isReady) return - if (router.query.state == 'pocketAuthorizationFinished') { + if ( + router.query.state == 'pocketAuthorizationFinished' && + !pocketConnected + ) { connectToPocket() } }, [router])