| |
| import json |
| import os |
| from pathlib import Path |
| import re |
| import sys |
| from sqlalchemy import create_engine, text |
| from sqlalchemy.orm import sessionmaker |
|
|
| |
| 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 = 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) |
| |
| 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 [] |
|
|
| |
| 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() |
|
|
| |
| Base.metadata.create_all(engine) |
|
|
| |
| 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}") |
|
|
| |
| |
| |
| count = 0 |
| for p in pieces: |
| |
| existing = session.query(IntegrationCatalog).filter_by(id=p['id']).first() |
| |
| if existing: |
| |
| 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: |
| |
| 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() |
|
|