text extraction improvements: editable text and source language hint
- Extracted text in the tag panel is now an editable textarea; a Save button appears when the content is dirty and persists edits to the DB - Source language input added next to Re-translate button; when filled, the translation prompt uses "translate from X to Y" for more accurate results - New updateExtractedText() helper and PATCH /api/ai-tagging/fields endpoint to support saving edited text - translateItemText/translateText accept optional sourceLanguage param Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
import { requireLibraryAccess } from '@/lib/auth'
|
||||
import { getAiFields } from '@/lib/ai-tagger'
|
||||
import { getAiFields, updateExtractedText } from '@/lib/ai-tagger'
|
||||
|
||||
export async function GET(request: NextRequest) {
|
||||
const { searchParams } = request.nextUrl
|
||||
@@ -17,3 +17,27 @@ export async function GET(request: NextRequest) {
|
||||
const fields = getAiFields(itemKey)
|
||||
return NextResponse.json(fields)
|
||||
}
|
||||
|
||||
export async function PATCH(request: NextRequest) {
|
||||
let body: { itemKey?: string; extractedText?: string }
|
||||
try {
|
||||
body = await request.json()
|
||||
} catch {
|
||||
return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 })
|
||||
}
|
||||
|
||||
const { itemKey, extractedText } = body
|
||||
if (!itemKey || typeof itemKey !== 'string') {
|
||||
return NextResponse.json({ error: 'itemKey is required' }, { status: 400 })
|
||||
}
|
||||
if (typeof extractedText !== 'string') {
|
||||
return NextResponse.json({ error: 'extractedText is required' }, { status: 400 })
|
||||
}
|
||||
|
||||
const libraryId = itemKey.split(':')[0]
|
||||
const auth = await requireLibraryAccess(request, libraryId)
|
||||
if (auth instanceof NextResponse) return auth
|
||||
|
||||
updateExtractedText(itemKey, extractedText)
|
||||
return NextResponse.json({ ok: true })
|
||||
}
|
||||
|
||||
@@ -3,14 +3,14 @@ import { requireLibraryAccess } from '@/lib/auth'
|
||||
import { translateItemText } from '@/lib/ai-tagger'
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
let body: { itemKey?: string }
|
||||
let body: { itemKey?: string; sourceLanguage?: string }
|
||||
try {
|
||||
body = await request.json()
|
||||
} catch {
|
||||
return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 })
|
||||
}
|
||||
|
||||
const { itemKey } = body
|
||||
const { itemKey, sourceLanguage } = body
|
||||
if (!itemKey || typeof itemKey !== 'string') {
|
||||
return NextResponse.json({ error: 'itemKey is required' }, { status: 400 })
|
||||
}
|
||||
@@ -20,7 +20,7 @@ export async function POST(request: NextRequest) {
|
||||
if (auth instanceof NextResponse) return auth
|
||||
|
||||
try {
|
||||
const translatedText = await translateItemText(itemKey)
|
||||
const translatedText = await translateItemText(itemKey, sourceLanguage || undefined)
|
||||
return NextResponse.json({ translatedText })
|
||||
} catch (err) {
|
||||
const error = err as Error & { code?: string }
|
||||
|
||||
Reference in New Issue
Block a user