73 lines
2.9 KiB
TypeScript
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 {}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|