51 lines
2.1 KiB
Python
Executable File
51 lines
2.1 KiB
Python
Executable File
# /opt/docker/dev/service_finder/backend/app/models/security.py
|
|
import enum
|
|
from datetime import datetime
|
|
from typing import Optional, TYPE_CHECKING
|
|
from sqlalchemy import String, Integer, ForeignKey, DateTime, text, Enum
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
from sqlalchemy.sql import func
|
|
|
|
# MB 2.0: Központi aszinkron adatbázis motorból származó Base
|
|
from app.database import Base
|
|
|
|
if TYPE_CHECKING:
|
|
from .identity import User
|
|
|
|
class ActionStatus(str, enum.Enum):
|
|
pending = "pending"
|
|
approved = "approved"
|
|
rejected = "rejected"
|
|
expired = "expired"
|
|
|
|
class PendingAction(Base):
|
|
""" Sentinel: Kritikus műveletek jóváhagyási lánca. """
|
|
__tablename__ = "pending_actions"
|
|
__table_args__ = {"schema": "system"}
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
|
|
|
|
# JAVÍTÁS: A User az identity sémában van, nem a data-ban!
|
|
requester_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False)
|
|
approver_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=True)
|
|
|
|
status: Mapped[ActionStatus] = mapped_column(
|
|
Enum(ActionStatus, name="actionstatus", schema="system"),
|
|
default=ActionStatus.pending
|
|
)
|
|
|
|
action_type: Mapped[str] = mapped_column(String(50)) # pl. "WALLET_ADJUST"
|
|
payload: Mapped[dict] = mapped_column(JSONB, nullable=False)
|
|
reason: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
|
|
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
|
expires_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True),
|
|
server_default=text("now() + interval '24 hours'")
|
|
)
|
|
processed_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
|
|
|
|
# Kapcsolatok meghatározása (String hivatkozással a körkörös import ellen)
|
|
requester: Mapped["User"] = relationship("User", foreign_keys=[requester_id])
|
|
approver: Mapped[Optional["User"]] = relationship("User", foreign_keys=[approver_id]) |