66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
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
|