annator-atom / backend /scripts /production /seed_integrations.py
techprotrade's picture
Full stack ATOM backend + AIMONEYFLOW clients (port 7860) (part 6)
4e3c158 verified
Raw
History Blame Contribute Delete
4.64 kB
#!/usr/bin/env python3
import json
import os
from pathlib import Path
import re
import sys
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
# Add backend to path for imports
sys.path.append(str(Path(__file__).parent.parent))
from core.database import DATABASE_URL
from core.models import Base, IntegrationCatalog
def parse_ts_to_json(file_path):
"""Extracts the JSON array from a TypeScript export file"""
try:
content = Path(file_path).read_text(encoding="utf-8")
# Match the array part: export const NAME: Type[] = [ ... ];
match = re.search(r'=\s*(\[[\s\S]*\]);', content)
if not match:
print("Error: Could not find JSON array in {}".format(file_path))
return []
json_str = match.group(1)
# Clean up any trailing commas that JSON doesn't like but TS does
json_str = re.sub(r',(\s*[\]\}])', r'\1', json_str)
return json.loads(json_str)
except Exception as e:
print("Error parsing {}: {}".format(file_path, e))
return []
# Map Activepieces IDs to native Atom IDs
NATIVE_MAPPING = {
"@activepieces/piece-slack": "slack",
"@activepieces/piece-gmail": "gmail",
"@activepieces/piece-asana": "asana",
"@activepieces/piece-notion": "notion",
"@activepieces/piece-hubspot": "hubspot",
"@activepieces/piece-salesforce": "salesforce",
"@activepieces/piece-github": "github",
"@activepieces/piece-discord": "discord",
"@activepieces/piece-stripe": "stripe",
"@activepieces/piece-jira": "jira",
"@activepieces/piece-zendesk": "zendesk",
"@activepieces/piece-zoom": "zoom",
"@activepieces/piece-google-calendar": "google_calendar",
"@activepieces/piece-google-drive": "google_drive",
"@activepieces/piece-dropbox": "dropbox",
"@activepieces/piece-trello": "trello",
"@activepieces/piece-airtable": "airtable",
"@activepieces/piece-calendly": "calendly",
"@activepieces/piece-mailchimp": "mailchimp",
"@activepieces/piece-shopify": "shopify",
"@activepieces/piece-quickbooks": "quickbooks",
"@activepieces/piece-xero": "xero",
"@activepieces/piece-linear": "linear",
"@activepieces/piece-figma": "figma",
"@activepieces/piece-openai": "openai",
}
def seed_integrations():
print(f"Connecting to database: {DATABASE_URL}")
engine = create_engine(DATABASE_URL)
Session = sessionmaker(bind=engine)
session = Session()
# Ensure table exists (though migrations should handle this)
Base.metadata.create_all(engine)
# Path to the auto-generated pieces
ts_file = Path(__file__).parent.parent.parent / "frontend-nextjs" / "lib" / "auto-generated-pieces.ts"
if not ts_file.exists():
print(f"Error: {ts_file} not found. Run update-catalog.py first.")
return
pieces = parse_ts_to_json(ts_file)
print(f"Found {len(pieces)} pieces in {ts_file}")
# Add manual pieces if missing from auto-generated list
# For now, we trust the auto-generated list + our deduplication logic
count = 0
for p in pieces:
# Check if already exists
existing = session.query(IntegrationCatalog).filter_by(id=p['id']).first()
if existing:
# Update
existing.name = p['name']
existing.description = p.get('description', '')
existing.category = p['category']
existing.icon = p.get('icon', '')
existing.color = p.get('color', '#6366F1')
existing.auth_type = p.get('authType', 'none')
existing.triggers = p.get('triggers', [])
existing.actions = p.get('actions', [])
existing.native_id = NATIVE_MAPPING.get(p['id'])
else:
# Insert
new_piece = IntegrationCatalog(
id=p['id'],
name=p['name'],
description=p.get('description', ''),
category=p['category'],
icon=p.get('icon', ''),
color=p.get('color', '#6366F1'),
auth_type=p.get('authType', 'none'),
triggers=p.get('triggers', []),
actions=p.get('actions', []),
native_id=NATIVE_MAPPING.get(p['id'])
)
session.add(new_piece)
count += 1
if count % 100 == 0:
session.commit()
print(f"Processed {count} pieces...")
session.commit()
print(f"Successfully seeded {count} integrations into the database.")
session.close()
if __name__ == "__main__":
seed_integrations()