NMPhap commited on
Commit
7ea3581
2 Parent(s): 07667c9 4f0e322

Merge pull request #11 from HunyyDev/dev/NMPhap

Browse files
Files changed (3) hide show
  1. .coverage +0 -0
  2. app/routers/video.py +48 -9
  3. tests/test_friend_request.py +3 -13
.coverage CHANGED
Binary files a/.coverage and b/.coverage differ
 
app/routers/video.py CHANGED
@@ -15,21 +15,22 @@ from fastapi import (
15
  BackgroundTasks,
16
  status,
17
  )
18
- import requests
 
19
  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", tags=["Video"])
24
 
25
 
26
- @router.post("/{artifactId}")
27
  async def handleVideoRequest(
28
- artifactId: str,
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(
@@ -38,12 +39,15 @@ async def handleVideoRequest(
38
  )
39
 
40
  try:
 
 
41
  id = str(now())
 
42
  os.mkdir(id)
43
  async with aiofiles.open(os.path.join(id, "input.mp4"), "wb") as out_file:
44
  while content := await file.read(1024):
45
  await out_file.write(content)
46
- background_tasks.add_task(inferenceVideo, artifactId, id, threshold)
47
  return id + ".mp4"
48
  except ValueError as err:
49
  print(err)
@@ -145,7 +149,42 @@ async def inferenceVideo(artifactId: str, inputDir: str, threshold: float):
145
 
146
 
147
  def updateArtifact(artifactId: str, body):
148
- url = "https://firebasetot.onrender.com/artifacts/" + artifactId
149
- payload = json.dumps(body)
150
- headers = {"Content-Type": "application/json"}
151
- requests.request("PATCH", url, headers=headers, data=payload)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  BackgroundTasks,
16
  status,
17
  )
18
+ from firebase_admin import messaging
19
+ from app import db
20
  from app import supabase
21
  from app.dependencies import get_current_user
22
  from app.routers.image import inferenceImage
23
+ from google.cloud.firestore_v1.base_query import FieldFilter
24
 
25
  router = APIRouter(prefix="/video", tags=["Video"])
26
 
27
 
28
+ @router.post("")
29
  async def handleVideoRequest(
 
30
  file: UploadFile,
31
  background_tasks: BackgroundTasks,
32
  threshold: float = 0.3,
33
+ user=Depends(get_current_user),
34
  ):
35
  if re.search("^video\/", file.content_type) is None:
36
  raise HTTPException(
 
39
  )
40
 
41
  try:
42
+ if user["sub"] is None:
43
+ return HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="User not found")
44
  id = str(now())
45
+ _, artifact_ref = db.collection("artifacts").add({"name": id + ".mp4", "status": "pending"})
46
  os.mkdir(id)
47
  async with aiofiles.open(os.path.join(id, "input.mp4"), "wb") as out_file:
48
  while content := await file.read(1024):
49
  await out_file.write(content)
50
+ background_tasks.add_task(inferenceVideo, artifact_ref.id, id, threshold)
51
  return id + ".mp4"
52
  except ValueError as err:
53
  print(err)
 
149
 
150
 
151
  def updateArtifact(artifactId: str, body):
