"""Datenquellen eines Workspace (→ Konzept 6, 7).""" from datetime import datetime from typing import Any from sqlalchemy import JSON, ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base, now # Datenbanken sind MCP-Verbindungen (app.mcp.databases) KINDS = ("git",) # new: angelegt, noch nicht getestet; ok: Verbindungstest erfolgreich; error: fehlgeschlagen STATUSES = ("new", "ok", "error") class DataSource(Base): __tablename__ = "data_sources" id: Mapped[int] = mapped_column(primary_key=True) workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id", ondelete="CASCADE"), index=True) kind: Mapped[str] = mapped_column(String(20)) name: Mapped[str] = mapped_column(String(200)) # Art-spezifisch, ohne Geheimnisse (z. B. url, branch) config: Mapped[dict[str, Any]] = mapped_column(JSON, default=dict) # Token des technischen Accounts, verschlüsselt (app.core.crypto); angezeigt nur die letzten Zeichen secret: Mapped[str | None] = mapped_column(String(2000)) secret_hint: Mapped[str] = mapped_column(String(10), default="") status: Mapped[str] = mapped_column(String(20), default="new") status_message: Mapped[str] = mapped_column(Text, default="") last_tested: Mapped[datetime | None] # Bestätigung des Workspace-Admins, dass alle Mitglieder diese Daten sehen dürfen (→ Konzept 5.5) exposure_confirmed_by: Mapped[int] = mapped_column(ForeignKey("users.id")) exposure_confirmed_at: Mapped[datetime] = mapped_column(default=now) created_by: Mapped[int] = mapped_column(ForeignKey("users.id")) created: Mapped[datetime] = mapped_column(default=now)