Files
mokeeText/backend/routes/websites.py
2026-07-15 16:08:17 +08:00

222 lines
8.4 KiB
Python

"""网站管理相关路由"""
from fastapi import APIRouter, Depends, HTTPException, Request
from sqlalchemy.orm import Session, joinedload
from models import get_db, Website, Account, Folder
from middleware.user_context import UserContext
router = APIRouter(tags=["网站管理"])
# ===== 网站 CRUD =====
@router.get("/api/websites")
def list_websites(folder_id: int = None, db: Session = Depends(get_db), request: Request = None):
"""获取网站列表(仅当前用户)"""
user_id = UserContext.get_user_id(request)
q = db.query(Website).options(joinedload(Website.accounts)).filter(Website.created_by == user_id)
if folder_id:
q = q.filter(Website.folder_id == folder_id)
return q.order_by(Website.name).all()
@router.post("/api/websites")
def create_website(data: dict, db: Session = Depends(get_db), request: Request = None):
"""创建网站"""
user_id = UserContext.get_user_id(request)
website = Website(
name=data.get("name", ""),
url=data.get("url", ""),
folder_id=data.get("folder_id"),
created_by=user_id,
updated_by=user_id,
)
db.add(website)
db.commit()
db.refresh(website)
return {"id": website.id, "name": website.name, "url": website.url,
"folder_id": website.folder_id}
@router.get("/api/websites/{website_id}")
def get_website(website_id: int, db: Session = Depends(get_db), request: Request = None):
"""获取网站详情(含账号列表)"""
user_id = UserContext.get_user_id(request)
website = db.query(Website).options(joinedload(Website.accounts)).filter(
Website.id == website_id, Website.created_by == user_id
).first()
if not website:
raise HTTPException(404, "网站不存在")
return website
@router.put("/api/websites/{website_id}")
def update_website(website_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
"""更新网站信息"""
user_id = UserContext.get_user_id(request)
website = db.query(Website).filter(Website.id == website_id, Website.created_by == user_id).first()
if not website:
raise HTTPException(404, "网站不存在")
for field in ["name", "url", "folder_id"]:
if field in data:
setattr(website, field, data[field])
website.updated_by = user_id
db.commit()
db.refresh(website)
return {"ok": True}
@router.delete("/api/websites/{website_id}")
def delete_website(website_id: int, db: Session = Depends(get_db), request: Request = None):
"""删除网站"""
user_id = UserContext.get_user_id(request)
website = db.query(Website).filter(Website.id == website_id, Website.created_by == user_id).first()
if not website:
raise HTTPException(404, "网站不存在")
db.delete(website)
db.commit()
return {"ok": True}
# ===== 账号 CRUD =====
@router.post("/api/websites/{website_id}/accounts")
def add_account(website_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
"""添加账号"""
user_id = UserContext.get_user_id(request)
account = Account(
website_id=website_id,
username=data.get("username", ""),
password=data.get("password", ""),
remark=data.get("remark", ""),
sort_order=data.get("sort_order", 0),
created_by=user_id,
updated_by=user_id,
)
db.add(account)
db.commit()
db.refresh(account)
return {"id": account.id, "username": account.username, "remark": account.remark, "sort_order": account.sort_order}
@router.get("/api/accounts/{account_id}")
def get_account(account_id: int, db: Session = Depends(get_db), request: Request = None):
"""获取单个账号"""
user_id = UserContext.get_user_id(request)
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
if not account:
raise HTTPException(404, "账号不存在")
return {"id": account.id, "username": account.username,
"password": account.password, "remark": account.remark}
@router.put("/api/accounts/{account_id}")
def update_account(account_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
"""更新账号"""
user_id = UserContext.get_user_id(request)
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
if not account:
raise HTTPException(404, "账号不存在")
for field in ["username", "password", "remark", "sort_order"]:
if field in data:
setattr(account, field, data[field])
account.updated_by = user_id
db.commit()
db.refresh(account)
return {"ok": True}
@router.delete("/api/accounts/{account_id}")
def delete_account(account_id: int, db: Session = Depends(get_db), request: Request = None):
"""删除账号"""
user_id = UserContext.get_user_id(request)
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
if not account:
raise HTTPException(404, "账号不存在")
db.delete(account)
db.commit()
return {"ok": True}
@router.put("/api/accounts/{account_id}/move")
def move_account(account_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
"""移动账号顺序: direction = 'up' | 'down'"""
user_id = UserContext.get_user_id(request)
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
if not account:
raise HTTPException(404, "账号不存在")
direction = data.get("direction", "down")
website_id = account.website_id
# 同网站下按 sort_order 排序的所有账号
siblings = db.query(Account).filter_by(website_id=website_id).order_by(Account.sort_order).all()
idx = next((i for i, a in enumerate(siblings) if a.id == account_id), None)
if idx is None:
return {"ok": False}
if direction == "up" and idx > 0:
siblings[idx].sort_order, siblings[idx-1].sort_order = siblings[idx-1].sort_order, siblings[idx].sort_order
elif direction == "down" and idx < len(siblings) - 1:
siblings[idx].sort_order, siblings[idx+1].sort_order = siblings[idx+1].sort_order, siblings[idx].sort_order
db.commit()
return {"ok": True}
# ===== 文件夹 API =====
@router.get("/api/folders")
def list_folders(type: str = "website", db: Session = Depends(get_db), request: Request = None):
"""获取文件夹列表(仅当前用户)"""
user_id = UserContext.get_user_id(request)
return db.query(Folder).filter(
Folder.type == type,
Folder.created_by == user_id,
).order_by(Folder.sort_order).all()
@router.post("/api/folders")
def create_folder(data: dict, db: Session = Depends(get_db), request: Request = None):
"""创建文件夹"""
user_id = UserContext.get_user_id(request)
folder = Folder(
name=data.get("name", "新文件夹"),
type=data.get("type", "website"),
created_by=user_id,
)
db.add(folder)
db.commit()
db.refresh(folder)
return {"id": folder.id, "name": folder.name, "type": folder.type}
@router.put("/api/folders/{folder_id}")
def update_folder(folder_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
"""重命名文件夹"""
user_id = UserContext.get_user_id(request)
folder = db.query(Folder).filter(Folder.id == folder_id, Folder.created_by == user_id).first()
if not folder:
raise HTTPException(404, "文件夹不存在")
if "name" in data:
folder.name = data["name"]
db.commit()
return {"ok": True, "id": folder.id, "name": folder.name}
@router.delete("/api/folders/{folder_id}")
def delete_folder(folder_id: int, db: Session = Depends(get_db), request: Request = None):
"""删除文件夹(文件夹下的内容变为未分类)"""
user_id = UserContext.get_user_id(request)
folder = db.query(Folder).filter(Folder.id == folder_id, Folder.created_by == user_id).first()
if not folder:
raise HTTPException(404, "文件夹不存在")
# 将该文件夹下的网站/笔记移到未分类(仅限当前用户)
from models import Website, Note
if folder.type == "website":
db.query(Website).filter_by(folder_id=folder_id, created_by=user_id).update({"folder_id": None})
else:
db.query(Note).filter_by(folder_id=folder_id, created_by=user_id).update({"folder_id": None})
db.delete(folder)
db.commit()
return {"ok": True}