File size: 5,586 Bytes
2da7ed3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
128
129
from fastapi import Body, Request, HTTPException, status
from fastapi.encoders import jsonable_encoder
import sys
# sys.path.append('/Users/benolojo/DCU/CA4/ca400_FinalYearProject/2024-ca400-olojob2-majdap2/src/backend/src/')
from ..models.calls import UpdateCall, UserCall, UserCaptions

def get_collection_calls(request: Request):
  try:
    # return request.app.database["call_records"]
      return request.app.database["call_test"]
  except:
      raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Unable to find call records Database.")


def create_calls(collection, user: UserCall = Body(...)):
    calls = jsonable_encoder(user)
    # new_calls = get_collection_calls(request).insert_one(calls)
    new_calls = collection.insert_one(calls)
    # created_calls = get_collection_calls(request).find_one({"_id": new_calls.inserted_id})
    created_calls = collection.find_one({"_id": new_calls.inserted_id})

    return created_calls


def list_calls(request: Request, limit: int):
    try:
        calls = list(get_collection_calls(request).find(limit = limit))
        # dateTest = calls[2]['date']
        return calls
    except:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"No existing call records yet.")


'''Finding calls based on call id'''
def find_calls(request: Request, call_id: str):
    # if user_calls := get_collection_calls(request).find_one({"call_id": call_id}) is not None:
    user_calls = get_collection_calls(request).find_one({"call_id": call_id})
    if user_calls is not None:
        return user_calls
    else:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call with ID: '{call_id}' not found.")
    

'''Finding calls based on user id'''
def find_user_calls(request: Request, user_id: str):
    user_calls = list(get_collection_calls(request).find({"$or": [{"caller_id": user_id}, {"callee_id": user_id}]})) # match on caller or callee ID
    if len(user_calls):
        return user_calls
    else:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"User with ID: '{user_id}' has no calls yet.")


'''Finding calls based on key terms list'''
def list_transcripts_by_key_terms(request: Request, key_terms_list: list[str] = Body(...)):
    key_terms_list = jsonable_encoder(key_terms_list)

    call_records = list(get_collection_calls(request).find({"key_terms": {"$in": key_terms_list}}, {'_id': 0})) # exclude returning ObjectID in find()
    
    # Check if any call records were returned
    if len(call_records):
        return call_records
    else:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call with key terms: '{key_terms_list}' not found!")
    

'''Finding calls based on date ranges'''
def list_transcripts_by_dates(request: Request, start_date: str, end_date: str):
    print(start_date, end_date)
    # Convert strings to date string in YYYY-MM-ddT00:00:00 format
    start_date = f'{start_date}T00:00:00'
    end_date = f'{end_date}T00:00:00'

    call_records = list(get_collection_calls(request).find({"date":{"$gte": start_date, "$lte": end_date}}))

    if len(call_records):
        return call_records
    else: 
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call with creation date between: '{start_date} - {end_date}' not found!")
    

'''Finding calls based on call lengths'''
def list_transcripts_by_duration(request: Request, min_len: int, max_len: int):

    call_records = list(get_collection_calls(request).find({"duration":{"$gte": min_len, "$lte": max_len}}))

    if len(call_records):
        return call_records
    else: 
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call with duration between: '{min_len} - {max_len}' milliseconds not found!")


def update_calls(collection, call_id: str, calls: UpdateCall = Body(...)):
    # calls = {k: v for k, v in calls.model_dump().items() if v is not None} #loop in the dict 
    calls = {k: v for k, v in calls.items() if v is not None} #loop in the dict 
    if len(calls) >= 1:
        update_result = collection.update_one({"call_id": call_id}, {"$set": calls})

        if update_result.modified_count == 0:
            raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call not updated!")

    if (existing_item := collection.find_one({"call_id": call_id})) is not None:
        return existing_item

    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call not found!")

def update_captions(collection, call_id: str, calls: UserCaptions = Body(...)):
    # calls = {k: v for k, v in calls.model_dump().items() if v is not None}
    calls = {k: v for k, v in calls.items() if v is not None}
    if len(calls) >= 1:
        update_result = collection.update_one({"call_id": call_id},
                                              {"$push": {"captions": calls}})

        if update_result.modified_count == 0:
            raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Captions not updated!")

    if (existing_item := collection.find_one({"call_id": call_id})) is not None:
        return existing_item

    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Captions not found!")


def delete_calls(request: Request, call_id: str):
    deleted_calls = get_collection_calls(request).delete_one({"call_id": call_id})

    if deleted_calls.deleted_count == 1:
        return f"Call deleted sucessfully!"

    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Call not found!")