From 9be84fb473213a1664fc61a777a6af4c021837a9 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 7 Jun 2023 11:52:13 +0800 Subject: [PATCH] create thumbnail task for newsletters too --- packages/api/src/services/save_email.ts | 21 ++++++++--- packages/api/src/services/save_page.ts | 21 +++++------ packages/api/src/utils/createTask.ts | 48 +++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/packages/api/src/services/save_email.ts b/packages/api/src/services/save_email.ts index 1fdf423bd..7e49494b0 100644 --- a/packages/api/src/services/save_email.ts +++ b/packages/api/src/services/save_email.ts @@ -1,3 +1,8 @@ +import normalizeUrl from 'normalize-url' +import { PubsubClient } from '../datalayer/pubsub' +import { createPage, getPageByParam, updatePage } from '../elastic/pages' +import { ArticleSavingRequestStatus, Page } from '../elastic/types' +import { enqueueThumbnailTask } from '../utils/createTask' import { generateSlug, stringToHash, @@ -9,10 +14,6 @@ import { parsePreparedContent, parseUrlMetadata, } from '../utils/parser' -import normalizeUrl from 'normalize-url' -import { PubsubClient } from '../datalayer/pubsub' -import { ArticleSavingRequestStatus, Page } from '../elastic/types' -import { createPage, getPageByParam, updatePage } from '../elastic/pages' export type SaveContext = { pubsub: PubsubClient @@ -105,6 +106,18 @@ export const saveEmail = async ( return undefined } + // create a task to update thumbnail and pre-cache all images + try { + const taskId = await enqueueThumbnailTask( + ctx.uid, + slug, + articleToSave.content + ) + console.debug('Created thumbnail task', taskId) + } catch (e) { + console.log('Failed to create thumbnail task', e) + } + articleToSave.id = pageId return articleToSave diff --git a/packages/api/src/services/save_page.ts b/packages/api/src/services/save_page.ts index ca332a89f..c58ded776 100644 --- a/packages/api/src/services/save_page.ts +++ b/packages/api/src/services/save_page.ts @@ -4,7 +4,7 @@ import { PubsubClient } from '../datalayer/pubsub' import { addHighlightToPage } from '../elastic/highlights' import { createPage, getPageByParam, updatePage } from '../elastic/pages' import { ArticleSavingRequestStatus, Page, PageType } from '../elastic/types' -import { env, homePageURL } from '../env' +import { homePageURL } from '../env' import { HighlightType, Maybe, @@ -14,8 +14,7 @@ import { SaveResult, } from '../generated/graphql' import { DataModels } from '../resolvers/types' -import { generateVerificationToken } from '../utils/auth' -import createHttpTaskWithToken from '../utils/createTask' +import { enqueueThumbnailTask } from '../utils/createTask' import { generateSlug, stringToHash, @@ -168,16 +167,12 @@ export const savePage = async ( // create a task to update thumbnail and pre-cache all images try { - await createHttpTaskWithToken({ - payload: { - userId: saver.userId, - slug, - }, - taskHandlerUrl: env.queue.thumbnailTaskHandlerUrl, - requestHeaders: { - Authorization: generateVerificationToken(saver.userId), - }, - }) + const taskId = await enqueueThumbnailTask( + saver.userId, + slug, + articleToSave.content + ) + console.debug('Created thumbnail task', taskId) } catch (e) { console.log('Failed to create thumbnail task', e) } diff --git a/packages/api/src/utils/createTask.ts b/packages/api/src/utils/createTask.ts index 331a771e8..17dae7831 100644 --- a/packages/api/src/utils/createTask.ts +++ b/packages/api/src/utils/createTask.ts @@ -12,6 +12,7 @@ import { CreateLabelInput, } from '../generated/graphql' import { signFeatureToken } from '../services/features' +import { generateVerificationToken } from './auth' import { CreateTaskError } from './errors' import { buildLogger } from './logger' import View = google.cloud.tasks.v2.Task.View @@ -498,4 +499,51 @@ export const enqueueImportFromIntegration = async ( return createdTasks[0].name } +export const enqueueThumbnailTask = async ( + userId: string, + slug: string, + content: string +): Promise => { + const { GOOGLE_CLOUD_PROJECT } = process.env + const payload = { + userId, + slug, + content, + } + + const requestHeaders = { + Authorization: generateVerificationToken(userId), + } + + // If there is no Google Cloud Project Id exposed, it means that we are in local environment + if (env.dev.isLocal || !GOOGLE_CLOUD_PROJECT) { + // Calling the handler function directly. + setTimeout(() => { + axios + .post(env.queue.thumbnailTaskHandlerUrl, payload, { + headers: requestHeaders, + }) + .catch((error) => { + console.error(error) + }) + }, 0) + return '' + } + + const createdTasks = await createHttpTaskWithToken({ + payload, + taskHandlerUrl: env.queue.thumbnailTaskHandlerUrl, + requestHeaders, + }) + + 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