"""网站管理相关路由""" 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}