2025-04-04 17:29:50 +08:00

86 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
)