Spaces:
Runtime error
Runtime error
File size: 3,865 Bytes
b245237 0890b20 b245237 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
import datetime
import cv2
import qrcode
from fastapi import APIRouter, Depends, HTTPException, Response
from app.dependencies import get_current_user
from app import db
from enum import Enum
from app.graphdb.main import insert2PersonAndSetFriend
router = APIRouter(prefix="/friend_request", tags=["friend_request"])
class RequestStatus(Enum):
WAITING_INVITEE = "waiting_invitee"
WAITING_INVITER = "waiting_inviter"
COMPLETE = "complete"
COLLECTION_NAME = "friend_request"
EXPIRE_MINUTES = 15
@router.get("")
def getFriendRequest(user=Depends(get_current_user)):
if user.uid is None:
raise HTTPException(status_code=400, detail="User not found")
friend_requests = (
db.collection(COLLECTION_NAME).where("inviter", "==", user.uid).stream()
)
return {"friend_requests": [Request.to_dict() for Request in friend_requests]}
@router.post("")
def createRequest(user=Depends(get_current_user)):
if user.uid is None:
raise HTTPException(status_code=400, detail="User not found")
_, fr_ref = db.collection(COLLECTION_NAME).add(
{
"invitor": user.uid,
"status": RequestStatus.WAITING_INVITEE.value,
"expire_at": datetime.now() + datetime.timedelta(minutes=EXPIRE_MINUTES),
}
)
qr = qrcode.make(fr_ref.id)
ret, png = cv2.imencode(".jpg", qr)
if not ret:
fr_ref.delete()
return Response(content="Failed to encode image", status_code=500)
png_bytes = png.tobytes()
return Response(content=png_bytes, media_type="image/png")
@router.patch("/{RequestId}")
def acceptRequest(RequestId: str, user=Depends(get_current_user)):
if user.uid is None:
raise HTTPException(status_code=400, detail="User not found")
fr_ref = db.collection(COLLECTION_NAME).document(RequestId)
fr = fr_ref.get()
if not fr.exists:
raise HTTPException(status_code=404, detail="Friend request not found")
if isRequestExpired(fr):
raise HTTPException(status_code=400, detail="Friend request expired")
if isRequestDone(fr):
raise HTTPException(status_code=400, detail="Friend request already done")
if isInviter(user, fr):
fr_ref.update({"status": RequestStatus.COMPLETE.value})
makeFriend(fr.invitee, fr.inviter)
return {"status": "OK"}
if isInviteeEmpty(fr) and not isInviter(user, fr):
fr_ref.update(
{"invitee": user.uid, "status": RequestStatus.WAITING_INVITER.value}
)
sendNotificationToInviter(fr.inviter, user)
return {"status": "OK"}
async def sendNotificationToInviter(inviterId: str, invitee):
return HTTPException(status_code=501, detail="Not implemented yet")
async def makeFriend(inviteeId: str, inviterId: str):
await insert2PersonAndSetFriend(inviteeId, inviterId)
@router.delete("/{RequestId}")
def deleteRequest(RequestId: str, user=Depends(get_current_user)):
if user.uid is None:
raise HTTPException(status_code=400, detail="User not found")
Request_ref = db.collection(COLLECTION_NAME).document(RequestId)
Request = Request_ref.get()
if not Request.exists:
raise HTTPException(status_code=404, detail="Friend request not found")
if isInviter(user, Request):
Request_ref.delete()
return {"status": "OK"}
else:
raise HTTPException(status_code=400, detail="You are not inviter")
def isRequestExpired(request):
return request.expire_at < datetime.now()
def isInviter(user, Request):
return Request.inviter == user.uid
def isRequestDone(Request):
return Request.status == RequestStatus.COMPLETE.value
def isInviteeEmpty(Request):
return Request.invitee is None
|