from typing import List from fastapi import APIRouter, Depends, Query, Request, UploadFile, File, Path, Body from sqlalchemy.orm import Session from config.auth import verify_token from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \ BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate, \ BlogAdjacentResponse from schemas.blog_elastic import BlogSearch from schemas.pagination import PageResult from config.database import get_db from service import blog_service, blog_elastic_service, file_service router = APIRouter( prefix="/blog", tags=["博客管理"], responses={404: {"description": "Not found"}} ) @router.post("/file/upload", summary="上传博客图片", response_model=str) async def sync_all_blog(md5: str = Query(..., description="文件MD5值"), file: UploadFile = File(..., description="要上传的图片文件")): return await file_service.upload_file(md5, file) @router.get("/sync", summary="同步博客到elastic", response_model=bool) def sync_all_blog(db: Session = Depends(get_db)): return blog_elastic_service.sync_all_blog(db) @router.get("/search", summary="搜索elastic", response_model=List[BlogSearch]) def search_blog(keyword: str = Query(..., description="搜索关键词")): return blog_elastic_service.search_blog(keyword) @router.get("/page", summary="分页查询博客", response_model=PageResult[BlogResponse]) def query_blog_by_page( current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码,从1开始"), page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页显示数量,1-100之间"), db: Session = Depends(get_db) ): return blog_service.query_blog_by_page(db, current_page, page_size) @router.get("/condition", summary="条件查询博客", response_model=List[BlogResponse]) def query_blog_by_condition(query: BlogQuery = Depends(), db: Session = Depends(get_db)): return blog_service.query_blog_by_condition(db, query) @router.get("/condition/page", summary="条件分页查询博客", response_model=PageResult[BlogResponse]) def query_blog_by_condition_page( query: BlogQuery = Depends(), current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码,从1开始"), page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页显示数量,1-100之间"), db: Session = Depends(get_db) ): return blog_service.query_blog_by_condition_page(db, query, current_page, page_size) @router.get("/unapproved", summary="查询待发布博客", response_model=List[BlogResponse]) def query_unapproved_blog(db: Session = Depends(get_db), _=Depends(verify_token)): return blog_service.query_unapproved_blog(db) @router.get("/{blog_id}/content", summary="查询博客内容", response_model=BlogResponse) def query_blog_by_id(blog_id: int = Path(..., ge=1, description="博客ID"), db: Session = Depends(get_db)): return blog_service.query_blog_by_id(db, blog_id) @router.get("/all/page", summary="分页查询博客", response_model=PageResult[BlogResponse]) def query_blog_by_page( current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码,从1开始"), page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页显示数量,1-100之间"), db: Session = Depends(get_db), _=Depends(verify_token) ): return blog_service.query_blog_by_page(db, current_page, page_size, True) @router.post("", summary="新增博客内容", response_model=bool) def add_blog( blog: BlogCreate = Body(..., description="博客创建数据"), db: Session = Depends(get_db), _=Depends(verify_token) ): return blog_service.add_blog(db, blog) @router.put("/{blog_id}", summary="更新博客内容", response_model=bool) def update_blog( blog_id: int = Path(..., ge=1, description="博客ID"), blog: BlogUpdate = Body(..., description="博客更新数据"), db: Session = Depends(get_db), _=Depends(verify_token) ): return blog_service.update_blog(db, blog_id, blog) @router.delete("/{blog_id}", summary="删除博客内容", response_model=bool) def delete_blog( blog_id: int = Path(..., ge=1, description="博客ID"), db: Session = Depends(get_db), _=Depends(verify_token) ): return blog_service.delete_blog(db, blog_id) @router.get("/{blog_id}/adjacent", summary="查询相邻博客", response_model=List[BlogAdjacentResponse]) def query_blog_latest(blog_id: int = Path(..., ge=1, description="博客ID"), db: Session = Depends(get_db)): return blog_service.query_blog_adjacent(db, blog_id) @router.put("/{blog_id}/comment", summary="新增博客评论", response_model=bool) def add_blog_comment( request: Request, blog_id: int = Path(..., ge=1, description="博客ID"), blog_comment: BlogCommentCreate = Body(..., description="博客评论数据"), db: Session = Depends(get_db) ): return blog_service.add_blog_comment(db, request, blog_id, blog_comment) @router.get("/{blog_id}/comment", summary="查询博客评论", response_model=list[BlogCommentResponse]) def query_blog_comment(blog_id: int = Path(..., ge=1, description="博客ID"), db: Session = Depends(get_db)): return blog_service.query_blog_comment(db, blog_id) @router.get("/category", summary="查询博客分类", response_model=List[BlogCategoryResponse]) def query_blog_category(db: Session = Depends(get_db)): return blog_service.query_blog_category(db) @router.get("/stats", summary="查询博客统计信息", response_model=BlogStatsResponse) def query_blog_stats(db: Session = Depends(get_db)): return blog_service.query_blog_stats(db) @router.get("/visit", summary="查询博客访问信息", response_model=PageResult[BlogVisitResponse]) def query_blog_visit( current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码,从1开始"), page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页显示数量,1-100之间"), db: Session = Depends(get_db) ): return blog_service.query_blog_visit(db, current_page, page_size) @router.get("/latest", summary="查询近期博客", response_model=list[BlogLatestResponse]) def query_blog_latest(db: Session = Depends(get_db)): return blog_service.query_blog_latest(db)