const API = require('../../../../lib/API.js') const { BaseStdResponse } = require('../../../../BaseStdResponse.js') const AccessControl = require('../../../../lib/AccessControl.js') const db = require('../../../../plugin/DataBase/db.js') const { summarizeLogRow, extractEgressIp } = require('../../../../lib/Lepao/lepaoProxyLogDisplay') const { lookupIpv4Region } = require('../../../../lib/Lepao/ipRegionLookup') class AdminLepaoProxyLogs extends API { constructor() { super() this.setPath('/Admin/Lepao/Proxy/Logs') this.setMethod('GET') } async onRequest(req, res) { const { uuid, session, pagesize, current } = req.query if ([uuid, session, pagesize, current].some(v => v === '' || v == null)) return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) if (isNaN(pagesize) || Number(pagesize) <= 0 || isNaN(current) || Number(current) <= 0) return res.json({ ...BaseStdResponse.ERR, msg: '参数错误' }) if (!await AccessControl.checkSession(uuid, session)) return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED }) const permission = await AccessControl.getPermission(uuid) if (!permission.includes('admin') && !permission.includes('service')) return res.json({ ...BaseStdResponse.PERMISSION_DENIED }) const lim = Math.min(200, Math.max(1, Math.floor(Number(pagesize)))) const off = Math.max(0, (Math.floor(Number(current)) - 1) * lim) try { const countRows = await db.query(`SELECT COUNT(*) AS total FROM lepao_proxy_log`) const rows = await db.query( `SELECT id, created_at, event, server, deadline, detail FROM lepao_proxy_log ORDER BY id DESC LIMIT ${lim} OFFSET ${off}` ) const total = Number(countRows?.[0]?.total || 0) const regionCache = {} async function regionForEgress(ip) { if (!ip) return null if (!regionCache[ip]) regionCache[ip] = await lookupIpv4Region(ip) return regionCache[ip] } const data = [] for (const r of rows || []) { const display = summarizeLogRow(r) const egressIp = extractEgressIp(r) const egressRegion = await regionForEgress(egressIp) data.push({ id: r.id, created_at: r.created_at, event: r.event, server: r.server, deadline: r.deadline, egress_ip: egressIp, egress_region: egressRegion, event_label: display.event_label, event_color: display.event_color, summary: display.summary, detail_lines: display.detail_lines }) } return res.json({ ...BaseStdResponse.OK, data, pagination: { current: Number(current), pagesize: lim, total } }) } catch (e) { this.logger?.error?.(`AdminLepaoProxyLogs: ${e.stack || e}`) return res.json({ ...BaseStdResponse.ERR, msg: '查询日志失败' }) } } } module.exports.AdminLepaoProxyLogs = AdminLepaoProxyLogs