152
+ artifact_snapshot = db.collection("artifacts").document(artifactId).get()
153
+ if not artifact_snapshot.exists:
154
+ artifact_snapshot.update(body)
155
+ sendMessage(artifactId)
156
+ # This function cannot be automation test because the requirement of another device to receive notification
157
+ def sendMessage(artifactId: str, message: str = None):
158
+ token = []
159
+ artifact = db.collection("artifacts").document(artifactId).get()
160
+ if not artifact.exists:
161
+ return
162
+ user_ref = db.collection("user").where(filter=FieldFilter("artifacts", "array-contains", "artifacts/" + artifactId))
163
+ for user in user_ref:
164
+ token.append(user.get().to_dict()['deviceId'])
165
+ if message is not None:
166
+ messaging.MulticastMessage(data={"notification": {
167
+ "title": message,
168
+ "body":
169
+ "Video " +
170
+ artifact.name +
171
+ " has done inference. Click here to see the video",
172
+ },}, android=messaging.AndroidConfig(
173
+ notification=messaging.AndroidNotification(
174
+ icon='stock_ticker_update',
175
+ color='#f45342'
176
+ ),))
177
+ else:
178
+ messaging.MulticastMessage(data={"notification": {
179
+ "title": "Video " + artifact.name + " has done inference.",
180
+ "body":
181
+ "Video " +
182
+ artifact.name +
183
+ " has done inference. Click here to see the video",
184
+ },}, android=messaging.AndroidConfig(
185
+ notification=messaging.AndroidNotification(
186
+ icon='stock_ticker_update',
187
+ color='#f45342'
188
+ ),))
189
+ response = messaging.send_multicast(message)
190
+ return response.success_count
tests/test_friend_request.py CHANGED
@@ -11,6 +11,7 @@ from app.main import app
11
  from app.constants import deviceId
12
  from fastapi.routing import APIRoute
13
  from firebase_admin import firestore
 
14
  from google.cloud.firestore_v1.base_query import FieldFilter
15
  def endpoints():
16
  endpoints = []
@@ -54,16 +55,6 @@ def inviter():
54
  data = response.json()
55
  inviter = {"id": data['localId'], "token": data["idToken"]}
56
  yield inviter
57
- @pytest.fixture()
58
- def firebase_app():
59
- if "test" in firebase_admin._apps:
60
- firebase_app = firebase_admin.get_app('test')
61
- yield firebase_app
62
- else:
63
- firebase_app = firebase_admin.initialize_app( credential= credentials.Certificate(
64
- json.loads(os.environ.get("FIREBASE_CREDENTIALS"))
65
- ),name='test')
66
- yield firebase_app
67
 
68
  @pytest.fixture()
69
  def invitee():
@@ -83,9 +74,8 @@ def invitee():
83
  yield invitee
84
  class TestFriendRequest():
85
  @pytest.mark.skipif("/friend_request" not in endpoints(),reason="Route not defined")
86
- def test_post_friend(self, firebase_app, client, inviter, invitee):
87
  # Call the firebase database
88
- db = firestore.client(app=firebase_app)
89
  friend_request_ref = db.collection('friend_request')
90
  # Remove all the friend_request use for testing in the past
91
  query = friend_request_ref.where(filter=FieldFilter("inviter", "==", inviter['id']))
@@ -160,4 +150,4 @@ class TestFriendRequest():
160
  # Delete entity for next time test
161
  user_ref.document(inviter['id']).delete()
162
  user_ref.document(invitee['id']).delete()
163
-
 
11
  from app.constants import deviceId
12
  from fastapi.routing import APIRoute
13
  from firebase_admin import firestore
14
+ from app import db
15
  from google.cloud.firestore_v1.base_query import FieldFilter
16
  def endpoints():
17
  endpoints = []
 
55
  data = response.json()
56
  inviter = {"id": data['localId'], "token": data["idToken"]}
57
  yield inviter
 
 
 
 
 
 
 
 
 
 
58
 
59
  @pytest.fixture()
60
  def invitee():
 
74
  yield invitee
75
  class TestFriendRequest():
76
  @pytest.mark.skipif("/friend_request" not in endpoints(),reason="Route not defined")
77
+ def test_post_friend(self, client, inviter, invitee):
78
  # Call the firebase database
 
79
  friend_request_ref = db.collection('friend_request')
80
  # Remove all the friend_request use for testing in the past
81
  query = friend_request_ref.where(filter=FieldFilter("inviter", "==", inviter['id']))
 
150
  # Delete entity for next time test
151
  user_ref.document(inviter['id']).delete()
152
  user_ref.document(invitee['id']).delete()
153
+