| """ |
| ORBIT – SQLAlchemy Models |
| Tables: User, UserSettings |
| """ |
| from datetime import datetime |
| from extensions import db |
|
|
|
|
| class User(db.Model): |
| __tablename__ = "user" |
|
|
| id = db.Column(db.Integer, primary_key=True) |
| google_id = db.Column(db.String(128), unique=True, nullable=False, index=True) |
| email = db.Column(db.String(254), unique=True, nullable=False) |
| name = db.Column(db.String(200), nullable=False) |
| picture = db.Column(db.String(1000), default="") |
| created_at = db.Column(db.DateTime, default=datetime.utcnow) |
| last_login = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
| |
| settings = db.relationship("UserSettings", back_populates="user", uselist=False, cascade="all, delete-orphan") |
| sessions = db.relationship("ChatSession", back_populates="user", cascade="all, delete-orphan") |
|
|
| def to_dict(self): |
| return { |
| "id": self.id, |
| "email": self.email, |
| "name": self.name, |
| "picture": self.picture, |
| } |
|
|
|
|
| class UserSettings(db.Model): |
| __tablename__ = "user_settings" |
|
|
| id = db.Column(db.Integer, primary_key=True) |
| user_id = db.Column(db.Integer, db.ForeignKey("user.id"), unique=True, nullable=False) |
|
|
| |
| provider = db.Column(db.String(64), default="OpenRouter") |
| base_url = db.Column(db.String(512), default="https://openrouter.ai/api/v1/chat/completions") |
| api_key = db.Column(db.String(512), default="") |
| current_model = db.Column(db.String(256), default="baidu/cobuddy:free") |
|
|
| |
| models_openrouter = db.Column(db.JSON, nullable=False, default=list) |
| models_nvidia = db.Column(db.JSON, nullable=False, default=list) |
|
|
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
| |
| user = db.relationship("User", back_populates="settings") |
|
|
| def active_models(self): |
| """Return the model list for the currently selected provider.""" |
| if self.provider == "Nvidia NIM": |
| return self.models_nvidia or [] |
| return self.models_openrouter or [] |
|
|
| def to_dict(self, mask_key: bool = False): |
| key = self.api_key or "" |
| if mask_key and key: |
| key = key[:8] + "…" + key[-4:] |
| return { |
| "provider": self.provider, |
| "base_url": self.base_url, |
| "api_key": key, |
| "current_model": self.current_model, |
| "models_openrouter": self.models_openrouter or [], |
| "models_nvidia": self.models_nvidia or [], |
| "active_models": self.active_models(), |
| } |
|
|
|
|
| class ChatSession(db.Model): |
| __tablename__ = "chat_session" |
|
|
| id = db.Column(db.String(36), primary_key=True) |
| user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) |
| title = db.Column(db.String(255), default="New Chat") |
| messages = db.Column(db.JSON, nullable=False, default=list) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow) |
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
| |
| user = db.relationship("User", back_populates="sessions") |
|
|
| def to_dict(self): |
| return { |
| "id": self.id, |
| "title": self.title, |
| "messages": self.messages or [], |
| "created_at": self.created_at.isoformat() if self.created_at else None, |
| "updated_at": self.updated_at.isoformat() if self.updated_at else None, |
| } |
|
|