81 lines
2.7 KiB
Python
Raw Normal View History

2025-04-03 22:11:20 +08:00
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
)