import db DEFAULT_CHANNELS = [ ("stable", "正式版", 1, 10), ("preview", "预览版", 1, 20), ("dev", "开发版", 1, 30), ] def list_apps() -> list[dict]: conn = db.get_conn() rows = conn.execute("SELECT app_id, app_name FROM apps").fetchall() conn.close() return [{"app_id": row["app_id"], "app_name": row["app_name"]} for row in rows] def add_app_with_default_channels(app_id: str, app_name: str): conn = db.get_conn() try: conn.execute("INSERT INTO apps(app_id, app_name) VALUES (?, ?)", (app_id, app_name)) conn.executemany( "INSERT INTO channels(app_id,channel_code,display_name,enabled,sort_order) VALUES(?,?,?,?,?)", [(app_id, code, name, enabled, order) for code, name, enabled, order in DEFAULT_CHANNELS], ) conn.commit() except Exception: conn.rollback() raise finally: conn.close() def app_exists(app_id: str) -> bool: conn = db.get_conn() row = conn.execute("SELECT 1 FROM apps WHERE app_id=?", (app_id,)).fetchone() conn.close() return bool(row) def get_app(app_id: str): conn = db.get_conn() row = conn.execute("SELECT app_id, app_name FROM apps WHERE app_id=?", (app_id,)).fetchone() conn.close() return row def list_channels(app_id: str, include_disabled: bool = True) -> list[dict]: conn = db.get_conn() sql = ( "SELECT channel_code,display_name,enabled,sort_order FROM channels WHERE app_id=?" + ("" if include_disabled else " AND enabled=1") + " ORDER BY sort_order,channel_code" ) rows = conn.execute(sql, (app_id,)).fetchall() conn.close() return [ { "channel_code": row["channel_code"], "display_name": row["display_name"], "enabled": bool(row["enabled"]), "sort_order": row["sort_order"], } for row in rows ] def get_channel(app_id: str, channel: str): conn = db.get_conn() row = conn.execute("SELECT * FROM channels WHERE app_id=? AND channel_code=?", (app_id, channel)).fetchone() conn.close() return row def save_channel(app_id: str, code: str, name: str, enabled: bool, sort_order: int): conn = db.get_conn() try: conn.execute( """INSERT INTO channels(app_id,channel_code,display_name,enabled,sort_order) VALUES(?,?,?,?,?) ON CONFLICT(app_id,channel_code) DO UPDATE SET display_name=excluded.display_name, enabled=excluded.enabled, sort_order=excluded.sort_order, updated_at=datetime('now')""", (app_id, code, name, int(enabled), sort_order), ) conn.commit() except Exception: conn.rollback() raise finally: conn.close()