phuochungus commited on
Commit
b245237
1 Parent(s): 19c9156
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 json
 
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 typing_extensions import Annotated
2
- from fastapi import Depends, FastAPI
3
  from fastapi.responses import RedirectResponse
4
 
5
- from app.dependencies import get_current_user
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
- user=Depends(get_current_user),
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(