Spaces:
Runtime error
Runtime error
phuochungus
commited on
Commit
•
b245237
1
Parent(s):
19c9156
upload
Browse files- app/__init__.py +19 -3
- app/graphdb/main.py +28 -0
- app/main.py +11 -9
- app/routers/friend_request.py +127 -0
- app/routers/image.py +3 -3
- app/routers/me.py +16 -0
- app/routers/video.py +2 -2
app/__init__.py
CHANGED
@@ -1,11 +1,14 @@
|
|
1 |
import os
|
|
|
|
|
|
|
2 |
from dotenv import load_dotenv
|
3 |
from mmdeploy_runtime import Detector
|
4 |
from supabase import create_client, Client
|
5 |
from firebase_admin import credentials, initialize_app
|
6 |
-
import
|
|
|
7 |
|
8 |
-
import logging
|
9 |
|
10 |
logger = logging.getLogger("uvicorn")
|
11 |
logger.setLevel(logging.INFO)
|
@@ -13,16 +16,29 @@ logger.setLevel(logging.INFO)
|
|
13 |
|
14 |
load_dotenv()
|
15 |
|
|
|
16 |
model_path = "./model"
|
17 |
detector = Detector(model_path=model_path, device_name="cpu", device_id=0)
|
18 |
|
|
|
19 |
url: str = os.environ.get("SUPABASE_URL")
|
20 |
key: str = os.environ.get("SUPABASE_KEY")
|
21 |
supabase: Client = create_client(url, key)
|
22 |
|
23 |
-
|
24 |
firebase_app = initialize_app(
|
25 |
credential=credentials.Certificate(
|
26 |
json.loads(os.environ.get("FIREBASE_CREDENTIALS"))
|
27 |
)
|
28 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import os
|
2 |
+
import json
|
3 |
+
import logging
|
4 |
+
|
5 |
from dotenv import load_dotenv
|
6 |
from mmdeploy_runtime import Detector
|
7 |
from supabase import create_client, Client
|
8 |
from firebase_admin import credentials, initialize_app
|
9 |
+
from firebase_admin import firestore
|
10 |
+
from neo4j import GraphDatabase
|
11 |
|
|
|
12 |
|
13 |
logger = logging.getLogger("uvicorn")
|
14 |
logger.setLevel(logging.INFO)
|
|
|
16 |
|
17 |
load_dotenv()
|
18 |
|
19 |
+
# LOAD MODEL
|
20 |
model_path = "./model"
|
21 |
detector = Detector(model_path=model_path, device_name="cpu", device_id=0)
|
22 |
|
23 |
+
# LOAD SUPABASE
|
24 |
url: str = os.environ.get("SUPABASE_URL")
|
25 |
key: str = os.environ.get("SUPABASE_KEY")
|
26 |
supabase: Client = create_client(url, key)
|
27 |
|
28 |
+
# LOAD FIREBASE ADMIN SDK
|
29 |
firebase_app = initialize_app(
|
30 |
credential=credentials.Certificate(
|
31 |
json.loads(os.environ.get("FIREBASE_CREDENTIALS"))
|
32 |
)
|
33 |
)
|
34 |
+
|
35 |
+
db = firestore.client()
|
36 |
+
|
37 |
+
# LOAD NEO4J DB
|
38 |
+
URI = os.environ.get("NEO4J_URI")
|
39 |
+
AUTH = (os.environ.get("NEO4J_USERNAME"), os.environ.get("NEO4J_PASSWORD"))
|
40 |
+
driver = GraphDatabase.driver(URI, auth=AUTH)
|
41 |
+
driver.verify_connectivity()
|
42 |
+
driver.execute_query(
|
43 |
+
"CREATE CONSTRAINT uid IF NOT EXISTS FOR (p:Person) REQUIRE p.uid IS UNIQUE"
|
44 |
+
)
|
app/graphdb/main.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from app import driver
|
2 |
+
|
3 |
+
|
4 |
+
def match_person_nodes(tx, uid1: str, uid2: str):
|
5 |
+
tx.run("MERGE (p1:Person {uid: " + uid1 + "})")
|
6 |
+
tx.run("MERGE (p2:Person {uid: " + uid2 + "})")
|
7 |
+
tx.run(
|
8 |
+
"MATCH (p1:Person {uid: "
|
9 |
+
+ uid1
|
10 |
+
+ "}) MATCH (p2:Person {uid: "
|
11 |
+
+ uid2
|
12 |
+
+ "}) MERGE (p1)-[:FRIEND]-(p2)"
|
13 |
+
)
|
14 |
+
|
15 |
+
|
16 |
+
async def insert2PersonAndSetFriend(uid1: str, uid2: str):
|
17 |
+
with driver.session() as session:
|
18 |
+
session.write_transaction(match_person_nodes, uid1, uid2)
|
19 |
+
|
20 |
+
|
21 |
+
async def deleteFriend(uid1: str, uid2: str):
|
22 |
+
driver.execute_query(
|
23 |
+
"MATCH (p1:Person {uid: "
|
24 |
+
+ uid1
|
25 |
+
+ "})-[r:FRIEND]-(p2:Person {uid: "
|
26 |
+
+ uid2
|
27 |
+
+ "}) DELETE r"
|
28 |
+
)
|
app/main.py
CHANGED
@@ -1,23 +1,25 @@
|
|
1 |
-
from
|
2 |
-
from fastapi import Depends, FastAPI
|
3 |
from fastapi.responses import RedirectResponse
|
4 |
|
5 |
-
from app.
|
6 |
-
from .routers import image, video
|
7 |
|
8 |
|
9 |
app = FastAPI()
|
10 |
|
11 |
app.include_router(image.router)
|
12 |
app.include_router(video.router)
|
13 |
-
|
14 |
-
|
15 |
-
@app.get("/me")
|
16 |
-
def getProfile(current_user: Annotated[any, Depends(get_current_user)]):
|
17 |
-
return current_user
|
18 |
|
19 |
|
20 |
@app.get("/", include_in_schema=False)
|
21 |
def hello():
|
22 |
response = RedirectResponse(url="/docs")
|
23 |
return response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI
|
|
|
2 |
from fastapi.responses import RedirectResponse
|
3 |
|
4 |
+
from app.graphdb.main import insert2PersonAndSetFriend, deleteFriend
|
5 |
+
from .routers import image, video, friend_request, me
|
6 |
|
7 |
|
8 |
app = FastAPI()
|
9 |
|
10 |
app.include_router(image.router)
|
11 |
app.include_router(video.router)
|
12 |
+
app.include_router(friend_request.router)
|
13 |
+
app.include_router(me.router)
|
|
|
|
|
|
|
14 |
|
15 |
|
16 |
@app.get("/", include_in_schema=False)
|
17 |
def hello():
|
18 |
response = RedirectResponse(url="/docs")
|
19 |
return response
|
20 |
+
|
21 |
+
|
22 |
+
@app.get("/test")
|
23 |
+
async def test():
|
24 |
+
await insert2PersonAndSetFriend("1", "2")
|
25 |
+
await deleteFriend("1", "2")
|
app/routers/friend_request.py
ADDED
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import datetime
|
2 |
+
import cv2
|
3 |
+
import qrcode
|
4 |
+
from fastapi import APIRouter, Depends, HTTPException, Response
|
5 |
+
from app.dependencies import get_current_user
|
6 |
+
from app import db
|
7 |
+
from enum import Enum
|
8 |
+
from app.graphdb.main import insert2PersonAndSetFriend
|
9 |
+
|
10 |
+
|
11 |
+
router = APIRouter(prefix="/friend_request", tags=["friend_request"])
|
12 |
+
|
13 |
+
|
14 |
+
class RequestStatus(Enum):
|
15 |
+
WAITING_INVITEE = "waiting_invitee"
|
16 |
+
WAITING_INVITER = "waiting_inviter"
|
17 |
+
COMPLETE = "complete"
|
18 |
+
|
19 |
+
|
20 |
+
COLLECTION_NAME = "friend_request"
|
21 |
+
EXPIRE_MINUTES = 15
|
22 |
+
|
23 |
+
|
24 |
+
@router.get("")
|
25 |
+
def getFriendRequest(user=Depends(get_current_user)):
|
26 |
+
if user.uid is None:
|
27 |
+
raise HTTPException(status_code=400, detail="User not found")
|
28 |
+
friend_requests = (
|
29 |
+
db.collection(COLLECTION_NAME).where("inviter", "==", user.uid).stream()
|
30 |
+
)
|
31 |
+
return {"friend_requests": [Request.to_dict() for Request in friend_requests]}
|
32 |
+
|
33 |
+
|
34 |
+
@router.post("")
|
35 |
+
def createRequest(user=Depends(get_current_user)):
|
36 |
+
if user.uid is None:
|
37 |
+
raise HTTPException(status_code=400, detail="User not found")
|
38 |
+
_, fr_ref = db.collection(COLLECTION_NAME).add(
|
39 |
+
{
|
40 |
+
"invitor": user.uid,
|
41 |
+
"status": RequestStatus.WAITING_INVITEE.value,
|
42 |
+
"expire_at": datetime.now() + datetime.timedelta(minutes=EXPIRE_MINUTES),
|
43 |
+
}
|
44 |
+
)
|
45 |
+
qr = qrcode.make(fr_ref.id)
|
46 |
+
|
47 |
+
ret, png = cv2.imencode(".jpg", qr)
|
48 |
+
|
49 |
+
if not ret:
|
50 |
+
fr_ref.delete()
|
51 |
+
return Response(content="Failed to encode image", status_code=500)
|
52 |
+
|
53 |
+
png_bytes = png.tobytes()
|
54 |
+
|
55 |
+
return Response(content=png_bytes, media_type="image/png")
|
56 |
+
|
57 |
+
|
58 |
+
@router.patch("/{RequestId}")
|
59 |
+
def acceptRequest(RequestId: str, user=Depends(get_current_user)):
|
60 |
+
if user.uid is None:
|
61 |
+
raise HTTPException(status_code=400, detail="User not found")
|
62 |
+
|
63 |
+
fr_ref = db.collection(COLLECTION_NAME).document(RequestId)
|
64 |
+
fr = fr_ref.get()
|
65 |
+
|
66 |
+
if not fr.exists:
|
67 |
+
raise HTTPException(status_code=404, detail="Friend request not found")
|
68 |
+
|
69 |
+
if isRequestExpired(fr):
|
70 |
+
raise HTTPException(status_code=400, detail="Friend request expired")
|
71 |
+
|
72 |
+
if isRequestDone(fr):
|
73 |
+
raise HTTPException(status_code=400, detail="Friend request already done")
|
74 |
+
|
75 |
+
if isInviter(user, fr):
|
76 |
+
fr_ref.update({"status": RequestStatus.COMPLETE.value})
|
77 |
+
makeFriend(fr.invitee, fr.inviter)
|
78 |
+
return {"status": "OK"}
|
79 |
+
|
80 |
+
if isInviteeEmpty(fr) and not isInviter(user, fr):
|
81 |
+
fr_ref.update(
|
82 |
+
{"invitee": user.uid, "status": RequestStatus.WAITING_INVITER.value}
|
83 |
+
)
|
84 |
+
sendNotificationToInviter(fr.inviter, user)
|
85 |
+
return {"status": "OK"}
|
86 |
+
|
87 |
+
|
88 |
+
async def sendNotificationToInviter(inviterId: str, invitee):
|
89 |
+
pass
|
90 |
+
|
91 |
+
|
92 |
+
async def makeFriend(inviteeId: str, inviterId: str):
|
93 |
+
await insert2PersonAndSetFriend(inviteeId, inviterId)
|
94 |
+
|
95 |
+
|
96 |
+
@router.delete("/{RequestId}")
|
97 |
+
def deleteRequest(RequestId: str, user=Depends(get_current_user)):
|
98 |
+
if user.uid is None:
|
99 |
+
raise HTTPException(status_code=400, detail="User not found")
|
100 |
+
|
101 |
+
Request_ref = db.collection(COLLECTION_NAME).document(RequestId)
|
102 |
+
Request = Request_ref.get()
|
103 |
+
|
104 |
+
if not Request.exists:
|
105 |
+
raise HTTPException(status_code=404, detail="Friend request not found")
|
106 |
+
|
107 |
+
if isInviter(user, Request):
|
108 |
+
Request_ref.delete()
|
109 |
+
return {"status": "OK"}
|
110 |
+
else:
|
111 |
+
raise HTTPException(status_code=400, detail="You are not inviter")
|
112 |
+
|
113 |
+
|
114 |
+
def isRequestExpired(request):
|
115 |
+
return request.expire_at < datetime.now()
|
116 |
+
|
117 |
+
|
118 |
+
def isInviter(user, Request):
|
119 |
+
return Request.inviter == user.uid
|
120 |
+
|
121 |
+
|
122 |
+
def isRequestDone(Request):
|
123 |
+
return Request.status == RequestStatus.COMPLETE.value
|
124 |
+
|
125 |
+
|
126 |
+
def isInviteeEmpty(Request):
|
127 |
+
return Request.invitee is None
|
app/routers/image.py
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
from fastapi import APIRouter, File, Response, WebSocket, WebSocketDisconnect
|
2 |
import cv2
|
3 |
import numpy as np
|
|
|
|
|
4 |
from app.constants import classNames, colors
|
5 |
from app import detector
|
6 |
-
|
7 |
from mmcv import imfrombytes
|
8 |
from app.custom_mmcv.main import imshow_det_bboxes
|
9 |
|
10 |
-
router = APIRouter(prefix="/image")
|
11 |
|
12 |
|
13 |
@router.post("")
|
|
|
|
|
1 |
import cv2
|
2 |
import numpy as np
|
3 |
+
|
4 |
+
from fastapi import APIRouter, File, Response, WebSocket, WebSocketDisconnect
|
5 |
from app.constants import classNames, colors
|
6 |
from app import detector
|
|
|
7 |
from mmcv import imfrombytes
|
8 |
from app.custom_mmcv.main import imshow_det_bboxes
|
9 |
|
10 |
+
router = APIRouter(prefix="/image", tags=["Image"])
|
11 |
|
12 |
|
13 |
@router.post("")
|
app/routers/me.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import APIRouter, Depends
|
2 |
+
|
3 |
+
from app.dependencies import get_current_user
|
4 |
+
|
5 |
+
|
6 |
+
router = APIRouter(prefix="/me", tags=["Me"])
|
7 |
+
|
8 |
+
|
9 |
+
@router.get("")
|
10 |
+
def getProfile(current_user=Depends(get_current_user)):
|
11 |
+
return current_user
|
12 |
+
|
13 |
+
|
14 |
+
@router.get("/friends")
|
15 |
+
def getFriends(current_user=Depends(get_current_user)):
|
16 |
+
raise NotImplementedError()
|
app/routers/video.py
CHANGED
@@ -20,7 +20,7 @@ from app import supabase
|
|
20 |
from app.dependencies import get_current_user
|
21 |
from app.routers.image import inferenceImage
|
22 |
|
23 |
-
router = APIRouter(prefix="/video")
|
24 |
|
25 |
|
26 |
@router.post("/{artifactId}")
|
@@ -29,7 +29,7 @@ async def handleVideoRequest(
|
|
29 |
file: UploadFile,
|
30 |
background_tasks: BackgroundTasks,
|
31 |
threshold: float = 0.3,
|
32 |
-
|
33 |
):
|
34 |
if re.search("^video\/", file.content_type) is None:
|
35 |
raise HTTPException(
|
|
|
20 |
from app.dependencies import get_current_user
|
21 |
from app.routers.image import inferenceImage
|
22 |
|
23 |
+
router = APIRouter(prefix="/video", tags=["Video"])
|
24 |
|
25 |
|
26 |
@router.post("/{artifactId}")
|
|
|
29 |
file: UploadFile,
|
30 |
background_tasks: BackgroundTasks,
|
31 |
threshold: float = 0.3,
|
32 |
+
_=Depends(get_current_user),
|
33 |
):
|
34 |
if re.search("^video\/", file.content_type) is None:
|
35 |
raise HTTPException(
|