File size: 3,207 Bytes
48c823d
 
 
 
 
 
 
 
8acf519
fbc5903
8acf519
 
48c823d
 
 
 
 
 
 
 
 
 
 
8acf519
48c823d
 
 
 
8acf519
48c823d
 
 
 
 
8acf519
fbc5903
8acf519
 
fbc5903
8acf519
 
48c823d
8acf519
fbc5903
8acf519
 
48c823d
 
8acf519
fbc5903
8acf519
 
48c823d
 
 
 
 
 
8acf519
48c823d
 
 
 
 
 
fbc5903
48c823d
8acf519
fbc5903
 
8acf519
 
48c823d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8acf519
fbc5903
8acf519
fbc5903
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
import os
from datetime import datetime

from dotenv import load_dotenv
from supabase import create_client

load_dotenv()

SUPA = create_client(
    os.environ.get('SUPABASE_URL'),
    os.environ.get('SUPABASE_KEY')
)


def log_message_data_through_supabase_api(table_name, log_data):
    return SUPA.table(table_name).insert(log_data).execute()


def format_datetime_in_isoformat(dt):
    return getattr(dt.now(), 'isoformat', lambda x: None)()


def get_or_create_supabase_entry(table_name, insert_data, check_variable=None):
    """ Checks if project or contact exists and adds entry if not found

    Input:
    - table_name: str- the name of the table in Supabase that is being examined
    - insert_data: json - the data to insert
    - check_variable: str/None - the specific field to check for existing match

    Result
    - logged_data - an object with the Supabase data
    """
    if table_name == 'contact':
        resp = SUPA.table('contact').select("*").eq(
            "original_contact_id",
            insert_data['original_contact_id']
        ).eq(
            "project",
            insert_data['project']
        ).execute()
    else:
        resp = SUPA.table(table_name).select("*").eq(
            check_variable,
            insert_data[check_variable]
        ).execute()

    if len(resp.data) == 0:
        logged_data = log_message_data_through_supabase_api(
            table_name,
            insert_data
        )
    else:
        logged_data = resp
    return logged_data


def prepare_message_data_for_logging(message_data, nlu_response):
    """ Builds objects for each table and logs them to the database

    Input:
    - message_data: an object with the full message data from Turn.io/Whatsapp
    """
    project_data = {
        'name': "Rori",
        # Autogenerated fields: id, created_at, modified_at
    }
    project_data_log = get_or_create_supabase_entry(
        'project',
        project_data,
        'name'
    )

    contact_data = {
        'project': project_data_log.data[0]['id'],  # FK
        'original_contact_id': message_data['contact_uuid'],
        'urn': "",
        'language_code': "en",
        'contact_inserted_at': format_datetime_in_isoformat(datetime.now())
        # Autogenerated fields: id, created_at, modified_at
    }
    contact_data_log = get_or_create_supabase_entry('contact', contact_data)

    del message_data['author_id']

    message_data = {
        'contact': contact_data_log.data[0]['id'],  # FK
        'original_message_id': message_data['message_id'],
        'text': message_data['message_body'],
        'direction': message_data['message_direction'],
        'sender_type': message_data['author_type'],
        'channel_type': "whatsapp / turn.io",
        'message_inserted_at': message_data['message_inserted_at'],
        'message_modified_at': message_data['message_updated_at'],
        'message_sent_at': format_datetime_in_isoformat(datetime.now()),
        'nlu_response': nlu_response,
        'request_object': message_data
        # Autogenerated fields: created_at, modified_at
    }
    message_data_log = log_message_data_through_supabase_api(
        'message',
        message_data
    )