Files
2025-09-09 00:15:08 +00:00

73 lines
2.9 KiB
TypeScript

export const runtime = 'nodejs'
import { NextResponse } from 'next/server'
import { PrismaClient } from '@/app/generated/prisma'
export async function GET(request: Request) {
const prisma = new PrismaClient()
try {
const { searchParams } = new URL(request.url)
const limitRaw = searchParams.get('limit')
let limit = Number(limitRaw ?? '10')
if (!Number.isFinite(limit) || limit <= 0) limit = 100
if (limit > 1000) limit = 1000
const rows = await prisma.content.findMany({
where: { handleId: null },
select: { id: true },
take: limit,
orderBy: { pubDate: 'desc' },
})
const ids = rows.map(r => r.id)
console.log(`[contents/handleupdate] fetched ${ids.length}/${limit} ids without handle`)
// Call local parsingServer with body { ids }
try {
const upstream = await fetch('http://localhost:9556/gethandle', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ids }),
})
const text = await upstream.text()
let forwarded: any = null
try { forwarded = text ? JSON.parse(text) : null } catch { forwarded = { message: text } }
// Map handles back to Content rows
let mapped = 0
const failures: Array<{ id: string, reason: string }> = []
if (forwarded?.success && Array.isArray(forwarded?.items)) {
for (const item of forwarded.items as Array<{ id?: string, handle?: string, avatar?: string }>) {
const cid = String(item?.id ?? '')
let h = String(item?.handle ?? '').trim()
const avatar = typeof item?.avatar === 'string' ? item.avatar : undefined
if (!cid || !h) { if (cid) failures.push({ id: cid, reason: 'missing_handle' }); continue }
try {
const handleRow = await prisma.handle.upsert({
where: { handle: h },
update: { ...(avatar ? { avatar } : {}) },
create: { handle: h, ...(avatar ? { avatar } : {}) },
select: { id: true }
})
await prisma.content.update({
where: { id: cid },
data: { handle: { connect: { id: handleRow.id } } },
})
mapped += 1
} catch (e) {
failures.push({ id: cid, reason: 'db_update_failed' })
console.error('[contents/handleupdate] map failed for', cid, e)
}
}
}
return NextResponse.json({ success: true, count: ids.length, ids, mapped, failures, upstream: forwarded }, { status: upstream.status })
} catch (e) {
console.error('[contents/handleupdate] upstream call error:', e)
return NextResponse.json({ success: true, count: ids.length, ids, upstream: { error: 'upstream failed' } })
}
} catch (e) {
console.error('[contents/handleupdate] query error:', e)
return NextResponse.json({ error: 'query failed' }, { status: 500 })
} finally {
try { await (prisma as any).$disconnect() } catch {}
}
}