bifroest/app/data_sources/models.py
2026-10-27 08:34:17 +01:00

36 lines
1.7 KiB
Python

"""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)