83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
PerToolBox Server - 便签路由
|
|
Copyright (C) 2024 Sea Network Technology Studio
|
|
Author: Canglan <admin@sea-studio.top>
|
|
License: AGPL v3
|
|
"""
|
|
|
|
from fastapi import APIRouter, HTTPException, Query, Request
|
|
from typing import Optional, List
|
|
from ...dependencies import CurrentUserDependency, DbDependency
|
|
from ...models import Note
|
|
from ...schemas import NoteCreate, NoteUpdate, NoteResponse
|
|
from ...middleware.rate_limit import rate_limit
|
|
|
|
router = APIRouter(prefix="/api/v1/notes", tags=["notes"])
|
|
|
|
@router.get("/", response_model=List[NoteResponse])
|
|
@rate_limit(requests=100, period=60)
|
|
async def get_notes(
|
|
request: Request, # 添加 request 参数
|
|
current_user: CurrentUserDependency,
|
|
db: DbDependency,
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=500),
|
|
archived: bool = False
|
|
):
|
|
return db.query(Note).filter(
|
|
Note.user_id == current_user.id,
|
|
Note.is_archived == archived
|
|
).order_by(Note.created_at.desc()).offset(skip).limit(limit).all()
|
|
|
|
@router.post("/", response_model=NoteResponse, status_code=201)
|
|
@rate_limit(requests=50, period=60)
|
|
async def create_note(
|
|
request: Request, # 添加 request 参数
|
|
data: NoteCreate,
|
|
current_user: CurrentUserDependency,
|
|
db: DbDependency
|
|
):
|
|
note = Note(user_id=current_user.id, **data.model_dump())
|
|
db.add(note)
|
|
db.commit()
|
|
db.refresh(note)
|
|
return note
|
|
|
|
@router.put("/{note_id}", response_model=NoteResponse)
|
|
@rate_limit(requests=50, period=60)
|
|
async def update_note(
|
|
request: Request, # 添加 request 参数
|
|
note_id: int,
|
|
data: NoteUpdate,
|
|
current_user: CurrentUserDependency,
|
|
db: DbDependency
|
|
):
|
|
note = db.query(Note).filter(Note.id == note_id, Note.user_id == current_user.id).first()
|
|
if not note:
|
|
raise HTTPException(status_code=404, detail="便签不存在")
|
|
|
|
update_data = data.model_dump(exclude_unset=True)
|
|
for key, value in update_data.items():
|
|
setattr(note, key, value)
|
|
|
|
db.commit()
|
|
db.refresh(note)
|
|
return note
|
|
|
|
@router.delete("/{note_id}")
|
|
@rate_limit(requests=30, period=60)
|
|
async def delete_note(
|
|
request: Request, # 添加 request 参数
|
|
note_id: int,
|
|
current_user: CurrentUserDependency,
|
|
db: DbDependency
|
|
):
|
|
note = db.query(Note).filter(Note.id == note_id, Note.user_id == current_user.id).first()
|
|
if not note:
|
|
raise HTTPException(status_code=404, detail="便签不存在")
|
|
|
|
db.delete(note)
|
|
db.commit()
|
|
return {"success": True, "message": "已删除"} |