JourneyPoint / journeypoint / app / api / routes / userupdate.py
userupdate.py
Raw
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form
from sqlalchemy.orm import Session
from app.api.dependencies import get_db
from app.models.user import User
from app.schemas.userupdate import UserUpdate
from app.s3_utils import upload_image_to_s3

router = APIRouter()


@router.patch("/userupdate/{username}", response_model=UserUpdate)
async def update_user_profile(
        username: str,
        bio: str = Form(None),
        profile_picture: UploadFile = File(None),
        add_follower: str = Form(None),
        add_following: str = Form(None),
        db: Session = Depends(get_db),
):
    user = db.query(User).filter(User.username == username).first()
    if not user:
        raise HTTPException(status_code=404, detail="User not found")

    if bio is not None:
        user.bio = bio

    if profile_picture:
        s3_url = upload_image_to_s3(profile_picture, profile_picture.filename)
        user.profile_picture = s3_url

    if add_follower:
        follower_user = db.query(User).filter(User.username == add_follower).first()
        if not follower_user:
            raise HTTPException(status_code=404, detail="Follower user not found")
        if add_follower not in user.followers:
            user.followers.append(add_follower)
        if username not in follower_user.following:
            follower_user.following.append(username)

    if add_following:
        following_user = db.query(User).filter(User.username == add_following).first()
        if not following_user:
            raise HTTPException(status_code=404, detail="Following user not found")
        if add_following not in user.following:
            user.following.append(add_following)
        if username not in following_user.followers:
            following_user.followers.append(username)

    db.commit()
    db.refresh(user)

    return user


@router.patch("/userupdate/{username}/unfollow", response_model=UserUpdate)
async def unfollow_user(
        username: str,
        unfollow_username: str = Form(...),
        db: Session = Depends(get_db),
):
    user = db.query(User).filter(User.username == username).first()
    if not user:
        raise HTTPException(status_code=404, detail="User not found")

    unfollow_user = db.query(User).filter(User.username == unfollow_username).first()
    if not unfollow_user:
        raise HTTPException(status_code=404, detail="User to unfollow not found")

    if unfollow_username in user.following:
        user.following.remove(unfollow_username)

    if username in unfollow_user.followers:
        unfollow_user.followers.remove(username)

    db.commit()
    db.refresh(user)

    return user