Commit 167d342e authored by George Papathanail's avatar George Papathanail
Browse files

feat: add qod_sessions persistence layer

parent 1bf9d598
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ from open_exposure_gateway.adapters.database.sql import (
    CallbackDeliveryRow,
    CallbackRegistrationRow,
    OperationRow,
    QodSessionRow,
)
from open_exposure_gateway.domain.models import (
    AppInstance,
@@ -11,6 +12,7 @@ from open_exposure_gateway.domain.models import (
    CallbackDelivery,
    CallbackRegistration,
    Operation,
    QodSession,
)


@@ -108,6 +110,34 @@ class AppInstanceMapper:
        )


class QodSessionMapper:
    @staticmethod
    def to_domain(row: QodSessionRow) -> QodSession:
        return QodSession(
            session_id=row.session_id,
            operation_id=row.operation_id,
            service_specification_id=row.service_specification_id,
            qos_profile=row.qos_profile,
            duration_seconds=row.duration_seconds,
            state=row.state,
            external_ref=row.external_ref,
            created_at=row.created_at,
            updated_at=row.updated_at,
        )

    @staticmethod
    def to_row(domain: QodSession) -> QodSessionRow:
        return QodSessionRow(
            session_id=domain.session_id,
            operation_id=domain.operation_id,
            service_specification_id=domain.service_specification_id,
            qos_profile=domain.qos_profile,
            duration_seconds=domain.duration_seconds,
            state=domain.state,
            external_ref=domain.external_ref,
        )


class CallbackRegistrationMapper:
    @staticmethod
    def to_domain(row: CallbackRegistrationRow) -> CallbackRegistration:
+27 −0
Original line number Diff line number Diff line
from uuid import UUID

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from open_exposure_gateway.adapters.database.mappers import QodSessionMapper
from open_exposure_gateway.adapters.database.sql import QodSessionRow
from open_exposure_gateway.domain.models import QodSession
from open_exposure_gateway.ports.database.qod_sessions import QodSessionRepository


class SqlQodSessionRepository(QodSessionRepository):
    def __init__(self, session: AsyncSession) -> None:
        self._session = session

    async def get_by_id(self, session_id: UUID) -> QodSession | None:
        stmt = select(QodSessionRow).where(QodSessionRow.session_id == session_id)
        row = await self._session.scalar(stmt)
        return QodSessionMapper.to_domain(row) if row is not None else None

    async def save(self, qod_session: QodSession) -> QodSession:
        merged = await self._session.merge(QodSessionMapper.to_row(qod_session))
        await self._session.flush()
        saved = await self.get_by_id(merged.session_id)
        if saved is None:
            raise RuntimeError("Saved QoD session could not be reloaded")
        return saved
+16 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ from open_exposure_gateway.domain.models.operations.enums import (
    OperationStatus,
    OperationType,
)
from open_exposure_gateway.domain.models.qod_sessions.enums import QodSessionState
from open_exposure_gateway.domain.models.registration.enums import (
    AppRegistrationStatus,
    PackageType,
@@ -184,3 +185,18 @@ class AppInstanceRow(AuditedMixin, Base):
    )
    edge_cloud_zone_id: Mapped[UUID] = mapped_column(PG_UUID(as_uuid=True), nullable=False)
    state: Mapped[AppInstanceState] = mapped_column(_enum_type(AppInstanceState), nullable=False)


class QodSessionRow(AuditedMixin, Base):
    __tablename__ = "qod_sessions"
    __table_args__ = (Index("idx_qod_sessions_operation", "operation_id"),)

    session_id: Mapped[UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True)
    operation_id: Mapped[UUID] = mapped_column(
        ForeignKey("operations.operation_id"), nullable=False
    )
    service_specification_id: Mapped[UUID] = mapped_column(PG_UUID(as_uuid=True), nullable=False)
    qos_profile: Mapped[str] = mapped_column(String(256), nullable=False)
    duration_seconds: Mapped[int] = mapped_column(Integer, nullable=False)
    state: Mapped[QodSessionState] = mapped_column(_enum_type(QodSessionState), nullable=False)
    external_ref: Mapped[str | None] = mapped_column(String(255))
+3 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ from open_exposure_gateway.domain.models.operations import (
    OperationStatus,
    OperationType,
)
from open_exposure_gateway.domain.models.qod_sessions import QodSession, QodSessionState
from open_exposure_gateway.domain.models.registration import (
    AppRegistration,
    AppRegistrationStatus,
@@ -25,4 +26,6 @@ __all__ = [
    "OperationStatus",
    "OperationType",
    "PackageType",
    "QodSession",
    "QodSessionState",
]
+4 −0
Original line number Diff line number Diff line
from open_exposure_gateway.domain.models.qod_sessions.enums import QodSessionState
from open_exposure_gateway.domain.models.qod_sessions.models import QodSession

__all__ = ["QodSession", "QodSessionState"]
Loading