from typing import Annotated from fastapi import APIRouter, Query from app.web.request.report_request import AddUrlsRequest, CollectEvidenceRequest, ReportRequest, GetUrlListRequest from app.web.service.domain_service import DomainService from app.web.service.report_service import ReportURLService router = APIRouter(prefix="/api/urls", tags=["URL管理"]) @router.get("/v1/list") async def get_all_urls(request: Annotated[GetUrlListRequest, Query()]): """获取所有的URL,支持根据域名、状态进行过滤,不传则返回全部数据,支持分页""" return ReportURLService.get_list( request.domain, request.surl, request.is_report_by_one, request.is_report_by_site, request.is_report_by_wap, request.has_evidence, request.page, request.size ) @router.post("/v1/add") async def add_urls(request: AddUrlsRequest): """ 手动添加 URL 到域名中,支持批量添加 格式 [ {"domain": "", "surl": ""}, {"domain": "", "surl": ""} ... ] 添加之前先检查 domain 有没有,没有的话就去创建一个 domain """ # 把所有的域名列表解出来,看看有没有不存在的,如果有就新建一个域名 # 这里还需要获取域名的 id input_domains = [item.domain for item in request.urls] result = DomainService.get_by_domains(input_domains) if not result.success: return result # 创建新域名 new_domains = [x for x in input_domains if x not in result.data] if new_domains: result = DomainService.add_domains(1440, True, new_domains) if not result.success: return result # 再获取一遍域名模型 result = DomainService.get_by_domains(input_domains) if not result.success: return result # 创建 URL domain_map: dict[str, int] = {x.domain: x.id for x in result.data} return ReportURLService.add_urls(domain_map, request.urls) @router.post("/v1/evidence") async def collect_evidence(request: CollectEvidenceRequest): """ 强制手动触发证据收集任务,支持批量传入,已经收集过的 URL 也要强制收集 TODO:本来应该需要使用任务队列的,为了简单先把数据库的相关标记改为 0 ,也能达到一样的效果 又不是不能用 XD """ return ReportURLService.batch_update_evidence_flag(request.ids) @router.post("/v1/report") async def report(request: ReportRequest): """举报指定的URL,支持批量传入 id 批量举报 先通过改数据库,然后等引擎自己调度实现 """ return ReportURLService.batch_update_report_flag( request.ids, request.report_by_one, request.report_by_site, request.report_by_wap )