import os import base64 from dotenv import load_dotenv from sqlalchemy import Column, Integer, String from backend.ConexionSql.Base_conexion import ConexionBase from backend.base import Base from backend.ApiKeys.openai_apikey import OpenAICredencial from security.Encriptar import Encriptar_fernet from entrypoint import ENV_PATH # ---------------------- # Cargar clave maestra # ---------------------- load_dotenv(ENV_PATH) pssword = os.getenv('MASTER_PASSWORD') if pssword is None: raise ValueError("MASTER_PASSWORD no está definida en el archivo .env") # ---------------------- # MODELO (SQLAlchemy) # ---------------------- class OpenAICredencialModel(Base): __tablename__ = 'openai_credenciales' id = Column(Integer, primary_key=True) titulo = Column(String, nullable=False) api_key = Column(String, nullable=False) # Encriptada como base64 string organizacion = Column(String, nullable=True) # ---------------------- # MAPPER # ---------------------- class OpenAICredencialMapper: @staticmethod def to_dict(obj: OpenAICredencial) -> dict: return { "titulo": obj.titulo, "api_key": base64.b64encode( Encriptar_fernet.encriptar(obj.api_key, pssword) ).decode('utf-8'), "organizacion": obj.organizacion } @staticmethod def from_dict(data: dict) -> OpenAICredencial: return OpenAICredencial( titulo=data["titulo"], api_key=Encriptar_fernet.desencriptar( base64.b64decode(data["api_key"]), pssword ), organizacion=data.get("organizacion") ) @staticmethod def from_model(model: OpenAICredencialModel) -> OpenAICredencial: return OpenAICredencial( titulo=model.titulo, api_key=Encriptar_fernet.desencriptar( base64.b64decode(model.api_key), pssword ), organizacion=model.organizacion ) # ---------------------- # REPO # ---------------------- class OpenAICredencialRepo: def __init__(self, conexion: ConexionBase): self.session = conexion.get_session() def add(self, credencial: OpenAICredencial) -> int: data = OpenAICredencialMapper.to_dict(credencial) model = OpenAICredencialModel(**data) self.session.add(model) self.session.commit() return model.id def get_all(self) -> list[OpenAICredencial]: models = self.session.query(OpenAICredencialModel).all() return [OpenAICredencialMapper.from_model(m) for m in models] def get_by_titulo(self, titulo: str) -> OpenAICredencial | None: model = self.session.query(OpenAICredencialModel).filter_by(titulo=titulo).first() return OpenAICredencialMapper.from_model(model) if model else None def get_by_id(self, id_: int) -> OpenAICredencial | None: model = self.session.get(OpenAICredencialModel, id_) return OpenAICredencialMapper.from_model(model) if model else None