diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 33ecceb9b..9d908a941 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -2283,8 +2283,11 @@ export type SaveFileInput = { clientRequestId: Scalars['ID']; folder?: InputMaybe; labels?: InputMaybe>; + publishedAt?: InputMaybe; + savedAt?: InputMaybe; source: Scalars['String']; state?: InputMaybe; + subscription?: InputMaybe; uploadFileId: Scalars['ID']; url: Scalars['String']; }; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 203d7b9bd..2df4f681e 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1718,8 +1718,11 @@ input SaveFileInput { clientRequestId: ID! folder: String labels: [CreateLabelInput!] + publishedAt: Date + savedAt: Date source: String! state: ArticleSavingRequestStatus + subscription: String uploadFileId: ID! url: String! } diff --git a/packages/api/src/jobs/save_page.ts b/packages/api/src/jobs/save_page.ts index 0e87eb30c..1eebf1adb 100644 --- a/packages/api/src/jobs/save_page.ts +++ b/packages/api/src/jobs/save_page.ts @@ -8,6 +8,7 @@ import { } from '../generated/graphql' import { redisDataSource } from '../redis_data_source' import { userRepository } from '../repository/user' +import { saveFile } from '../services/save_file' import { savePage } from '../services/save_page' import { logger } from '../utils/logger' @@ -46,17 +47,6 @@ interface UploadFileResponse { } } -interface CreateArticleResponse { - data: { - createArticle: { - createdArticle: { - id: string - } - errorCodes: string[] - } - } -} - interface FetchResult { finalUrl: string title?: string @@ -174,57 +164,6 @@ const uploadPdf = async ( return uploadResult.id } -const sendCreateArticleMutation = async (userId: string, input: unknown) => { - const data = JSON.stringify({ - query: `mutation CreateArticle ($input: CreateArticleInput!){ - createArticle(input:$input){ - ... on CreateArticleSuccess{ - createdArticle{ - id - } - } - ... on CreateArticleError{ - errorCodes - } - } - }`, - variables: { - input, - }, - }) - - const auth = await signToken({ uid: userId }, JWT_SECRET) - try { - const response = await axios.post( - `${REST_BACKEND_ENDPOINT}/graphql`, - data, - { - headers: { - Cookie: `auth=${auth as string};`, - 'Content-Type': 'application/json', - }, - timeout: REQUEST_TIMEOUT, - } - ) - - if ( - response.data.data.createArticle.errorCodes && - response.data.data.createArticle.errorCodes.length > 0 - ) { - console.error( - 'error while creating article', - response.data.data.createArticle.errorCodes[0] - ) - return null - } - - return response.data.data.createArticle - } catch (error) { - console.error('error creating article', error) - return null - } -} - const sendImportStatusUpdate = async ( userId: string, taskId: string, @@ -298,25 +237,37 @@ export const savePageJob = async (data: Data, attemptsMade: number) => { const { title, contentType } = fetchedResult let content = fetchedResult.content + const user = await userRepository.findById(userId) + if (!user) { + logger.error('Unable to save job, user can not be found.', { + userId, + url, + }) + // if the user is not found, we do not retry + return false + } + // for pdf content, we need to upload the pdf if (contentType === 'application/pdf') { - const encodedUrl = encodeURI(url) - const uploadFileId = await uploadPdf(url, userId, articleSavingRequestId) - const uploadedPdf = await sendCreateArticleMutation(userId, { - url: encodedUrl, - articleSavingRequestId, - uploadFileId, - state, - labels, - source, - folder, - rssFeedUrl, - savedAt, - publishedAt, - }) - if (!uploadedPdf) { - throw new Error('error while saving uploaded pdf') + + const result = await saveFile( + { + url, + uploadFileId, + state: state ? (state as ArticleSavingRequestStatus) : undefined, + labels, + source, + folder, + subscription: rssFeedUrl, + savedAt, + publishedAt, + clientRequestId: articleSavingRequestId, + }, + user + ) + if (result.__typename == 'SaveError') { + throw new Error(result.message || result.errorCodes[0]) } isSaved = true @@ -331,16 +282,6 @@ export const savePageJob = async (data: Data, attemptsMade: number) => { state = ArticleSavingRequestStatus.Failed } - const user = await userRepository.findById(userId) - if (!user) { - logger.error('Unable to save job, user can not be found.', { - userId, - url, - }) - // if the user is not found, we do not retry - return false - } - // for non-pdf content, we need to save the page const result = await savePage( { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 877b4bfb4..d18b91012 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -545,6 +545,9 @@ const schema = gql` state: ArticleSavingRequestStatus labels: [CreateLabelInput!] folder: String + savedAt: Date + publishedAt: Date + subscription: String } input ParseResult { diff --git a/packages/api/src/services/save_file.ts b/packages/api/src/services/save_file.ts index e6c58148b..dd727ec38 100644 --- a/packages/api/src/services/save_file.ts +++ b/packages/api/src/services/save_file.ts @@ -14,6 +14,7 @@ export const saveFile = async ( const uploadFile = await findUploadFileById(input.uploadFileId) if (!uploadFile) { return { + __typename: 'SaveError', errorCodes: [SaveErrorCode.Unauthorized], } } @@ -24,6 +25,7 @@ export const saveFile = async ( if (!uploadFileData) { return { + __typename: 'SaveError', errorCodes: [SaveErrorCode.Unknown], } } @@ -34,6 +36,8 @@ export const saveFile = async ( { state: (input.state as unknown as LibraryItemState) || undefined, folder: input.folder || undefined, + savedAt: input.savedAt || undefined, + publishedAt: input.publishedAt || undefined, }, user.id ) @@ -43,7 +47,8 @@ export const saveFile = async ( await createAndSaveLabelsInLibraryItem( input.clientRequestId, user.id, - input.labels + input.labels, + input.subscription ) return {