222 lines
8.4 KiB
Python
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}
|