JourneyPoint / journeypoint / app / api / routes / userpost.py
userpost.py
Raw
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}