Automated Action 606cda0912 Implement Blogging API with FastAPI and SQLite
- Create project structure with app organization
- Set up FastAPI application with CORS and health endpoint
- Implement database models with SQLAlchemy (User, Post, Comment)
- Set up Alembic for database migrations
- Implement authentication with JWT tokens
- Create CRUD operations for all models
- Implement REST API endpoints for users, posts, and comments
- Add comprehensive documentation in README.md
2025-06-02 22:34:58 +00:00

158 lines
4.6 KiB
Python

from typing import Any, List
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from app import crud, models, schemas
from app.auth import deps
from app.db.session import get_db
router = APIRouter()
@router.get("/", response_model=List[schemas.Comment])
def read_comments(
db: Session = Depends(get_db),
skip: int = 0,
limit: int = 100,
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Retrieve comments. Only superusers can see all comments.
"""
comments = crud.comment.get_multi(db, skip=skip, limit=limit)
return comments
@router.post("/", response_model=schemas.Comment)
def create_comment(
*,
db: Session = Depends(get_db),
comment_in: schemas.CommentCreate,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Create new comment.
"""
post = crud.post.get(db, id=comment_in.post_id)
if not post:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Post not found",
)
comment = crud.comment.create_with_author(
db=db, obj_in=comment_in, author_id=current_user.id
)
return comment
@router.get("/{comment_id}", response_model=schemas.Comment)
def read_comment(
*,
db: Session = Depends(get_db),
comment_id: str,
) -> Any:
"""
Get comment by ID.
"""
comment = crud.comment.get(db, id=comment_id)
if not comment:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Comment not found",
)
return comment
@router.put("/{comment_id}", response_model=schemas.Comment)
def update_comment(
*,
db: Session = Depends(get_db),
comment_id: str,
comment_in: schemas.CommentUpdate,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Update a comment.
"""
comment = crud.comment.get(db, id=comment_id)
if not comment:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Comment not found",
)
if comment.author_id != current_user.id and not current_user.is_superuser:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="You can only update your own comments",
)
comment = crud.comment.update(db, db_obj=comment, obj_in=comment_in)
return comment
@router.delete("/{comment_id}", response_model=schemas.Comment)
def delete_comment(
*,
db: Session = Depends(get_db),
comment_id: str,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Delete a comment.
"""
comment = crud.comment.get(db, id=comment_id)
if not comment:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Comment not found",
)
if comment.author_id != current_user.id and not current_user.is_superuser:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="You can only delete your own comments",
)
comment = crud.comment.remove(db, id=comment_id)
return comment
@router.get("/post/{post_id}", response_model=List[schemas.Comment])
def read_comments_by_post(
post_id: str,
db: Session = Depends(get_db),
skip: int = 0,
limit: int = 100,
) -> Any:
"""
Retrieve comments by post.
"""
post = crud.post.get(db, id=post_id)
if not post:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Post not found",
)
comments = crud.comment.get_multi_by_post(
db=db, post_id=post_id, skip=skip, limit=limit
)
return comments
@router.get("/user/{user_id}", response_model=List[schemas.Comment])
def read_comments_by_user(
user_id: str,
db: Session = Depends(get_db),
skip: int = 0,
limit: int = 100,
current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
"""
Retrieve comments by user.
"""
if current_user.id != user_id and not current_user.is_superuser:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="You can only view your own comments",
)
user = crud.user.get(db, id=user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found",
)
comments = crud.comment.get_multi_by_author(
db=db, author_id=user_id, skip=skip, limit=limit
)
return comments