From 9e3db0e053bf5b786286fadaf29c95b01d987235 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 4 May 2022 19:12:22 +0800 Subject: [PATCH] Fix a bug to have multiple pages with the same url in lib --- packages/api/src/resolvers/article/index.ts | 94 ++++++++----------- .../src/services/create_page_save_request.ts | 71 +++++++------- 2 files changed, 72 insertions(+), 93 deletions(-) diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 3e97b9e62..55e548115 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -246,8 +246,8 @@ export const createArticleResolver = authorized< const saveTime = new Date() const slug = generateSlug(parsedContent?.title || croppedPathname) - let articleToSave: Page = { - id: '', + const articleToSave: Page = { + id: pageId || '', userId: uid, originalHtml: domContent, content: parsedContent?.content || '', @@ -317,63 +317,47 @@ export const createArticleResolver = authorized< ) } - const existingPage = await getPageByParam({ - userId: uid, - url: articleToSave.url, - state: ArticleSavingRequestStatus.Succeeded, - }) - if (existingPage) { - // update existing page in elastic - existingPage.slug = slug - existingPage.savedAt = saveTime - existingPage.archivedAt = archive ? saveTime : undefined - existingPage.url = uploadFileUrlOverride || articleToSave.url - existingPage.hash = articleToSave.hash - - await updatePage(existingPage.id, existingPage, { ...ctx, uid }) - - log.info('page updated in elastic', existingPage.id) - articleToSave = existingPage - } else { - // create new page in elastic - if (!pageId) { - pageId = await createPage(articleToSave, { ...ctx, uid }) - if (!pageId) { - return pageError( - { - errorCodes: [CreateArticleErrorCode.ElasticError], - }, - ctx, - pageId - ) - } - } else { - const updated = await updatePage(pageId, articleToSave, { - ...ctx, - uid, - }) - - if (!updated) { - return pageError( - { - errorCodes: [CreateArticleErrorCode.ElasticError], - }, - ctx, - pageId - ) - } + // create new page in elastic + if (!pageId) { + const newPageId = await createPage(articleToSave, { ...ctx, uid }) + if (!newPageId) { + return pageError( + { + errorCodes: [CreateArticleErrorCode.ElasticError], + }, + ctx, + pageId + ) } + articleToSave.id = newPageId + } else { + // update existing page's state from processing to succeeded + articleToSave.archivedAt = archive ? saveTime : undefined + articleToSave.url = uploadFileUrlOverride || articleToSave.url + const updated = await updatePage(pageId, articleToSave, { + ...ctx, + uid, + }) - log.info( - 'page created in elastic', - pageId, - articleToSave.url, - articleToSave.slug, - articleToSave.title - ) - articleToSave.id = pageId + if (!updated) { + return pageError( + { + errorCodes: [CreateArticleErrorCode.ElasticError], + }, + ctx, + pageId + ) + } } + log.info( + 'page created in elastic', + articleToSave.id, + articleToSave.url, + articleToSave.slug, + articleToSave.title + ) + const createdArticle: PartialArticle = { ...articleToSave, isArchived: !!articleToSave.archivedAt, diff --git a/packages/api/src/services/create_page_save_request.ts b/packages/api/src/services/create_page_save_request.ts index 295e955a3..ca8c0c357 100644 --- a/packages/api/src/services/create_page_save_request.ts +++ b/packages/api/src/services/create_page_save_request.ts @@ -10,7 +10,7 @@ import { import { generateSlug, pageToArticleSavingRequest } from '../utils/helpers' import * as privateIpLib from 'private-ip' import { countByCreatedAt, createPage, getPageByParam } from '../elastic/pages' -import { ArticleSavingRequestStatus, Page, PageType } from '../elastic/types' +import { ArticleSavingRequestStatus, PageType } from '../elastic/types' import { createPubSubClient, PubsubClient } from '../datalayer/pubsub' import normalizeUrl from 'normalize-url' @@ -82,52 +82,47 @@ export const createPageSaveRequest = async ( // get priority by checking rate limit if not specified priority = priority || (await getPriorityByRateLimit(userId)) + // look for existing page url = normalizeUrl(url, { stripHash: true, stripWWW: false, }) - const createdTaskName = await enqueueParseRequest( - url, - userId, - articleSavingRequestId, - priority - ) - - const existingPage = await getPageByParam({ + let page = await getPageByParam({ userId, url, - state: ArticleSavingRequestStatus.Succeeded, }) - if (existingPage) { - console.log('Page already exists', url) - existingPage.taskName = createdTaskName - return pageToArticleSavingRequest(user, existingPage) + if (page) { + console.log('Page already exists', page) + articleSavingRequestId = page.id + } else { + page = { + id: articleSavingRequestId, + userId, + content: SAVING_CONTENT, + hash: '', + pageType: PageType.Unknown, + readingProgressAnchorIndex: 0, + readingProgressPercent: 0, + slug: generateSlug(url), + title: url, + url, + state: ArticleSavingRequestStatus.Processing, + createdAt: new Date(), + savedAt: new Date(), + } + + // create processing page + const pageId = await createPage(page, { pubsub, uid: userId }) + if (!pageId) { + console.log('Failed to create page', page) + return Promise.reject({ + errorCode: CreateArticleSavingRequestErrorCode.BadData, + }) + } } - const page: Page = { - id: articleSavingRequestId, - userId, - content: SAVING_CONTENT, - hash: '', - pageType: PageType.Unknown, - readingProgressAnchorIndex: 0, - readingProgressPercent: 0, - slug: generateSlug(url), - title: url, - url, - taskName: createdTaskName, - state: ArticleSavingRequestStatus.Processing, - createdAt: new Date(), - savedAt: new Date(), - } - - const pageId = await createPage(page, { pubsub, uid: userId }) - if (!pageId) { - console.log('Failed to create page', page) - return Promise.reject({ - errorCode: CreateArticleSavingRequestErrorCode.BadData, - }) - } + // enqueue task to parse page + await enqueueParseRequest(url, userId, articleSavingRequestId, priority) return pageToArticleSavingRequest(user, page) }