feat: Funcion de sistema tenants

This commit is contained in:
2026-02-23 13:01:24 -07:00
parent ceea67eb2b
commit 1ccc39732b
58 changed files with 1889 additions and 315 deletions

View File

@@ -6,12 +6,11 @@ Modelo para persistencia de refresh tokens con revocaci├│n y tracking.
from sqlalchemy import String, Boolean, DateTime, ForeignKey, Index, Integer
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.dialects.postgresql import UUID
from typing import Optional, TYPE_CHECKING
import uuid
from datetime import datetime
from datetime import datetime, timezone
from app.core.database import Base
from app.core.database import Base, GUID
if TYPE_CHECKING:
from app.models.user import User
@@ -36,7 +35,7 @@ class RefreshToken(Base):
# User relationship
user_id: Mapped[uuid.UUID] = mapped_column(
UUID(as_uuid=True),
GUID(),
ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
index=True
@@ -92,7 +91,7 @@ class RefreshToken(Base):
)
revoked_by: Mapped[Optional[uuid.UUID]] = mapped_column(
UUID(as_uuid=True),
GUID(),
ForeignKey("users.id", ondelete="SET NULL"),
nullable=True
)
@@ -146,12 +145,12 @@ class RefreshToken(Base):
- No está revocado
- No ha expirado
"""
return not self.revoked and self.expires_at > datetime.utcnow()
return not self.revoked and self.expires_at > datetime.now(timezone.utc)
@property
def is_expired(self) -> bool:
"""Verificar si el token ha expirado."""
return datetime.utcnow() >= self.expires_at
return datetime.now(timezone.utc) >= self.expires_at
def revoke(self, revoked_by: Optional[uuid.UUID] = None) -> None:
"""
@@ -161,11 +160,11 @@ class RefreshToken(Base):
revoked_by: ID del usuario que revoc├│ el token
"""
self.revoked = True
self.revoked_at = datetime.utcnow()
self.revoked_at = datetime.now(timezone.utc)
if revoked_by:
self.revoked_by = revoked_by
def track_usage(self) -> None:
"""Registrar uso del token."""
self.last_used_at = datetime.utcnow()
self.last_used_at = datetime.now(timezone.utc)
self.usage_count += 1