153 lines
4.6 KiB
Python
153 lines
4.6 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from pydantic import BaseModel
|
|
from typing import List
|
|
from auth_utils import get_current_user
|
|
from social_db_utils import (
|
|
send_friend_request,
|
|
accept_friend_request,
|
|
reject_friend_request,
|
|
get_friend_requests,
|
|
get_friends,
|
|
remove_friend,
|
|
search_users,
|
|
)
|
|
from notification_db_utils import create_notification
|
|
from user_db_utils import get_user_by_id
|
|
|
|
router = APIRouter(prefix="/friends", tags=["friends"])
|
|
|
|
|
|
class FriendRequestModel(BaseModel):
|
|
receiver_id: int
|
|
|
|
|
|
@router.post("/request")
|
|
def send_friend_request_endpoint(
|
|
request: FriendRequestModel,
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Send a friend request to another user"""
|
|
result = send_friend_request(current_user["user_id"], request.receiver_id)
|
|
if "error" in result:
|
|
raise HTTPException(status_code=400, detail=result["error"])
|
|
|
|
# Create notification for receiver
|
|
create_notification(
|
|
user_id=request.receiver_id,
|
|
type="friend_request",
|
|
message=f"{current_user['display_name']} שלח לך בקשת חברות",
|
|
related_id=result.get("id")
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
@router.get("/requests")
|
|
def get_friend_requests_endpoint(
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Get pending friend requests"""
|
|
return get_friend_requests(current_user["user_id"])
|
|
|
|
|
|
@router.post("/requests/{request_id}/accept")
|
|
def accept_friend_request_endpoint(
|
|
request_id: int,
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Accept a friend request"""
|
|
# Get request details before accepting
|
|
from social_db_utils import get_db_connection
|
|
from psycopg2.extras import RealDictCursor
|
|
|
|
conn = get_db_connection()
|
|
cur = conn.cursor(cursor_factory=RealDictCursor)
|
|
try:
|
|
cur.execute(
|
|
"SELECT sender_id, receiver_id FROM friend_requests WHERE id = %s AND status = 'pending'",
|
|
(request_id,)
|
|
)
|
|
request_data = cur.fetchone()
|
|
|
|
# Verify current user is the receiver
|
|
if not request_data:
|
|
raise HTTPException(status_code=404, detail="Request not found")
|
|
if request_data["receiver_id"] != current_user["user_id"]:
|
|
raise HTTPException(status_code=403, detail="Not authorized to accept this request")
|
|
finally:
|
|
cur.close()
|
|
conn.close()
|
|
|
|
result = accept_friend_request(request_id)
|
|
if "error" in result:
|
|
raise HTTPException(status_code=404, detail=result["error"])
|
|
|
|
# Create notification for sender that their request was accepted
|
|
if request_data:
|
|
create_notification(
|
|
user_id=request_data["sender_id"],
|
|
type="friend_accepted",
|
|
message=f"{current_user['display_name']} קיבל את בקשת החברות שלך",
|
|
related_id=current_user["user_id"]
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
@router.post("/requests/{request_id}/reject")
|
|
def reject_friend_request_endpoint(
|
|
request_id: int,
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Reject a friend request"""
|
|
# Verify current user is the receiver
|
|
from social_db_utils import get_db_connection
|
|
from psycopg2.extras import RealDictCursor
|
|
|
|
conn = get_db_connection()
|
|
cur = conn.cursor(cursor_factory=RealDictCursor)
|
|
try:
|
|
cur.execute(
|
|
"SELECT receiver_id FROM friend_requests WHERE id = %s AND status = 'pending'",
|
|
(request_id,)
|
|
)
|
|
request_data = cur.fetchone()
|
|
|
|
if not request_data:
|
|
raise HTTPException(status_code=404, detail="Request not found")
|
|
if request_data["receiver_id"] != current_user["user_id"]:
|
|
raise HTTPException(status_code=403, detail="Not authorized to reject this request")
|
|
finally:
|
|
cur.close()
|
|
conn.close()
|
|
|
|
return reject_friend_request(request_id)
|
|
|
|
|
|
@router.get("")
|
|
def get_friends_endpoint(
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Get list of user's friends"""
|
|
return get_friends(current_user["user_id"])
|
|
|
|
|
|
@router.delete("/{friend_id}")
|
|
def remove_friend_endpoint(
|
|
friend_id: int,
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Remove a friend"""
|
|
from fastapi.responses import Response
|
|
remove_friend(current_user["user_id"], friend_id)
|
|
return Response(status_code=204)
|
|
|
|
|
|
@router.get("/search")
|
|
def search_users_for_friends_endpoint(
|
|
q: str = Query(..., min_length=1),
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
"""Search users to add as friends"""
|
|
return search_users(q, current_user["user_id"])
|