gmail_accounts = relationship("GmailAccount", back_populates="user", cascade="all, delete-orphan") audit_logs = relationship("AuditLog", back_populates="user") class OAuthClientConfig(Base, TimestampMixin): """An imported Google OAuth client configuration (from client_secret JSON). Secrets stored encrypted. Multiple configs may exist (e.g. per project).""" __tablename__ = "oauth_client_configs" id = Column(Integer, primary_key=True) name = Column(String(200), nullable=False) client_id = Column(String(300), nullable=False) client_secret_enc = Column(String(600), nullable=False) # encrypted redirect_uri = Column(String(500), default="") project_id = Column(String(200), default="") is_active = Column(Boolean, default=True, nullable=False) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE")) @property def client_secret(self) -> str: return encryption.decrypt(self.client_secret_enc) @client_secret.setter def client_secret(self, value: str) -> None: self.client_secret_enc = encryption.encrypt(value) class GmailAccount(Base, TimestampMixin): __tablename__ = "gmail_accounts"