Merge pull request #3184 from omnivore-app/fix/pdf-in-rss

fix feed url in pdf file not saved
This commit is contained in:
Hongbo Wu
2023-12-08 11:50:58 +08:00
committed by GitHub
12 changed files with 100 additions and 50 deletions

View File

@ -275,6 +275,9 @@ export type CreateArticleInput = {
folder?: InputMaybe<Scalars['String']>;
labels?: InputMaybe<Array<CreateLabelInput>>;
preparedDocument?: InputMaybe<PreparedDocumentInput>;
publishedAt?: InputMaybe<Scalars['Date']>;
rssFeedUrl?: InputMaybe<Scalars['String']>;
savedAt?: InputMaybe<Scalars['Date']>;
skipParsing?: InputMaybe<Scalars['Boolean']>;
source?: InputMaybe<Scalars['String']>;
state?: InputMaybe<ArticleSavingRequestStatus>;

View File

@ -232,6 +232,9 @@ input CreateArticleInput {
folder: String
labels: [CreateLabelInput!]
preparedDocument: PreparedDocumentInput
publishedAt: Date
rssFeedUrl: String
savedAt: Date
skipParsing: Boolean
source: String
state: ArticleSavingRequestStatus

View File

@ -61,9 +61,9 @@ import { createPageSaveRequest } from '../../services/create_page_save_request'
import { findHighlightsByLibraryItemId } from '../../services/highlights'
import {
addLabelsToLibraryItem,
createAndSaveLabelsInLibraryItem,
findLabelsByIds,
findOrCreateLabels,
saveLabelsInLibraryItem,
} from '../../services/labels'
import {
createLibraryItem,
@ -138,6 +138,9 @@ export const createArticleResolver = authorized<
state,
labels: inputLabels,
folder,
rssFeedUrl,
savedAt,
publishedAt,
},
},
{ log, uid, pubsub }
@ -215,9 +218,11 @@ export const createArticleResolver = authorized<
readingProgressAnchorIndex: 0,
readingProgressPercent: 0,
highlights: [],
savedAt: new Date(),
savedAt: savedAt || new Date(),
updatedAt: new Date(),
folder: '',
publishedAt,
subscription: rssFeedUrl,
},
}
@ -252,6 +257,9 @@ export const createArticleResolver = authorized<
state: state || undefined,
labels: inputLabels || undefined,
folder: folder || undefined,
savedAt,
publishedAt,
subscription: rssFeedUrl || undefined,
})
return DUMMY_RESPONSE
} else if (!skipParsing && preparedDocument?.document) {
@ -274,6 +282,9 @@ export const createArticleResolver = authorized<
state: state || undefined,
labels: inputLabels || undefined,
folder: folder || undefined,
savedAt,
publishedAt,
subscription: rssFeedUrl || undefined,
})
return DUMMY_RESPONSE
}
@ -294,6 +305,9 @@ export const createArticleResolver = authorized<
uploadFileId,
state,
folder,
publishedAt,
rssFeedUrl,
savedAt,
})
log.info('New article saving', {
@ -341,11 +355,13 @@ export const createArticleResolver = authorized<
)
}
// save labels in item
if (inputLabels) {
const labels = await findOrCreateLabels(inputLabels, user.id)
await saveLabelsInLibraryItem(labels, libraryItemToReturn.id, user.id)
}
await createAndSaveLabelsInLibraryItem(
libraryItemToReturn.id,
uid,
inputLabels,
rssFeedUrl,
pubsub
)
log.info(
'item created in database',

View File

@ -1,9 +1,6 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
import express from 'express'
import {
findOrCreateLabels,
saveLabelsInLibraryItem,
} from '../../services/labels'
import { createAndSaveLabelsInLibraryItem } from '../../services/labels'
import { saveFeedItemInFollowing } from '../../services/library_item'
import { logger } from '../../utils/logger'
@ -69,19 +66,12 @@ export function followingServiceRouter() {
logger.info('feed item saved in following')
// add RSS label to the item
const labels = await findOrCreateLabels(
[
{
name: 'RSS',
},
],
userId
)
await saveLabelsInLibraryItem(
labels,
// save RSS label in the item
await createAndSaveLabelsInLibraryItem(
result.identifiers[0].id,
userId,
[{ name: 'RSS' }],
undefined,
undefined,
true
)

View File

@ -497,6 +497,9 @@ const schema = gql`
state: ArticleSavingRequestStatus
labels: [CreateLabelInput!]
folder: String
rssFeedUrl: String
savedAt: Date
publishedAt: Date
}
enum CreateArticleErrorCode {
UNABLE_TO_FETCH

View File

@ -36,6 +36,7 @@ interface PageSaveRequest {
savedAt?: Date
publishedAt?: Date
folder?: string
subscription?: string
}
const SAVING_CONTENT = 'Your link is being saved...'
@ -91,6 +92,7 @@ export const createPageSaveRequest = async ({
savedAt,
publishedAt,
folder,
subscription,
}: PageSaveRequest): Promise<ArticleSavingRequest> => {
try {
validateUrl(url)
@ -128,6 +130,8 @@ export const createPageSaveRequest = async ({
state: LibraryItemState.Processing,
publishedAt,
folder,
subscription,
savedAt,
},
userId,
pubsub
@ -161,6 +165,7 @@ export const createPageSaveRequest = async ({
savedAt,
publishedAt,
folder,
rssFeedUrl: subscription,
})
return libraryItemToArticleSavingRequest(user, libraryItem)

View File

@ -3,7 +3,7 @@ import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity
import { EntityLabel } from '../entity/entity_label'
import { Label } from '../entity/label'
import { LibraryItem } from '../entity/library_item'
import { createPubSubClient, EntityType } from '../pubsub'
import { createPubSubClient, EntityType, PubsubClient } from '../pubsub'
import { authTrx } from '../repository'
import { CreateLabelInput, labelRepository } from '../repository/label'
import { libraryItemRepository } from '../repository/library_item'
@ -65,6 +65,33 @@ export const findOrCreateLabels = async (
)
}
export const createAndSaveLabelsInLibraryItem = async (
libraryItemId: string,
userId: string,
labels?: CreateLabelInput[] | null,
rssFeedUrl?: string | null,
pubsub?: PubsubClient,
skipPubSub?: boolean
) => {
if (rssFeedUrl) {
// add rss label to labels
labels = (labels || []).concat({ name: 'RSS' })
}
// save labels in item
if (labels && labels.length > 0) {
const newLabels = await findOrCreateLabels(labels, userId)
await saveLabelsInLibraryItem(
newLabels,
libraryItemId,
userId,
pubsub,
skipPubSub
)
}
}
export const saveLabelsInLibraryItem = async (
labels: Label[],
libraryItemId: string,

View File

@ -1,5 +1,4 @@
import { LibraryItem, LibraryItemState } from '../entity/library_item'
import { getInternalLabelWithColor } from '../repository/label'
import { enqueueThumbnailTask } from '../utils/createTask'
import {
cleanUrl,
@ -16,7 +15,7 @@ import {
parsePreparedContent,
parseUrlMetadata,
} from '../utils/parser'
import { findOrCreateLabels, saveLabelsInLibraryItem } from './labels'
import { createAndSaveLabelsInLibraryItem } from './labels'
import {
createLibraryItem,
findLibraryItemByUrl,
@ -81,8 +80,6 @@ export const saveEmail = async (
return updatedLibraryItem
}
const newsletterLabel = getInternalLabelWithColor('newsletter')
// start a transaction to create the library item and update the received email
const newLibraryItem = await createLibraryItem(
{
@ -123,11 +120,10 @@ export const saveEmail = async (
})
}
if (newsletterLabel) {
// add newsletter label
const labels = await findOrCreateLabels([newsletterLabel], input.userId)
await saveLabelsInLibraryItem(labels, newLibraryItem.id, input.userId)
}
// save newsletter label in the item
await createAndSaveLabelsInLibraryItem(newLibraryItem.id, input.userId, [
{ name: 'Newsletter' },
])
await updateReceivedEmail(input.receivedEmailId, 'article', input.userId)

View File

@ -3,7 +3,7 @@ import { User } from '../entity/user'
import { homePageURL } from '../env'
import { SaveErrorCode, SaveFileInput, SaveResult } from '../generated/graphql'
import { getStorageFileDetails } from '../utils/uploads'
import { findOrCreateLabels, saveLabelsInLibraryItem } from './labels'
import { createAndSaveLabelsInLibraryItem } from './labels'
import { updateLibraryItem } from './library_item'
import { findUploadFileById, setFileUploadComplete } from './upload_file'
@ -40,10 +40,11 @@ export const saveFile = async (
}
// add labels to item
if (input.labels) {
const labels = await findOrCreateLabels(input.labels, user.id)
await saveLabelsInLibraryItem(labels, input.clientRequestId, user.id)
}
await createAndSaveLabelsInLibraryItem(
input.clientRequestId,
user.id,
input.labels
)
return {
clientRequestId: input.clientRequestId,

View File

@ -28,7 +28,7 @@ import { parsePreparedContent } from '../utils/parser'
import { contentReaderForLibraryItem } from '../utils/uploads'
import { createPageSaveRequest } from './create_page_save_request'
import { createHighlight } from './highlights'
import { findOrCreateLabels, saveLabelsInLibraryItem } from './labels'
import { createAndSaveLabelsInLibraryItem } from './labels'
import { createLibraryItem, updateLibraryItem } from './library_item'
// where we can use APIs to fetch their underlying content.
@ -93,7 +93,7 @@ export const savePage = async (
itemType: parseResult.pageType,
originalHtml: parseResult.domContent,
canonicalUrl: parseResult.canonicalUrl,
saveTime: input.savedAt ? new Date(input.savedAt) : new Date(),
savedAt: input.savedAt ? new Date(input.savedAt) : new Date(),
publishedAt: input.publishedAt ? new Date(input.publishedAt) : undefined,
state: input.state || undefined,
rssFeedUrl: input.rssFeedUrl,
@ -160,11 +160,12 @@ export const savePage = async (
clientRequestId = newItem.id
}
// save labels in item
if (input.labels) {
const labels = await findOrCreateLabels(input.labels, user.id)
await saveLabelsInLibraryItem(labels, clientRequestId, user.id)
}
await createAndSaveLabelsInLibraryItem(
clientRequestId,
user.id,
input.labels,
input.rssFeedUrl
)
}
// we don't want to create thumbnail for imported pages
@ -214,7 +215,7 @@ export const parsedContentToLibraryItem = ({
itemType,
uploadFileHash,
uploadFileId,
saveTime,
savedAt,
publishedAt,
state,
rssFeedUrl,
@ -233,7 +234,7 @@ export const parsedContentToLibraryItem = ({
canonicalUrl?: string | null
uploadFileHash?: string | null
uploadFileId?: string | null
saveTime?: Date
savedAt?: Date
publishedAt?: Date | null
state?: ArticleSavingRequestStatus | null
rssFeedUrl?: string | null
@ -268,8 +269,7 @@ export const parsedContentToLibraryItem = ({
state: state
? (state as unknown as LibraryItemState)
: LibraryItemState.Succeeded,
createdAt: validatedDate(saveTime),
savedAt: validatedDate(saveTime),
savedAt: validatedDate(savedAt),
siteName: parsedContent?.siteName,
itemLanguage: parsedContent?.language,
siteIcon: parsedContent?.siteIcon,

View File

@ -237,6 +237,7 @@ export const enqueueParseRequest = async ({
savedAt,
publishedAt,
folder,
rssFeedUrl,
}: {
url: string
userId: string
@ -250,6 +251,7 @@ export const enqueueParseRequest = async ({
savedAt?: Date
publishedAt?: Date
folder?: string
rssFeedUrl?: string
}): Promise<string> => {
const { GOOGLE_CLOUD_PROJECT } = process.env
const payload = {
@ -263,6 +265,7 @@ export const enqueueParseRequest = async ({
savedAt,
publishedAt,
folder,
rssFeedUrl,
}
// If there is no Google Cloud Project Id exposed, it means that we are in local environment

View File

@ -411,15 +411,18 @@ async function fetchContent(req, res) {
}
if (contentType === 'application/pdf') {
const uploadedFileId = await uploadPdf(finalUrl, userId, articleSavingRequestId);
const uploadFileId = await uploadPdf(finalUrl, userId, articleSavingRequestId);
const uploadedPdf = await sendCreateArticleMutation(userId, {
url: encodeURI(finalUrl),
articleSavingRequestId,
uploadFileId: uploadedFileId,
uploadFileId,
state,
labels,
source,
folder,
rssFeedUrl,
savedAt,
publishedAt,
});
if (!uploadedPdf) {
statusCode = 500;