diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 135e5e845..54ae987c5 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -261,7 +261,7 @@ export const createArticleResolver = authorized< FORCE_PUPPETEER_URLS.some((regex) => regex.test(url)) ) { await createPageSaveRequest({ - userId: uid, + user: userData, url, state: state || undefined, labels: inputLabels || undefined, @@ -286,7 +286,7 @@ export const createArticleResolver = authorized< // We have a URL but no document, so we try to send this to puppeteer // and return a dummy response. await createPageSaveRequest({ - userId: uid, + user: userData, url, state: state || undefined, labels: inputLabels || undefined, @@ -977,7 +977,7 @@ export const moveToFolderResolver = authorized< if (item.state === LibraryItemState.ContentNotFetched) { try { await createPageSaveRequest({ - userId: uid, + user: item.user, url: item.originalUrl, articleSavingRequestId: id, priority: 'high', @@ -1013,7 +1013,14 @@ export const fetchContentResolver = authorized< }, }) - const item = await findLibraryItemById(id, uid) + const item = await authTrx((tx) => + tx.getRepository(LibraryItem).findOne({ + where: { + id, + }, + relations: ['user'], + }) + ) if (!item) { return { errorCodes: [FetchContentErrorCode.Unauthorized], @@ -1024,7 +1031,7 @@ export const fetchContentResolver = authorized< if (item.state === LibraryItemState.ContentNotFetched) { try { await createPageSaveRequest({ - userId: uid, + user: item.user, url: item.originalUrl, articleSavingRequestId: id, priority: 'high', diff --git a/packages/api/src/resolvers/article_saving_request/index.ts b/packages/api/src/resolvers/article_saving_request/index.ts index 9f4cf7c4a..b42171f6f 100644 --- a/packages/api/src/resolvers/article_saving_request/index.ts +++ b/packages/api/src/resolvers/article_saving_request/index.ts @@ -42,9 +42,14 @@ export const createArticleSavingRequestResolver = authorized< }, }) + const user = await userRepository.findById(uid) + if (!user) { + return { errorCodes: [CreateArticleSavingRequestErrorCode.Unauthorized] } + } + try { const articleSavingRequest = await createPageSaveRequest({ - userId: uid, + user, url, pubsub, }) diff --git a/packages/api/src/routers/article_router.ts b/packages/api/src/routers/article_router.ts index efceb02ef..6b3bab37f 100644 --- a/packages/api/src/routers/article_router.ts +++ b/packages/api/src/routers/article_router.ts @@ -7,6 +7,7 @@ import * as jwt from 'jsonwebtoken' import { Speech } from '../entity/speech' import { env } from '../env' import { CreateArticleErrorCode } from '../generated/graphql' +import { userRepository } from '../repository/user' import { Claims } from '../resolvers/types' import { createPageSaveRequest } from '../services/create_page_save_request' import { findLibraryItemById } from '../services/library_item' @@ -32,6 +33,9 @@ export function articleRouter() { const { url } = req.body as { url?: string } + if (!url) { + return res.status(400).send({ errorCode: 'BAD_DATA' }) + } const token = req?.cookies?.auth || req?.headers?.authorization const claims = await getClaimsByToken(token) @@ -40,20 +44,12 @@ export function articleRouter() { } const { uid } = claims - - logger.info('Article saving request', { - body: req.body, - labels: { - source: 'SaveEndpoint', - userId: uid, - }, - }) - - if (!url) { - return res.status(400).send({ errorCode: 'BAD_DATA' }) + const user = await userRepository.findById(uid) + if (!user) { + return res.status(400).send('Bad Request') } - const result = await createPageSaveRequest({ userId: uid, url }) + const result = await createPageSaveRequest({ user, url }) if (isSiteBlockedForParse(url)) { return res diff --git a/packages/api/src/routers/svc/links.ts b/packages/api/src/routers/svc/links.ts index 05d69225d..f247b6ffa 100644 --- a/packages/api/src/routers/svc/links.ts +++ b/packages/api/src/routers/svc/links.ts @@ -5,6 +5,7 @@ import express from 'express' import { LessThan } from 'typeorm' import { LibraryItemState } from '../../entity/library_item' import { readPushSubscription } from '../../pubsub' +import { userRepository } from '../../repository/user' import { createPageSaveRequest } from '../../services/create_page_save_request' import { deleteLibraryItemsByAdmin } from '../../services/library_item' import { logger } from '../../utils/logger' @@ -65,9 +66,14 @@ export function linkServiceRouter() { } const msg = data as CreateLinkRequestMessage + const user = await userRepository.findById(msg.userId) + if (!user) { + return res.status(400).send('Bad Request') + } + try { const request = await createPageSaveRequest({ - userId: msg.userId, + user, url: msg.url, }) diff --git a/packages/api/src/services/create_page_save_request.ts b/packages/api/src/services/create_page_save_request.ts index 733559109..403ccf3f0 100644 --- a/packages/api/src/services/create_page_save_request.ts +++ b/packages/api/src/services/create_page_save_request.ts @@ -1,5 +1,6 @@ import * as privateIpLib from 'private-ip' import { LibraryItemState } from '../entity/library_item' +import { User } from '../entity/user' import { ArticleSavingRequest, ArticleSavingRequestStatus, @@ -8,7 +9,6 @@ import { PageType, } from '../generated/graphql' import { createPubSubClient, PubsubClient } from '../pubsub' -import { userRepository } from '../repository/user' import { enqueueParseRequest } from '../utils/createTask' import { cleanUrl, @@ -19,7 +19,7 @@ import { logger } from '../utils/logger' import { countByCreatedAt, createOrUpdateLibraryItem } from './library_item' interface PageSaveRequest { - userId: string + user: User url: string pubsub?: PubsubClient articleSavingRequestId?: string @@ -75,7 +75,7 @@ export const validateUrl = (url: string): URL => { } export const createPageSaveRequest = async ({ - userId, + user, url, pubsub = createPubSubClient(), articleSavingRequestId, @@ -97,15 +97,8 @@ export const createPageSaveRequest = async ({ errorCode: CreateArticleSavingRequestErrorCode.BadData, }) } - // if user is not specified, get it from the database - const user = await userRepository.findById(userId) - if (!user) { - logger.info(`User not found: ${userId}`) - return Promise.reject({ - errorCode: CreateArticleSavingRequestErrorCode.BadData, - }) - } + const userId = user.id url = cleanUrl(url) // create processing item diff --git a/packages/api/src/services/save_page.ts b/packages/api/src/services/save_page.ts index a01f20ec3..d8e28a43c 100644 --- a/packages/api/src/services/save_page.ts +++ b/packages/api/src/services/save_page.ts @@ -100,7 +100,7 @@ export const savePage = async ( if (shouldParseInBackend(input)) { try { await createPageSaveRequest({ - userId: user.id, + user, url: itemToSave.originalUrl, articleSavingRequestId: clientRequestId || undefined, state: input.state || undefined, diff --git a/packages/api/src/services/save_url.ts b/packages/api/src/services/save_url.ts index 806db0e53..04089e0ea 100644 --- a/packages/api/src/services/save_url.ts +++ b/packages/api/src/services/save_url.ts @@ -12,7 +12,7 @@ export const saveUrl = async ( try { const pageSaveRequest = await createPageSaveRequest({ ...input, - userId: user.id, + user, articleSavingRequestId: input.clientRequestId, state: input.state || undefined, labels: input.labels || undefined,