from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.api.dependencies import get_db
from app.models.userpost import UserPost, Pin
from app.schemas.userpost import UserPostCreate, UserPostResponse
from typing import List
from pydantic import BaseModel
router = APIRouter()
@router.post("/userposts", response_model=UserPostResponse)
def create_post(post_data: UserPostCreate, db: Session = Depends(get_db)):
# if the pin exists and belongs to the user
pin = db.query(Pin).filter(Pin.id == post_data.pin_id, Pin.username == post_data.username).first()
if not pin:
raise HTTPException(status_code=400, detail="Invalid pin selected.")
new_post = UserPost(**post_data.dict())
db.add(new_post)
db.commit()
db.refresh(new_post)
return new_post
@router.get("/userposts", response_model=List[UserPostResponse])
def get_posts(username: str = None, db: Session = Depends(get_db)):
query = db.query(UserPost)
if username:
query = query.filter(UserPost.username == username)
return query.all()
@router.patch("/userposts/{post_id}/like")
def like_post(post_id: int, db: Session = Depends(get_db)):
post = db.query(UserPost).filter(UserPost.id == post_id).first()
if not post:
raise HTTPException(status_code=404, detail="User post not found")
post.likes += 1
db.commit()
db.refresh(post)
return {"message": "Post liked successfully", "likes": post.likes}
class CommentRequest(BaseModel):
username: str
comment: str
@router.patch("/userposts/{post_id}/comment")
def comment_on_post(post_id: int, comment_data: CommentRequest, db: Session = Depends(get_db)):
post = db.query(UserPost).filter(UserPost.id == post_id).first()
if not post:
raise HTTPException(status_code=404, detail="User post not found")
post.comments[comment_data.username] = comment_data.comment
db.commit()
db.refresh(post)
return {"message": "Comment added successfully", "comments": post.comments}
@router.delete("/userposts/{post_id}/delete")
def delete_post(post_id: int, db: Session = Depends(get_db)):
post = db.query(UserPost).filter(UserPost.id == post_id).first()
if not post:
raise HTTPException(status_code=404, detail="User post not found")
db.delete(post)
db.commit()
return {"message": "Post deleted successfully", "post_id": post_id}