diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 55e548115..aa1a0e5ca 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -46,6 +46,7 @@ import { ContentParseError } from '../../utils/errors' import { authorized, generateSlug, + isParsingTimeout, pageError, stringToHash, userDataToUser, @@ -102,7 +103,7 @@ const FORCE_PUPPETEER_URLS = [ /twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)(?:\/.*)?/, /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/, ] -const UNPARSEABLE_CONTENT = 'We were unable to parse this page.' +const UNPARSEABLE_CONTENT = '
We were unable to parse this page.
' export type CreateArticlesSuccessPartial = Merge< CreateArticleSuccess, @@ -416,17 +417,8 @@ export const getArticleResolver: ResolverFn< return { errorCodes: [ArticleErrorCode.NotFound] } } - if ( - page.state === ArticleSavingRequestStatus.Processing && - new Date(page.savedAt).getTime() < new Date().getTime() - 1000 * 30 - ) { - page.content = `${UNPARSEABLE_CONTENT}
` - page.description = UNPARSEABLE_CONTENT - page.state = ArticleSavingRequestStatus.Failed - await updatePage(page.id, page, { - uid: claims.uid, - pubsub, - }) + if (isParsingTimeout(page)) { + page.content = UNPARSEABLE_CONTENT } return { diff --git a/packages/api/src/resolvers/article_saving_request/index.ts b/packages/api/src/resolvers/article_saving_request/index.ts index d4a542fb5..1b8f2764e 100644 --- a/packages/api/src/resolvers/article_saving_request/index.ts +++ b/packages/api/src/resolvers/article_saving_request/index.ts @@ -2,6 +2,7 @@ import { ArticleSavingRequestError, ArticleSavingRequestErrorCode, + ArticleSavingRequestStatus, ArticleSavingRequestSuccess, CreateArticleSavingRequestError, CreateArticleSavingRequestErrorCode, @@ -9,7 +10,11 @@ import { MutationCreateArticleSavingRequestArgs, QueryArticleSavingRequestArgs, } from '../../generated/graphql' -import { authorized, pageToArticleSavingRequest } from '../../utils/helpers' +import { + authorized, + isParsingTimeout, + pageToArticleSavingRequest, +} from '../../utils/helpers' import { createPageSaveRequest } from '../../services/create_page_save_request' import { getPageById } from '../../elastic/pages' import { isErrorWithCode } from '../user' @@ -62,8 +67,12 @@ export const articleSavingRequestResolver = authorized< user = await models.user.get(page.userId) // eslint-disable-next-line no-empty } catch (error) {} - if (user && page) + if (user && page) { + if (isParsingTimeout(page)) { + page.state = ArticleSavingRequestStatus.Succeeded + } return { articleSavingRequest: pageToArticleSavingRequest(user, page) } + } return { errorCodes: [ArticleSavingRequestErrorCode.NotFound] } }) diff --git a/packages/api/src/utils/helpers.ts b/packages/api/src/utils/helpers.ts index f5499fd56..73c0abdc9 100644 --- a/packages/api/src/utils/helpers.ts +++ b/packages/api/src/utils/helpers.ts @@ -202,6 +202,14 @@ export const pageToArticleSavingRequest = ( updatedAt: page.updatedAt || new Date(), }) +export const isParsingTimeout = (page: Page): boolean => { + return ( + // page processed more than 30 seconds ago + page.state === ArticleSavingRequestStatus.Processing && + new Date(page.savedAt).getTime() < new Date().getTime() - 1000 * 30 + ) +} + export const validatedDate = ( date: Date | string | undefined ): Date | undefined => {