Merge pull request #3184 from omnivore-app/fix/pdf-in-rss
fix feed url in pdf file not saved
This commit is contained in:
@ -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>;
|
||||
|
||||
@ -232,6 +232,9 @@ input CreateArticleInput {
|
||||
folder: String
|
||||
labels: [CreateLabelInput!]
|
||||
preparedDocument: PreparedDocumentInput
|
||||
publishedAt: Date
|
||||
rssFeedUrl: String
|
||||
savedAt: Date
|
||||
skipParsing: Boolean
|
||||
source: String
|
||||
state: ArticleSavingRequestStatus
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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
|
||||
)
|
||||
|
||||
@ -497,6 +497,9 @@ const schema = gql`
|
||||
state: ArticleSavingRequestStatus
|
||||
labels: [CreateLabelInput!]
|
||||
folder: String
|
||||
rssFeedUrl: String
|
||||
savedAt: Date
|
||||
publishedAt: Date
|
||||
}
|
||||
enum CreateArticleErrorCode {
|
||||
UNABLE_TO_FETCH
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user