diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index b53a47ff2..11008c18b 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -38,6 +38,7 @@ import { countDailyServiceUsage, createServiceUsage, } from './services/service_usage' +import { batchGetUploadFilesByIds } from './services/upload_file' import { tracer } from './tracing' import { getClaimsByToken, setAuthInCookie } from './utils/auth' import { SetClaimsRole } from './utils/dictionary' @@ -110,6 +111,7 @@ const contextFunc: ContextFunction = async ({ recommendations: new DataLoader( batchGetRecommendationsFromLibraryItemIds ), + uploadFiles: new DataLoader(batchGetUploadFilesByIds), }, } diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index f9c10b516..b4ace7f7b 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -25,7 +25,6 @@ import { } from '../generated/graphql' import { getAISummary } from '../services/ai-summaries' import { findUserFeatures } from '../services/features' -import { findUploadFileById } from '../services/upload_file' import { highlightDataToHighlight, isBase64Image, @@ -407,7 +406,9 @@ export const functionResolvers = { ctx.claims && article.uploadFileId ) { - const upload = await findUploadFileById(article.uploadFileId) + const upload = await ctx.dataLoaders.uploadFiles.load( + article.uploadFileId + ) if (!upload || !upload.fileName) { return undefined } @@ -481,7 +482,7 @@ export const functionResolvers = { ctx.claims && item.uploadFileId ) { - const upload = await findUploadFileById(item.uploadFileId) + const upload = await ctx.dataLoaders.uploadFiles.load(item.uploadFileId) if (!upload || !upload.fileName) { return undefined } diff --git a/packages/api/src/resolvers/types.ts b/packages/api/src/resolvers/types.ts index 61ccf1d8d..f880a0145 100644 --- a/packages/api/src/resolvers/types.ts +++ b/packages/api/src/resolvers/types.ts @@ -9,6 +9,7 @@ import { ReadingProgressDataSource } from '../datasources/reading_progress_data_ import { Highlight } from '../entity/highlight' import { Label } from '../entity/label' import { Recommendation } from '../entity/recommendation' +import { UploadFile } from '../entity/upload_file' import { PubsubClient } from '../pubsub' export interface Claims { @@ -49,6 +50,7 @@ export interface RequestContext { labels: DataLoader highlights: DataLoader recommendations: DataLoader + uploadFiles: DataLoader } } diff --git a/packages/api/src/services/upload_file.ts b/packages/api/src/services/upload_file.ts index 148614352..fd96f313c 100644 --- a/packages/api/src/services/upload_file.ts +++ b/packages/api/src/services/upload_file.ts @@ -1,5 +1,7 @@ import normalizeUrl from 'normalize-url' import path from 'path' +import { In } from 'typeorm' +import { v4 as uuid } from 'uuid' import { LibraryItemState } from '../entity/library_item' import { UploadFile } from '../entity/upload_file' import { @@ -18,7 +20,16 @@ import { } from '../utils/uploads' import { validateUrl } from './create_page_save_request' import { createOrUpdateLibraryItem } from './library_item' -import { v4 as uuid } from 'uuid' + +export const batchGetUploadFilesByIds = async ( + ids: readonly string[] +): Promise<(UploadFile | undefined)[]> => { + const uploadFiles = await getRepository(UploadFile).findBy({ + id: In(ids as string[]), + }) + + return ids.map((id) => uploadFiles.find((uploadFile) => uploadFile.id === id)) +} const isFileUrl = (url: string): boolean => { const parsedUrl = new URL(url)