feat: Rename ocr-text asset type to text-content across the application

This commit is contained in:
2025-11-30 03:24:24 +01:00
parent 45bdc7ed8e
commit 6519345414
11 changed files with 42 additions and 38 deletions
@@ -0,0 +1,3 @@
UPDATE tenant.document_assets
SET asset_type = 'ocr-text'
WHERE asset_type = 'text-content';
@@ -0,0 +1,3 @@
UPDATE tenant.document_assets
SET asset_type = 'text-content'
WHERE asset_type = 'ocr-text';
+2 -2
View File
@@ -16,7 +16,7 @@ use super::{
index::IndexDocumentTask, index::IndexDocumentTask,
issued_at::DetermineIssuedAtTask, issued_at::DetermineIssuedAtTask,
job_execution_from_task_error, job_execution_from_task_error,
ocr::{GenerateOcrTask, OCR_TEXT_ASSET_TYPE}, ocr::{GenerateOcrTask, TEXT_CONTENT_ASSET_TYPE},
taskflow::{ taskflow::{
document::DocumentVersionTaskContext, BoxedTask, Task, TaskError, TaskExecutor, document::DocumentVersionTaskContext, BoxedTask, Task, TaskError, TaskExecutor,
TaskPlanner, TaskResult, TaskPlanner, TaskResult,
@@ -126,7 +126,7 @@ impl TaskPlanner<DocumentVersionTaskContext> for AnalyzePlanner {
tasks.push(Box::new(GenerateThumbnailsTask::new(self.force))); tasks.push(Box::new(GenerateThumbnailsTask::new(self.force)));
} }
let existing_ocr = ctx.asset(OCR_TEXT_ASSET_TYPE).await?.is_some(); let existing_ocr = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?.is_some();
let mut should_index = existing_ocr; let mut should_index = existing_ocr;
if document_supports_ocr(&document) { if document_supports_ocr(&document) {
+2 -2
View File
@@ -6,7 +6,7 @@ use reqwest::Client;
use crate::documents::search::{build_quickwit_ingest_record, quickwit_ingest}; use crate::documents::search::{build_quickwit_ingest_record, quickwit_ingest};
use super::{ use super::{
ocr::OCR_TEXT_ASSET_TYPE, ocr::TEXT_CONTENT_ASSET_TYPE,
taskflow::{document::DocumentVersionTaskContext, Task, TaskError, TaskResult}, taskflow::{document::DocumentVersionTaskContext, Task, TaskError, TaskResult},
}; };
@@ -45,7 +45,7 @@ impl Task<DocumentVersionTaskContext> for IndexDocumentTask {
.ok_or_else(|| TaskError::fail("tenant quickwit index not configured"))?; .ok_or_else(|| TaskError::fail("tenant quickwit index not configured"))?;
let asset = ctx let asset = ctx
.asset(OCR_TEXT_ASSET_TYPE) .asset(TEXT_CONTENT_ASSET_TYPE)
.await? .await?
.ok_or_else(|| TaskError::fail("missing OCR text asset"))?; .ok_or_else(|| TaskError::fail("missing OCR text asset"))?;
+3 -5
View File
@@ -12,7 +12,7 @@ use uuid::Uuid;
use crate::issued_at::{DateOrder, IssuedAtSettings}; use crate::issued_at::{DateOrder, IssuedAtSettings};
use crate::schema::documents::dsl as documents_dsl; use crate::schema::documents::dsl as documents_dsl;
use crate::workers::ocr::OCR_TEXT_ASSET_TYPE; use crate::workers::ocr::TEXT_CONTENT_ASSET_TYPE;
use crate::workers::taskflow::document::DocumentVersionTaskContext; use crate::workers::taskflow::document::DocumentVersionTaskContext;
use crate::workers::taskflow::{Task, TaskContext, TaskError, TaskResult}; use crate::workers::taskflow::{Task, TaskContext, TaskError, TaskResult};
@@ -427,10 +427,8 @@ fn month_name_to_number(value: &str, settings: &IssuedAtSettings) -> Option<u32>
async fn load_document_text(ctx: &mut DocumentVersionTaskContext) -> TaskResult<Option<String>> { async fn load_document_text(ctx: &mut DocumentVersionTaskContext) -> TaskResult<Option<String>> {
let object_key = { let object_key = {
let assets = ctx.assets().await?; let asset = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?;
assets asset.map(|a| a.asset.s3_key.clone())
.get(OCR_TEXT_ASSET_TYPE)
.map(|asset| asset.asset.s3_key.clone())
}; };
let Some(key) = object_key else { let Some(key) = object_key else {
+4 -4
View File
@@ -29,7 +29,7 @@ use super::taskflow::{
document::DocumentVersionTaskContext, Task, TaskContext, TaskError, TaskResult, document::DocumentVersionTaskContext, Task, TaskContext, TaskError, TaskResult,
}; };
pub const OCR_TEXT_ASSET_TYPE: &str = "ocr-text"; pub const TEXT_CONTENT_ASSET_TYPE: &str = "text-content";
const MIN_TEXT_LENGTH: usize = 50; const MIN_TEXT_LENGTH: usize = 50;
pub struct GenerateOcrTask { pub struct GenerateOcrTask {
@@ -83,7 +83,7 @@ impl Task<DocumentVersionTaskContext> for GenerateOcrTask {
let s3_key = document_asset_key( let s3_key = document_asset_key(
context.document.id, context.document.id,
context.version.version_number, context.version.version_number,
OCR_TEXT_ASSET_TYPE, TEXT_CONTENT_ASSET_TYPE,
asset_id, asset_id,
); );
@@ -129,7 +129,7 @@ async fn build_ocr_context(
) -> TaskResult<OcrContext> { ) -> TaskResult<OcrContext> {
let document = ctx.document().await?.clone(); let document = ctx.document().await?.clone();
let version = ctx.version().await?.clone(); let version = ctx.version().await?.clone();
let asset = ctx.asset(OCR_TEXT_ASSET_TYPE).await?; let asset = ctx.asset(TEXT_CONTENT_ASSET_TYPE).await?;
let existing_asset = asset.map(|asset| asset.asset.clone()); let existing_asset = asset.map(|asset| asset.asset.clone());
@@ -226,7 +226,7 @@ fn persist_ocr_metadata(
let new_asset = NewDocumentAsset { let new_asset = NewDocumentAsset {
id: asset_id, id: asset_id,
document_version_id, document_version_id,
asset_type: OCR_TEXT_ASSET_TYPE.to_string(), asset_type: TEXT_CONTENT_ASSET_TYPE.to_string(),
mime_type: "text/plain".to_string(), mime_type: "text/plain".to_string(),
metadata, metadata,
s3_key: s3_key.to_string(), s3_key: s3_key.to_string(),
+1 -1
View File
@@ -194,7 +194,7 @@ const DocumentInfoPanel: React.FC<DocumentInfoPanelProps> = ({
render: () => { render: () => {
const messageClass = `${base}__message`; const messageClass = `${base}__message`;
const errorClass = `${base}__message ${base}__message--error`; const errorClass = `${base}__message ${base}__message--error`;
const objectClass = `${base}__object ${base}__object--ocr-text`; const objectClass = `${base}__object ${base}__object--text-content`;
if (!contentEnabled || !contentConfig.loadContent) { if (!contentEnabled || !contentConfig.loadContent) {
return ( return (
+8 -8
View File
@@ -1,4 +1,4 @@
import { openOcrTextInNewTab } from '../utils/ocr'; import { openTextContentInNewTab } from '../utils/ocr';
import type { import type {
EnsureAssetUrl, EnsureAssetUrl,
EnsurePreviewData, EnsurePreviewData,
@@ -21,11 +21,11 @@ const resolveDocumentDownloadHref = (document?: Document | null): string | null
return downloadUrl; return downloadUrl;
}; };
const hasDocumentOcrAsset = (document?: Document | null, getDocumentAsset?: GetDocumentAsset | null): boolean => { const hasDocumentTextContentAsset = (document?: Document | null, getDocumentAsset?: GetDocumentAsset | null): boolean => {
if (!document || !getDocumentAsset) { if (!document || !getDocumentAsset) {
return false; return false;
} }
return Boolean(getDocumentAsset(document, 'ocr-text')); return Boolean(getDocumentAsset(document, 'text-content'));
}; };
interface CreateDocumentActionStateArgs { interface CreateDocumentActionStateArgs {
@@ -43,7 +43,7 @@ export const createDocumentActionState = ({
ensureAssetUrl, ensureAssetUrl,
getDocumentAsset, getDocumentAsset,
notifyApiError, notifyApiError,
ocrErrorMessage = 'Unable to open OCR text.', ocrErrorMessage = 'Unable to open text content.',
}: CreateDocumentActionStateArgs) => { }: CreateDocumentActionStateArgs) => {
if (!document) { if (!document) {
return { return {
@@ -54,19 +54,19 @@ export const createDocumentActionState = ({
} }
const downloadHref = resolveDocumentDownloadHref(document); const downloadHref = resolveDocumentDownloadHref(document);
const hasOcr = hasDocumentOcrAsset(document, getDocumentAsset); const hasOcr = hasDocumentTextContentAsset(document, getDocumentAsset);
const openOcr = hasOcr const openOcr = hasOcr
? async () => { ? async () => {
try { try {
const success = await openOcrTextInNewTab({ const success = await openTextContentInNewTab({
document, document,
ensurePreviewData, ensurePreviewData,
getDocumentAsset, getDocumentAsset,
ensureAssetUrl, ensureAssetUrl,
}); });
if (!success) { if (!success) {
notifyApiError?.(new Error('OCR text URL unavailable.'), ocrErrorMessage); notifyApiError?.(new Error('Text content URL unavailable.'), ocrErrorMessage);
} }
return success; return success;
} catch (error) { } catch (error) {
@@ -85,5 +85,5 @@ export const createDocumentActionState = ({
export const documentActionsTestExports = { export const documentActionsTestExports = {
resolveDocumentDownloadHref, resolveDocumentDownloadHref,
hasDocumentOcrAsset, hasDocumentTextContentAsset,
}; };
+8 -8
View File
@@ -135,7 +135,7 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
if (!document || !getDocumentAsset) { if (!document || !getDocumentAsset) {
return false; return false;
} }
return Boolean(getDocumentAsset(document, 'ocr-text')); return Boolean(getDocumentAsset(document, 'text-content'));
}, [document, getDocumentAsset]); }, [document, getDocumentAsset]);
const navigateToFolder = useCallback( const navigateToFolder = useCallback(
@@ -183,12 +183,12 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
} }
const updateUrl = () => const updateUrl = () =>
resolveDocumentAssetUrl(document, 'ocr-text', { resolveDocumentAssetUrl(document, 'text-content', {
ensureAssetUrl, ensureAssetUrl,
getAsset: getDocumentAsset, getAsset: getDocumentAsset,
}); });
const asset = getDocumentAsset(document, 'ocr-text'); const asset = getDocumentAsset(document, 'text-content');
let url = updateUrl(); let url = updateUrl();
if (!url && document.id && asset?.id && ensureAssetUrl) { if (!url && document.id && asset?.id && ensureAssetUrl) {
@@ -223,10 +223,10 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
id: 'content', id: 'content',
label: 'Content', label: 'Content',
loadContent: loadOcrContent, loadContent: loadOcrContent,
loadingMessage: 'Loading OCR content…', loadingMessage: 'Loading text content…',
emptyMessage: 'No OCR content available.', emptyMessage: 'No text content available.',
unavailableMessage: 'No OCR content available.', unavailableMessage: 'No text content available.',
errorMessage: 'Failed to load OCR content.', errorMessage: 'Failed to load text content.',
}), }),
[hasOcr, loadOcrContent], [hasOcr, loadOcrContent],
); );
@@ -282,7 +282,7 @@ const DocumentViewerPanel: React.FC<DocumentViewerPanelProps> = ({
ensureAssetUrl, ensureAssetUrl,
getDocumentAsset, getDocumentAsset,
notifyApiError, notifyApiError,
ocrErrorMessage: 'Unable to open OCR text.', ocrErrorMessage: 'Unable to open text content.',
}) })
: null, : null,
[ [
+1 -1
View File
@@ -357,7 +357,7 @@
height: 100%; height: 100%;
} }
.document-viewer__object--ocr-text { .document-viewer__object--text-content {
width: 100%; width: 100%;
height: 100%; height: 100%;
margin: 0; margin: 0;
+7 -7
View File
@@ -18,7 +18,7 @@ export type EnsureAssetUrl = (
) => Promise<AssetLike | null>; ) => Promise<AssetLike | null>;
export type GetDocumentAsset = AssetManagerGetAsset; export type GetDocumentAsset = AssetManagerGetAsset;
interface ResolveOcrTextUrlOptions { interface ResolveTextContentUrlOptions {
document: Document | null; document: Document | null;
ensurePreviewData?: EnsurePreviewData; ensurePreviewData?: EnsurePreviewData;
getDocumentAsset?: GetDocumentAsset; getDocumentAsset?: GetDocumentAsset;
@@ -29,15 +29,15 @@ const pickAsset = (doc?: Document | null, getDocumentAsset?: GetDocumentAsset):
if (!doc || !getDocumentAsset) { if (!doc || !getDocumentAsset) {
return null; return null;
} }
return getDocumentAsset(doc, 'ocr-text') || null; return getDocumentAsset(doc, 'text-content') || null;
}; };
export async function resolveOcrTextUrl({ export async function resolveTextContentUrl({
document, document,
ensurePreviewData, ensurePreviewData,
getDocumentAsset, getDocumentAsset,
ensureAssetUrl, ensureAssetUrl,
}: ResolveOcrTextUrlOptions): Promise<string | null> { }: ResolveTextContentUrlOptions): Promise<string | null> {
if (!document?.id) { if (!document?.id) {
return null; return null;
} }
@@ -75,7 +75,7 @@ export async function resolveOcrTextUrl({
} }
return ( return (
resolveDocumentAssetUrl(docRef, 'ocr-text', { resolveDocumentAssetUrl(docRef, 'text-content', {
ensureAssetUrl, ensureAssetUrl,
getAsset: getDocumentAsset, getAsset: getDocumentAsset,
ensureOptions: { force: true }, ensureOptions: { force: true },
@@ -83,7 +83,7 @@ export async function resolveOcrTextUrl({
); );
} }
export async function openOcrTextInNewTab(options: ResolveOcrTextUrlOptions): Promise<boolean> { export async function openTextContentInNewTab(options: ResolveTextContentUrlOptions): Promise<boolean> {
const popup = window.open('', '_blank'); const popup = window.open('', '_blank');
const popupAvailable = Boolean(popup); const popupAvailable = Boolean(popup);
@@ -96,7 +96,7 @@ export async function openOcrTextInNewTab(options: ResolveOcrTextUrlOptions): Pr
} }
try { try {
const url = await resolveOcrTextUrl(options); const url = await resolveTextContentUrl(options);
if (!url) { if (!url) {
if (popupAvailable) { if (popupAvailable) {
popup.close(); popup.close();