import json import os import sys from app.db.models.providers import Provider from app.utils.logger import get_logger from app.db.engine import get_engine, Base, get_db logger = get_logger(__name__) def get_builtin_providers_path(): if getattr(sys, 'frozen', False): base_path = sys._MEIPASS else: base_path = os.path.dirname(__file__) return os.path.join(base_path, 'builtin_providers.json') def seed_default_providers(): db = next(get_db()) try: if db.query(Provider).count() > 0: logger.info("Providers already exist, skipping seed.") return json_path = get_builtin_providers_path() try: with open(json_path, 'r', encoding='utf-8') as f: providers = json.load(f) except Exception as e: logger.error(f"Failed to read builtin_providers.json: {e}") return for p in providers: db.add(Provider( id=p['id'], name=p['name'], api_key=p['api_key'], base_url=p['base_url'], logo=p['logo'], type=p['type'], enabled=p.get('enabled', 1) )) db.commit() logger.info("Default providers seeded successfully.") except Exception as e: logger.error(f"Failed to seed default providers: {e}") finally: db.close() def insert_provider(id: str, name: str, api_key: str, base_url: str, logo: str, type_: str, enabled: int = 1): db = next(get_db()) try: provider = Provider(id=id, name=name, api_key=api_key, base_url=base_url, logo=logo, type=type_, enabled=enabled) db.add(provider) db.commit() logger.info(f"Provider inserted successfully. id: {id}, name: {name}, type: {type_}") return id except Exception as e: logger.error(f"Failed to insert provider: {e}") finally: db.close() def get_enabled_providers(): db = next(get_db()) try: return db.query(Provider).filter_by(enabled=1).all() finally: db.close() def get_provider_by_name(name: str): db = next(get_db()) try: return db.query(Provider).filter_by(name=name).first() finally: db.close() def get_provider_by_id(id: str): db = next(get_db()) try: return db.query(Provider).filter_by(id=id).first() finally: db.close() def get_all_providers(): db = next(get_db()) try: return db.query(Provider).all() finally: db.close() def update_provider(id: str, **kwargs): db = next(get_db()) try: provider = db.query(Provider).filter_by(id=id).first() if not provider: logger.warning(f"Provider {id} not found for update.") return for key, value in kwargs.items(): if hasattr(provider, key): setattr(provider, key, value) db.commit() logger.info(f"Provider updated successfully. id: {id}, updated_fields: {list(kwargs.keys())}") except Exception as e: logger.error(f"Failed to update provider: {e}") finally: db.close() def delete_provider(id: str): db = next(get_db()) try: provider = db.query(Provider).filter_by(id=id).first() if provider: db.delete(provider) db.commit() logger.info(f"Provider deleted successfully. id: {id}") except Exception as e: logger.error(f"Failed to delete provider: {e}") finally: db.close()