Spaces:
Sleeping
Sleeping
Update src/core/services/database_service.py
Browse files
src/core/services/database_service.py
CHANGED
|
@@ -29,11 +29,60 @@ class DatabaseService:
|
|
| 29 |
conn.close()
|
| 30 |
|
| 31 |
def setup_database(self):
|
| 32 |
-
"""Create database tables with relationships"""
|
| 33 |
with self.get_db() as conn:
|
| 34 |
c = conn.cursor()
|
| 35 |
c.executescript('''
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
''')
|
| 38 |
|
| 39 |
def generate_synthetic_data(self):
|
|
@@ -216,7 +265,17 @@ class DatabaseService:
|
|
| 216 |
:title, :department, :reports_to_id, :influence_level,
|
| 217 |
:engagement_score, :preferences, :created_at, :last_contacted
|
| 218 |
)''', contacts)
|
| 219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
def get_user_accounts(self, user_id: str) -> List[Dict]:
|
| 221 |
"""Get accounts associated with user"""
|
| 222 |
with self.get_db() as conn:
|
|
@@ -227,3 +286,15 @@ class DatabaseService:
|
|
| 227 |
ORDER BY a.name
|
| 228 |
""", (user_id,))
|
| 229 |
return [dict(row) for row in cursor.fetchall()]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
conn.close()
|
| 30 |
|
| 31 |
def setup_database(self):
|
|
|
|
| 32 |
with self.get_db() as conn:
|
| 33 |
c = conn.cursor()
|
| 34 |
c.executescript('''
|
| 35 |
+
CREATE TABLE IF NOT EXISTS users (
|
| 36 |
+
id TEXT PRIMARY KEY,
|
| 37 |
+
email TEXT UNIQUE,
|
| 38 |
+
name TEXT,
|
| 39 |
+
role TEXT,
|
| 40 |
+
department TEXT,
|
| 41 |
+
title TEXT,
|
| 42 |
+
region TEXT,
|
| 43 |
+
quota REAL,
|
| 44 |
+
created_at TEXT,
|
| 45 |
+
last_login TEXT
|
| 46 |
+
);
|
| 47 |
+
|
| 48 |
+
CREATE TABLE IF NOT EXISTS accounts (
|
| 49 |
+
id TEXT PRIMARY KEY,
|
| 50 |
+
name TEXT,
|
| 51 |
+
parent_account_id TEXT,
|
| 52 |
+
industry TEXT,
|
| 53 |
+
status TEXT,
|
| 54 |
+
website TEXT,
|
| 55 |
+
annual_revenue REAL,
|
| 56 |
+
employee_count INTEGER,
|
| 57 |
+
technology_stack TEXT,
|
| 58 |
+
region TEXT,
|
| 59 |
+
address TEXT,
|
| 60 |
+
account_owner_id TEXT,
|
| 61 |
+
engagement_score REAL,
|
| 62 |
+
created_at TEXT,
|
| 63 |
+
last_activity_at TEXT,
|
| 64 |
+
FOREIGN KEY (parent_account_id) REFERENCES accounts (id),
|
| 65 |
+
FOREIGN KEY (account_owner_id) REFERENCES users (id)
|
| 66 |
+
);
|
| 67 |
+
|
| 68 |
+
CREATE TABLE IF NOT EXISTS contacts (
|
| 69 |
+
id TEXT PRIMARY KEY,
|
| 70 |
+
account_id TEXT,
|
| 71 |
+
first_name TEXT,
|
| 72 |
+
last_name TEXT,
|
| 73 |
+
email TEXT,
|
| 74 |
+
phone TEXT,
|
| 75 |
+
title TEXT,
|
| 76 |
+
department TEXT,
|
| 77 |
+
reports_to_id TEXT,
|
| 78 |
+
influence_level TEXT,
|
| 79 |
+
engagement_score REAL,
|
| 80 |
+
preferences TEXT,
|
| 81 |
+
created_at TEXT,
|
| 82 |
+
last_contacted TEXT,
|
| 83 |
+
FOREIGN KEY (account_id) REFERENCES accounts (id),
|
| 84 |
+
FOREIGN KEY (reports_to_id) REFERENCES contacts (id)
|
| 85 |
+
);
|
| 86 |
''')
|
| 87 |
|
| 88 |
def generate_synthetic_data(self):
|
|
|
|
| 265 |
:title, :department, :reports_to_id, :influence_level,
|
| 266 |
:engagement_score, :preferences, :created_at, :last_contacted
|
| 267 |
)''', contacts)
|
| 268 |
+
def get_user_by_email(self, email: str) -> Optional[Dict]:
|
| 269 |
+
with self.get_db() as conn:
|
| 270 |
+
cursor = conn.execute(
|
| 271 |
+
"SELECT * FROM users WHERE email = ?",
|
| 272 |
+
(email,)
|
| 273 |
+
)
|
| 274 |
+
row = cursor.fetchone()
|
| 275 |
+
if row:
|
| 276 |
+
return dict(row)
|
| 277 |
+
return None
|
| 278 |
+
|
| 279 |
def get_user_accounts(self, user_id: str) -> List[Dict]:
|
| 280 |
"""Get accounts associated with user"""
|
| 281 |
with self.get_db() as conn:
|
|
|
|
| 286 |
ORDER BY a.name
|
| 287 |
""", (user_id,))
|
| 288 |
return [dict(row) for row in cursor.fetchall()]
|
| 289 |
+
def get_account_metrics(self, account_id: str) -> Dict:
|
| 290 |
+
with self.get_db() as conn:
|
| 291 |
+
contacts_count = conn.execute(
|
| 292 |
+
"SELECT COUNT(*) FROM contacts WHERE account_id = ?",
|
| 293 |
+
(account_id,)
|
| 294 |
+
).fetchone()[0]
|
| 295 |
+
|
| 296 |
+
return {
|
| 297 |
+
'contact_count': contacts_count,
|
| 298 |
+
'interaction_count': 0, # Default for now
|
| 299 |
+
'avg_sentiment': 0 # Default for now
|
| 300 |
+
}
|