from __future__ import annotations from typing import Any, Dict, Optional import psycopg def is_db_enabled(cfg: Dict[str, Any]) -> bool: return bool(cfg.get("db_enabled", False)) def _dsn(cfg: Dict[str, Any]) -> str: return ( f"host={cfg.get('db_host', '')} " f"port={int(cfg.get('db_port', 5432) or 5432)} " f"dbname={cfg.get('db_name', 'postgres')} " f"user={cfg.get('db_user', '')} " f"password={cfg.get('db_password', '')} " "connect_timeout=10" ) def save_registered_account(cfg: Dict[str, Any], record: Dict[str, Any]) -> Dict[str, Any]: if not is_db_enabled(cfg): return {"ok": False, "skipped": True, "reason": "db_disabled"} table = str(cfg.get("db_table", "registered_accounts") or "registered_accounts").strip() source = str(cfg.get("db_source", "standalone_cli") or "standalone_cli").strip() payload = { "email": str(record.get("email") or "").strip() or None, "chatgpt_password": str(record.get("chatgpt_password") or "").strip() or None, "mail_password": str(record.get("mail_password") or "").strip() or None, "oauth_status": str(record.get("oauth_status") or "oauth=ok").strip() or "oauth=ok", "mail_token": str(record.get("mail_token") or "").strip() or None, "name": str(record.get("name") or "").strip() or None, "birthdate": str(record.get("birthdate") or "").strip() or None, "source": str(record.get("source") or source).strip() or source, } if not payload["email"]: return {"ok": False, "error": "missing email"} sql = f""" INSERT INTO {table} ( email, chatgpt_password, mail_password, oauth_status, created_at, updated_at, mail_token, name, birthdate, source ) VALUES ( %(email)s, %(chatgpt_password)s, %(mail_password)s, %(oauth_status)s, NOW(), NOW(), %(mail_token)s, %(name)s, %(birthdate)s, %(source)s ) """ with psycopg.connect(_dsn(cfg)) as conn: with conn.cursor() as cur: cur.execute(sql, payload) conn.commit() return {"ok": True, "skipped": False, "table": table, "email": payload["email"]}