86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
from typing import Annotated
|
||
|
||
from fastapi import APIRouter, Query
|
||
from loguru import logger
|
||
|
||
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")
|
||
def get_all_urls(request: Annotated[GetUrlListRequest, Query()]):
|
||
"""获取所有的URL,支持根据域名、状态进行过滤,不传则返回全部数据,支持分页"""
|
||
|
||
logger.debug(f"{request=}")
|
||
|
||
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")
|
||
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")
|
||
def collect_evidence(request: CollectEvidenceRequest):
|
||
"""
|
||
强制手动触发证据收集任务,支持批量传入,已经收集过的 URL 也要强制收集
|
||
TODO:本来应该需要使用任务队列的,为了简单先把数据库的相关标记改为 0 ,也能达到一样的效果
|
||
又不是不能用 XD
|
||
"""
|
||
return ReportURLService.batch_update_evidence_flag(request.ids)
|
||
|
||
|
||
@router.post("/v1/report")
|
||
def report(request: ReportRequest):
|
||
"""举报指定的URL,支持批量传入 id 批量举报
|
||
先通过改数据库,然后等引擎自己调度实现
|
||
"""
|
||
logger.debug(f"{request=}")
|
||
return ReportURLService.batch_update_report_flag(
|
||
request.ids,
|
||
request.report_by_one,
|
||
request.report_by_site,
|
||
request.report_by_wap
|
||
)
|