D Ф m i И i q ц e L Ф y e r commited on
Commit ·
4016d03
1
Parent(s): ccc6b51
Add sources table sync to Supabase
Browse files- syscred/backend_app.py +26 -2
- syscred/database.py +44 -0
syscred/backend_app.py
CHANGED
|
@@ -424,12 +424,23 @@ def verify_endpoint():
|
|
| 424 |
|
| 425 |
# [NEW] Persist to Database (SQLite + Supabase REST)
|
| 426 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 427 |
# Save to SQLite
|
| 428 |
new_analysis = AnalysisResult(
|
| 429 |
url=input_data[:500],
|
| 430 |
credibility_score=result.get('scoreCredibilite', 0.5),
|
| 431 |
summary=result.get('resumeAnalyse', ''),
|
| 432 |
-
source_reputation=
|
| 433 |
)
|
| 434 |
db.session.add(new_analysis)
|
| 435 |
db.session.commit()
|
|
@@ -444,9 +455,22 @@ def verify_endpoint():
|
|
| 444 |
'url': input_data[:500],
|
| 445 |
'credibility_score': result.get('scoreCredibilite', 0.5),
|
| 446 |
'summary': result.get('resumeAnalyse', ''),
|
| 447 |
-
'source_reputation':
|
| 448 |
})
|
| 449 |
print(f"[SysCRED-DB] Result synced to Supabase")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 450 |
except Exception as supabase_err:
|
| 451 |
print(f"[SysCRED-DB] Supabase sync failed: {supabase_err}")
|
| 452 |
|
|
|
|
| 424 |
|
| 425 |
# [NEW] Persist to Database (SQLite + Supabase REST)
|
| 426 |
try:
|
| 427 |
+
# Extract domain for sources table
|
| 428 |
+
domain = None
|
| 429 |
+
if credibility_system and credibility_system.is_url(input_data):
|
| 430 |
+
try:
|
| 431 |
+
from urllib.parse import urlparse
|
| 432 |
+
domain = urlparse(input_data).netloc
|
| 433 |
+
except:
|
| 434 |
+
pass
|
| 435 |
+
|
| 436 |
+
source_reputation = result.get('detailsScore', {}).get('factors', [{}])[0].get('value')
|
| 437 |
+
|
| 438 |
# Save to SQLite
|
| 439 |
new_analysis = AnalysisResult(
|
| 440 |
url=input_data[:500],
|
| 441 |
credibility_score=result.get('scoreCredibilite', 0.5),
|
| 442 |
summary=result.get('resumeAnalyse', ''),
|
| 443 |
+
source_reputation=source_reputation
|
| 444 |
)
|
| 445 |
db.session.add(new_analysis)
|
| 446 |
db.session.commit()
|
|
|
|
| 455 |
'url': input_data[:500],
|
| 456 |
'credibility_score': result.get('scoreCredibilite', 0.5),
|
| 457 |
'summary': result.get('resumeAnalyse', ''),
|
| 458 |
+
'source_reputation': source_reputation
|
| 459 |
})
|
| 460 |
print(f"[SysCRED-DB] Result synced to Supabase")
|
| 461 |
+
|
| 462 |
+
# Sync source (domain)
|
| 463 |
+
if domain and source_reputation:
|
| 464 |
+
# Convert reputation to numeric score
|
| 465 |
+
rep_score = 0.5
|
| 466 |
+
if source_reputation in ['High', 'high', '5 found']:
|
| 467 |
+
rep_score = 0.8
|
| 468 |
+
elif source_reputation in ['Medium', 'medium']:
|
| 469 |
+
rep_score = 0.5
|
| 470 |
+
elif source_reputation in ['Low', 'low', 'Unknown']:
|
| 471 |
+
rep_score = 0.2
|
| 472 |
+
|
| 473 |
+
supabase.upsert_source(domain, rep_score)
|
| 474 |
except Exception as supabase_err:
|
| 475 |
print(f"[SysCRED-DB] Supabase sync failed: {supabase_err}")
|
| 476 |
|
syscred/database.py
CHANGED
|
@@ -78,6 +78,50 @@ class SupabaseClient:
|
|
| 78 |
except Exception as e:
|
| 79 |
print(f"[Supabase REST] Count error: {e}")
|
| 80 |
return 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
|
| 83 |
# Global Supabase client
|
|
|
|
| 78 |
except Exception as e:
|
| 79 |
print(f"[Supabase REST] Count error: {e}")
|
| 80 |
return 0
|
| 81 |
+
|
| 82 |
+
def upsert_source(self, domain, reputation_score, analysis_count=1):
|
| 83 |
+
"""Insert or update a source (domain) in sources table."""
|
| 84 |
+
try:
|
| 85 |
+
# First check if source exists
|
| 86 |
+
existing = self.select('sources', {'domain': f'eq.{domain}'})
|
| 87 |
+
|
| 88 |
+
if existing:
|
| 89 |
+
# Update existing source
|
| 90 |
+
current = existing[0]
|
| 91 |
+
new_count = current.get('analysis_count', 0) + analysis_count
|
| 92 |
+
|
| 93 |
+
# Use PATCH to update
|
| 94 |
+
response = requests.patch(
|
| 95 |
+
f"{self.url}/rest/v1/sources?domain=eq.{domain}",
|
| 96 |
+
json={
|
| 97 |
+
'reputation_score': reputation_score,
|
| 98 |
+
'analysis_count': new_count
|
| 99 |
+
},
|
| 100 |
+
headers=self.headers
|
| 101 |
+
)
|
| 102 |
+
if response.status_code in [200, 204]:
|
| 103 |
+
print(f"[Supabase] Updated source: {domain} (count: {new_count})")
|
| 104 |
+
return True
|
| 105 |
+
else:
|
| 106 |
+
# Insert new source
|
| 107 |
+
response = requests.post(
|
| 108 |
+
f"{self.url}/rest/v1/sources",
|
| 109 |
+
json={
|
| 110 |
+
'domain': domain,
|
| 111 |
+
'reputation_score': reputation_score,
|
| 112 |
+
'analysis_count': analysis_count
|
| 113 |
+
},
|
| 114 |
+
headers=self.headers
|
| 115 |
+
)
|
| 116 |
+
if response.status_code in [200, 201]:
|
| 117 |
+
print(f"[Supabase] Inserted new source: {domain}")
|
| 118 |
+
return True
|
| 119 |
+
|
| 120 |
+
print(f"[Supabase] Source upsert failed: {response.status_code} - {response.text[:100]}")
|
| 121 |
+
return False
|
| 122 |
+
except Exception as e:
|
| 123 |
+
print(f"[Supabase REST] Upsert source error: {e}")
|
| 124 |
+
return False
|
| 125 |
|
| 126 |
|
| 127 |
# Global Supabase client
|