36 lines
1.7 KiB
Python
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)
|