Files
leocrm/app/models/session.py
T
Agent Zero 20288da567
Check Cross-Plugin Imports / check (push) Has been cancelled
fix(cleanup): resolve 9 low-priority issues (P34-P42)
P34: Remove test_sample plugin from production code
P35: Remove CompanyContact=None dead code from contact.py
P36: Change Plugin.config from Text to JSONB (model + migration 0117 + service)
P37: Add AI comment about workspace overengineering in workspace.py
P38: Add container resource limits to docker-compose.yaml
P39: Guest TTL 1800 not found — already migrated to regular users
P40: Add AI comment about missing IP/Device binding in session.py
P41: Fix Redis healthcheck to use auth password
P42: RLS migration history comment already present in alembic/env.py
2026-08-06 13:43:47 +02:00

38 lines
1.3 KiB
Python

"""Session model — PostgreSQL audit trail for sessions.
⚠️ Session-Tabelle dient als audit trail. Redis ist der Runtime-Session-Store.
Dies ist ein bewusstes Dual-System.
⚠️ Sessions sind nicht an IP/Device gebunden (Design-Entscheidung).
Bei Bedarf IP-Binding hinzufügen.
"""
from __future__ import annotations
import uuid
from datetime import datetime
from sqlalchemy import DateTime, ForeignKey, String, func
from sqlalchemy.dialects.postgresql import UUID as PGUUID
from sqlalchemy.orm import Mapped, mapped_column
from app.core.db import Base, TenantMixin
class Session(Base, TenantMixin):
"""Immutable session audit record. Runtime session lookup uses Redis."""
__tablename__ = "sessions"
id: Mapped[uuid.UUID] = mapped_column(
PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4
)
user_id: Mapped[uuid.UUID] = mapped_column(
PGUUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True
)
csrf_token: Mapped[str] = mapped_column(String(255), nullable=False)
expires_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False, server_default=func.now()
)