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}