mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
feat: fetch content for rss feed items in following folder
This commit is contained in:
parent
750b59cb8d
commit
fd781644f1
11 changed files with 61 additions and 26 deletions
|
|
@ -271,6 +271,7 @@ export enum CreateArticleErrorCode {
|
|||
|
||||
export type CreateArticleInput = {
|
||||
articleSavingRequestId?: InputMaybe<Scalars['ID']>;
|
||||
folder?: InputMaybe<Scalars['String']>;
|
||||
labels?: InputMaybe<Array<CreateLabelInput>>;
|
||||
preparedDocument?: InputMaybe<PreparedDocumentInput>;
|
||||
skipParsing?: InputMaybe<Scalars['Boolean']>;
|
||||
|
|
@ -2205,6 +2206,7 @@ export enum SaveErrorCode {
|
|||
|
||||
export type SaveFileInput = {
|
||||
clientRequestId: Scalars['ID'];
|
||||
folder?: InputMaybe<Scalars['String']>;
|
||||
labels?: InputMaybe<Array<CreateLabelInput>>;
|
||||
source: Scalars['String'];
|
||||
state?: InputMaybe<ArticleSavingRequestStatus>;
|
||||
|
|
@ -2240,6 +2242,7 @@ export type SaveFilterSuccess = {
|
|||
|
||||
export type SavePageInput = {
|
||||
clientRequestId: Scalars['ID'];
|
||||
folder?: InputMaybe<Scalars['String']>;
|
||||
labels?: InputMaybe<Array<CreateLabelInput>>;
|
||||
originalContent: Scalars['String'];
|
||||
parseResult?: InputMaybe<ParseResult>;
|
||||
|
|
@ -2262,6 +2265,7 @@ export type SaveSuccess = {
|
|||
|
||||
export type SaveUrlInput = {
|
||||
clientRequestId: Scalars['ID'];
|
||||
folder?: InputMaybe<Scalars['String']>;
|
||||
labels?: InputMaybe<Array<CreateLabelInput>>;
|
||||
locale?: InputMaybe<Scalars['String']>;
|
||||
publishedAt?: InputMaybe<Scalars['Date']>;
|
||||
|
|
|
|||
|
|
@ -228,6 +228,7 @@ enum CreateArticleErrorCode {
|
|||
|
||||
input CreateArticleInput {
|
||||
articleSavingRequestId: ID
|
||||
folder: String
|
||||
labels: [CreateLabelInput!]
|
||||
preparedDocument: PreparedDocumentInput
|
||||
skipParsing: Boolean
|
||||
|
|
@ -1665,6 +1666,7 @@ enum SaveErrorCode {
|
|||
|
||||
input SaveFileInput {
|
||||
clientRequestId: ID!
|
||||
folder: String
|
||||
labels: [CreateLabelInput!]
|
||||
source: String!
|
||||
state: ArticleSavingRequestStatus
|
||||
|
|
@ -1698,6 +1700,7 @@ type SaveFilterSuccess {
|
|||
|
||||
input SavePageInput {
|
||||
clientRequestId: ID!
|
||||
folder: String
|
||||
labels: [CreateLabelInput!]
|
||||
originalContent: String!
|
||||
parseResult: ParseResult
|
||||
|
|
@ -1719,6 +1722,7 @@ type SaveSuccess {
|
|||
|
||||
input SaveUrlInput {
|
||||
clientRequestId: ID!
|
||||
folder: String
|
||||
labels: [CreateLabelInput!]
|
||||
locale: String
|
||||
publishedAt: Date
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ export const createArticleResolver = authorized<
|
|||
source,
|
||||
state,
|
||||
labels: inputLabels,
|
||||
folder,
|
||||
},
|
||||
},
|
||||
{ log, uid, pubsub }
|
||||
|
|
@ -250,6 +251,7 @@ export const createArticleResolver = authorized<
|
|||
url,
|
||||
state: state || undefined,
|
||||
labels: inputLabels || undefined,
|
||||
folder: folder || undefined,
|
||||
})
|
||||
return DUMMY_RESPONSE
|
||||
} else if (!skipParsing && preparedDocument?.document) {
|
||||
|
|
@ -271,6 +273,7 @@ export const createArticleResolver = authorized<
|
|||
url,
|
||||
state: state || undefined,
|
||||
labels: inputLabels || undefined,
|
||||
folder: folder || undefined,
|
||||
})
|
||||
return DUMMY_RESPONSE
|
||||
}
|
||||
|
|
@ -290,6 +293,7 @@ export const createArticleResolver = authorized<
|
|||
canonicalUrl,
|
||||
uploadFileId,
|
||||
state,
|
||||
folder,
|
||||
})
|
||||
|
||||
log.info('New article saving', {
|
||||
|
|
|
|||
|
|
@ -496,6 +496,7 @@ const schema = gql`
|
|||
source: String
|
||||
state: ArticleSavingRequestStatus
|
||||
labels: [CreateLabelInput!]
|
||||
folder: String
|
||||
}
|
||||
enum CreateArticleErrorCode {
|
||||
UNABLE_TO_FETCH
|
||||
|
|
@ -540,6 +541,7 @@ const schema = gql`
|
|||
uploadFileId: ID!
|
||||
state: ArticleSavingRequestStatus
|
||||
labels: [CreateLabelInput!]
|
||||
folder: String
|
||||
}
|
||||
|
||||
input ParseResult {
|
||||
|
|
@ -569,6 +571,7 @@ const schema = gql`
|
|||
rssFeedUrl: String
|
||||
savedAt: Date
|
||||
publishedAt: Date
|
||||
folder: String
|
||||
}
|
||||
|
||||
input SaveUrlInput {
|
||||
|
|
@ -581,6 +584,7 @@ const schema = gql`
|
|||
timezone: String
|
||||
savedAt: Date
|
||||
publishedAt: Date
|
||||
folder: String
|
||||
}
|
||||
|
||||
union SaveResult = SaveSuccess | SaveError
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ interface PageSaveRequest {
|
|||
timezone?: string
|
||||
savedAt?: Date
|
||||
publishedAt?: Date
|
||||
folder?: string
|
||||
}
|
||||
|
||||
const SAVING_CONTENT = 'Your link is being saved...'
|
||||
|
|
@ -89,6 +90,7 @@ export const createPageSaveRequest = async ({
|
|||
timezone,
|
||||
savedAt,
|
||||
publishedAt,
|
||||
folder,
|
||||
}: PageSaveRequest): Promise<ArticleSavingRequest> => {
|
||||
try {
|
||||
validateUrl(url)
|
||||
|
|
@ -125,6 +127,7 @@ export const createPageSaveRequest = async ({
|
|||
originalUrl: url,
|
||||
state: LibraryItemState.Processing,
|
||||
publishedAt,
|
||||
folder,
|
||||
},
|
||||
userId,
|
||||
pubsub
|
||||
|
|
@ -157,6 +160,7 @@ export const createPageSaveRequest = async ({
|
|||
timezone,
|
||||
savedAt,
|
||||
publishedAt,
|
||||
folder,
|
||||
})
|
||||
|
||||
return libraryItemToArticleSavingRequest(user, libraryItem)
|
||||
|
|
|
|||
|
|
@ -1,12 +1,7 @@
|
|||
import { LibraryItemState } from '../entity/library_item'
|
||||
import { User } from '../entity/user'
|
||||
import { homePageURL } from '../env'
|
||||
import {
|
||||
ArticleSavingRequestStatus,
|
||||
SaveErrorCode,
|
||||
SaveFileInput,
|
||||
SaveResult,
|
||||
} from '../generated/graphql'
|
||||
import { SaveErrorCode, SaveFileInput, SaveResult } from '../generated/graphql'
|
||||
import { getStorageFileDetails } from '../utils/uploads'
|
||||
import { findOrCreateLabels, saveLabelsInLibraryItem } from './labels'
|
||||
import { updateLibraryItem } from './library_item'
|
||||
|
|
@ -33,23 +28,21 @@ export const saveFile = async (
|
|||
}
|
||||
}
|
||||
|
||||
if (input.state || input.labels) {
|
||||
if (input.state || input.folder) {
|
||||
await updateLibraryItem(
|
||||
input.clientRequestId,
|
||||
{
|
||||
state: LibraryItemState.Succeeded,
|
||||
folder:
|
||||
input.state === ArticleSavingRequestStatus.Archived
|
||||
? 'archive'
|
||||
: 'inbox',
|
||||
state: (input.state as unknown as LibraryItemState) || undefined,
|
||||
folder: input.folder || undefined,
|
||||
},
|
||||
user.id
|
||||
)
|
||||
// add labels to item
|
||||
if (input.labels) {
|
||||
const labels = await findOrCreateLabels(input.labels, user.id)
|
||||
await saveLabelsInLibraryItem(labels, input.clientRequestId, user.id)
|
||||
}
|
||||
}
|
||||
|
||||
// add labels to item
|
||||
if (input.labels) {
|
||||
const labels = await findOrCreateLabels(input.labels, user.id)
|
||||
await saveLabelsInLibraryItem(labels, input.clientRequestId, user.id)
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ export const savePage = async (
|
|||
publishedAt: input.publishedAt ? new Date(input.publishedAt) : undefined,
|
||||
state: input.state || undefined,
|
||||
rssFeedUrl: input.rssFeedUrl,
|
||||
folder: input.folder,
|
||||
})
|
||||
const isImported =
|
||||
input.source === 'csv-importer' || input.source === 'pocket'
|
||||
|
|
@ -110,6 +111,7 @@ export const savePage = async (
|
|||
articleSavingRequestId: clientRequestId || undefined,
|
||||
state: input.state || undefined,
|
||||
labels: input.labels || undefined,
|
||||
folder: input.folder || undefined,
|
||||
})
|
||||
} catch (e) {
|
||||
return {
|
||||
|
|
@ -216,6 +218,7 @@ export const parsedContentToLibraryItem = ({
|
|||
publishedAt,
|
||||
state,
|
||||
rssFeedUrl,
|
||||
folder,
|
||||
}: {
|
||||
url: string
|
||||
userId: string
|
||||
|
|
@ -234,6 +237,7 @@ export const parsedContentToLibraryItem = ({
|
|||
publishedAt?: Date | null
|
||||
state?: ArticleSavingRequestStatus | null
|
||||
rssFeedUrl?: string | null
|
||||
folder?: string | null
|
||||
}): DeepPartial<LibraryItem> & { originalUrl: string } => {
|
||||
return {
|
||||
id: itemId || undefined,
|
||||
|
|
@ -272,7 +276,7 @@ export const parsedContentToLibraryItem = ({
|
|||
wordCount: wordsCount(parsedContent?.textContent || ''),
|
||||
contentReader: contentReaderForLibraryItem(itemType, uploadFileId),
|
||||
subscription: rssFeedUrl,
|
||||
folder: 'inbox',
|
||||
folder: folder || 'inbox',
|
||||
archivedAt:
|
||||
state === ArticleSavingRequestStatus.Archived ? new Date() : null,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ export const saveUrl = async (
|
|||
timezone: input.timezone || undefined,
|
||||
savedAt: input.savedAt ? new Date(input.savedAt) : undefined,
|
||||
publishedAt: input.publishedAt ? new Date(input.publishedAt) : undefined,
|
||||
folder: input.folder || undefined,
|
||||
})
|
||||
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@ export const enqueueParseRequest = async ({
|
|||
timezone,
|
||||
savedAt,
|
||||
publishedAt,
|
||||
folder,
|
||||
}: {
|
||||
url: string
|
||||
userId: string
|
||||
|
|
@ -244,6 +245,7 @@ export const enqueueParseRequest = async ({
|
|||
timezone?: string
|
||||
savedAt?: Date
|
||||
publishedAt?: Date
|
||||
folder?: string
|
||||
}): Promise<string> => {
|
||||
const { GOOGLE_CLOUD_PROJECT } = process.env
|
||||
const payload = {
|
||||
|
|
@ -256,6 +258,7 @@ export const enqueueParseRequest = async ({
|
|||
timezone,
|
||||
savedAt,
|
||||
publishedAt,
|
||||
folder,
|
||||
}
|
||||
|
||||
// If there is no Google Cloud Project Id exposed, it means that we are in local environment
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ const sendCreateArticleMutation = async (userId, input) => {
|
|||
}
|
||||
}`,
|
||||
variables: {
|
||||
input: Object.assign({}, input , { source: 'puppeteer-parse' }),
|
||||
input,
|
||||
},
|
||||
});
|
||||
|
||||
|
|
@ -308,6 +308,10 @@ const saveUploadedPdf = async (userId, url, uploadFileId, articleSavingRequestId
|
|||
url: encodeURI(url),
|
||||
articleSavingRequestId,
|
||||
uploadFileId: uploadFileId,
|
||||
state,
|
||||
labels,
|
||||
source,
|
||||
folder,
|
||||
},
|
||||
);
|
||||
};
|
||||
|
|
@ -349,6 +353,7 @@ async function fetchContent(req, res) {
|
|||
const rssFeedUrl = req.body.rssFeedUrl;
|
||||
const savedAt = req.body.savedAt;
|
||||
const publishedAt = req.body.publishedAt;
|
||||
const folder = req.body.folder;
|
||||
|
||||
let logRecord = {
|
||||
url: urlStr,
|
||||
|
|
@ -365,6 +370,7 @@ async function fetchContent(req, res) {
|
|||
rssFeedUrl,
|
||||
savedAt,
|
||||
publishedAt,
|
||||
folder,
|
||||
};
|
||||
|
||||
console.info(`Article parsing request`, logRecord);
|
||||
|
|
@ -406,7 +412,15 @@ async function fetchContent(req, res) {
|
|||
|
||||
if (contentType === 'application/pdf') {
|
||||
const uploadedFileId = await uploadPdf(finalUrl, userId, articleSavingRequestId);
|
||||
const uploadedPdf = await saveUploadedPdf(userId, finalUrl, uploadedFileId, articleSavingRequestId);
|
||||
const uploadedPdf = await sendCreateArticleMutation(userId, {
|
||||
url: encodeURI(finalUrl),
|
||||
articleSavingRequestId,
|
||||
uploadFileId: uploadedFileId,
|
||||
state,
|
||||
labels,
|
||||
source,
|
||||
folder,
|
||||
});
|
||||
if (!uploadedPdf) {
|
||||
statusCode = 500;
|
||||
logRecord.error = 'error while saving uploaded pdf';
|
||||
|
|
@ -474,6 +488,7 @@ async function fetchContent(req, res) {
|
|||
savedAt,
|
||||
publishedAt,
|
||||
source,
|
||||
folder,
|
||||
});
|
||||
if (!apiResponse) {
|
||||
logRecord.error = 'error while saving page';
|
||||
|
|
|
|||
|
|
@ -157,17 +157,15 @@ const createTask = async (
|
|||
item: RssFeedItem,
|
||||
autoAddToLibrary: boolean
|
||||
) => {
|
||||
if (autoAddToLibrary) {
|
||||
return createSavingItemTask(userId, feedUrl, item)
|
||||
}
|
||||
|
||||
return createFollowingTask(userId, feedUrl, item)
|
||||
const folder = autoAddToLibrary ? 'inbox' : 'following'
|
||||
return createSavingItemTask(userId, feedUrl, item, folder)
|
||||
}
|
||||
|
||||
const createSavingItemTask = async (
|
||||
userId: string,
|
||||
feedUrl: string,
|
||||
item: RssFeedItem
|
||||
item: RssFeedItem,
|
||||
folder: string
|
||||
) => {
|
||||
const input = {
|
||||
userId,
|
||||
|
|
@ -178,6 +176,7 @@ const createSavingItemTask = async (
|
|||
rssFeedUrl: feedUrl,
|
||||
savedAt: item.isoDate,
|
||||
publishedAt: item.isoDate,
|
||||
folder,
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
|
|||
Loading…
Reference in a new issue