feat: fetch content for rss feed items in following folder

This commit is contained in:
Hongbo Wu 2023-11-23 18:03:25 +08:00
parent 750b59cb8d
commit fd781644f1
11 changed files with 61 additions and 26 deletions

View file

@ -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']>;

View file

@ -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

View file

@ -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', {

View file

@ -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

View file

@ -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)

View file

@ -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 {

View file

@ -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,
}

View file

@ -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 {

View file

@ -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

View file

@ -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';

View file

@ -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 {