diff --git a/app/api/v1/endpoints/article.py b/app/api/v1/endpoints/article.py index 4e131d2..38bb1d0 100644 --- a/app/api/v1/endpoints/article.py +++ b/app/api/v1/endpoints/article.py @@ -11,7 +11,7 @@ from app.utils.get_db import get_db from app.utils.auth import get_current_user -from app.curd.article import crud_upload_to_self_folder, crud_get_self_folders, crud_get_articles_in_folder, crud_self_create_folder, crud_self_article_to_recycle_bin, crud_self_folder_to_recycle_bin, crud_read_article, crud_import_self_folder, crud_export_self_folder,crud_create_tag, crud_delete_tag, crud_get_article_tags, crud_all_tags_order, crud_change_folder_name, crud_change_article_name, crud_article_statistic +from app.curd.article import crud_upload_to_self_folder, crud_get_self_folders, crud_get_articles_in_folder, crud_self_create_folder, crud_self_article_to_recycle_bin, crud_self_folder_to_recycle_bin, crud_read_article, crud_import_self_folder, crud_export_self_folder,crud_create_tag, crud_delete_tag, crud_get_article_tags, crud_all_tags_order, crud_change_folder_name, crud_change_article_name, crud_article_statistic, crud_self_tree from app.schemas.article import SelfCreateFolder router = APIRouter() @@ -32,7 +32,7 @@ async def upload_to_self_folder(folder_id: int = Query(...), article: UploadFile content = await article.read() f.write(content) - return {"msg": "Article created successfully."} + return {"msg": "Article created successfully.", "article_id": article_id} @router.get("/getSelfFolders", response_model="dict") async def get_self_folders(page_number: Optional[int] = Query(None, ge=1), page_size: Optional[int] = Query(None, ge=1), @@ -61,10 +61,10 @@ async def self_create_folder(model: SelfCreateFolder, db: AsyncSession = Depends user_id = user.get("id") # 数据库插入 - await crud_self_create_folder(folder_name, user_id, db) + folder_id = await crud_self_create_folder(folder_name, user_id, db) # 返回结果 - return {"msg": "User Folder Created Successfully"} + return {"msg": "User Folder Created Successfully", "folder_id": folder_id} @router.delete("/selfArticleToRecycleBin", response_model="dict") async def self_article_to_recycle_bin(article_id: int = Query(...), db: AsyncSession = Depends(get_db)): @@ -184,4 +184,10 @@ async def change_folder_name(folder_id: int = Body(...), folder_name: str = Body @router.post("/changeArticleName", response_model="dict") async def change_article_name(article_id: int = Body(...), article_name: str = Body(...), db: AsyncSession = Depends(get_db)): await crud_change_article_name(article_id, article_name, db) - return {"msg": "Article name changed successfully"} \ No newline at end of file + return {"msg": "Article name changed successfully"} + +@router.get("/selfTree", response_model="dict") +async def self_tree(page_number: Optional[int] = Query(None, ge=1), page_size: Optional[int] = Query(None, ge=1), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)): + user_id = user.get("id") + total_folder_num, folders = await crud_self_tree(user_id, page_number, page_size, db) + return {"total_folder_num": total_folder_num, "folders": folders} \ No newline at end of file diff --git a/app/curd/article.py b/app/curd/article.py index ccf92a9..3be59b0 100644 --- a/app/curd/article.py +++ b/app/curd/article.py @@ -44,6 +44,7 @@ async def crud_self_create_folder(name: str, user_id: int, db: AsyncSession): db.add(new_folder) await db.commit() await db.refresh(new_folder) + return new_folder.id async def crud_self_article_to_recycle_bin(article_id: int, db: AsyncSession): # 查询 article @@ -191,4 +192,32 @@ async def crud_article_statistic(db: AsyncSession): if i == len(articles) or articles[i].get("date") != seven_days_ago + timedelta(days=i): articles.insert(i, {"date": seven_days_ago + timedelta(days=i), "count": 0}) - return articles \ No newline at end of file + return articles + +async def crud_self_tree(user_id: int, page_number: int, page_size: int, db: AsyncSession): + query = select(Folder).where(Folder.user_id == user_id, Folder.visible == True).order_by(Folder.id.desc()) + count_query = select(func.count()).select_from(query.subquery()) + count_result = await db.execute(count_query) + total_num = count_result.scalar() + + if page_number and page_size: + offset = (page_number - 1) * page_size + query = query.offset(offset).limit(page_size) + result = await db.execute(query) + folders = result.scalars().all() + + folder_array = [{"folder_id": folder.id, "folder_name": folder.name, "articles": []} for folder in folders] + for i in range(len(folder_array)): + query = select(Article).where(Article.folder_id == folder_array[i].get("folder_id"), Article.visible == True).order_by(Article.id.desc()) + result = await db.execute(query) + articles = result.scalars().all() + article_array = [{"article_id": article.id, "article_name": article.name, "notes": []} for article in articles] + folder_array[i]["articles"] = article_array + for j in range(len(article_array)): + query = select(Note).where(Note.article_id == article_array[j].get("article_id"), Note.visible == True).order_by(Note.id.desc()) + result = await db.execute(query) + notes = result.scalars().all() + note_array = [{"note_id": note.id, "note_title": note.title} for note in notes] + article_array[j]["notes"] = note_array + + return total_num, folder_array \ No newline at end of file