customs-data / apps /api /routers /subscription.py
3v324v23's picture
feat: 完成多国家海关数据源接入与核心功能全量迭代
8ca8917
Raw
History Blame Contribute Delete
2.25 kB
import uuid
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from pydantic import BaseModel
from typing import Optional, List
from apps.api.dependencies.auth import get_api_key
from packages.core.database import get_db
from packages.core.models import Subscription
router = APIRouter(prefix="/subscription", tags=["Subscription"])
class SubscriptionRequest(BaseModel):
user_email: str
target_entity_id: Optional[str] = None
target_hs_code: Optional[str] = None
class SubscriptionResponse(BaseModel):
id: str
user_email: str
target_entity_id: Optional[str]
target_hs_code: Optional[str]
@router.post("/", response_model=SubscriptionResponse)
async def create_subscription(
req: SubscriptionRequest,
api_key: str = Depends(get_api_key),
db: AsyncSession = Depends(get_db)
):
"""
创建动态监控与预警订阅。
可以订阅特定企业或特定 HS Code。
"""
if not req.target_entity_id and not req.target_hs_code:
raise HTTPException(status_code=400, detail="Must provide target_entity_id or target_hs_code")
sub_id = str(uuid.uuid4())
sub = Subscription(
id=sub_id,
user_email=req.user_email,
target_entity_id=req.target_entity_id,
target_hs_code=req.target_hs_code
)
db.add(sub)
await db.commit()
return SubscriptionResponse(
id=sub_id,
user_email=sub.user_email,
target_entity_id=sub.target_entity_id,
target_hs_code=sub.target_hs_code
)
@router.get("/", response_model=List[SubscriptionResponse])
async def list_subscriptions(
user_email: str,
api_key: str = Depends(get_api_key),
db: AsyncSession = Depends(get_db)
):
"""
获取指定用户的所有订阅
"""
stmt = select(Subscription).where(Subscription.user_email == user_email)
result = await db.execute(stmt)
subs = result.scalars().all()
return [
SubscriptionResponse(
id=s.id,
user_email=s.user_email,
target_entity_id=s.target_entity_id,
target_hs_code=s.target_hs_code
) for s in subs
]