scraper/routes/scraper.js

66 lines
1.6 KiB
JavaScript
Raw Normal View History

2026-04-21 20:21:04 +08:00
import { Router } from 'express'
import { scraperMap, scraperList } from '../scrapers/index.js'
const router = Router()
// GET /api/scraper?site=kompas&q=keyword&limit=10
router.get('/', async (req, res) => {
const { site, q, limit = 10 } = req.query
if (!site) {
return res.json({
status : false,
error : "Parameter 'site' wajib diisi",
available: scraperList
})
}
if (!q) {
return res.json({ status: false, error: "Parameter 'q' (keyword) wajib diisi" })
}
const fn = scraperMap[site.toLowerCase()]
if (!fn) {
return res.json({
status : false,
error : `Scraper '${site}' tidak ditemukan`,
available: scraperList
})
}
const result = await fn(q, parseInt(limit))
res.json(result)
})
// GET /api/scraper/list — daftar semua scraper
router.get('/list', (_, res) => {
res.json({ status: true, scrapers: scraperList })
})
// GET /api/scraper/all?q=keyword&limit=5 — jalanin semua scraper sekaligus
router.get('/all', async (req, res) => {
const { q, limit = 5 } = req.query
if (!q) return res.json({ status: false, error: "Parameter 'q' wajib diisi" })
const results = await Promise.allSettled(
scraperList.map(site => scraperMap[site](q, parseInt(limit)))
)
const data = results.map((r, i) =>
r.status === 'fulfilled'
? r.value
: { status: false, source: scraperList[i], error: r.reason?.message }
)
const merged = data.flatMap(r => r.data ?? [])
res.json({
status : true,
total : merged.length,
sources : data.map(r => ({ source: r.source, total: r.total ?? 0, ok: r.status })),
data : merged
})
})
export default router