Register all active platform services and base features in core DB so admin can manage them, add delivery/hospitality/sports-center backend phases, update apps catalog and production deploy tooling. Co-authored-by: Cursor <cursoragent@cursor.com>
143 lines
4.3 KiB
Python
143 lines
4.3 KiB
Python
"""Delivery foundation repositories."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Sequence
|
|
from uuid import UUID
|
|
|
|
from sqlalchemy import select
|
|
|
|
from app.models.foundation import (
|
|
DeliveryAuditLog,
|
|
DeliveryConfiguration,
|
|
DeliveryHub,
|
|
DeliveryOrganization,
|
|
DeliveryPermission,
|
|
DeliveryRole,
|
|
DeliverySetting,
|
|
ExternalProviderConfig,
|
|
RoutingEngineRegistration,
|
|
)
|
|
from app.repositories.base import TenantBaseRepository
|
|
|
|
|
|
class DeliveryOrganizationRepository(TenantBaseRepository[DeliveryOrganization]):
|
|
model = DeliveryOrganization
|
|
|
|
async def get_by_code(
|
|
self, tenant_id: UUID, code: str
|
|
) -> DeliveryOrganization | None:
|
|
stmt = select(self.model).where(
|
|
self.model.tenant_id == tenant_id,
|
|
self.model.code == code,
|
|
self.model.is_deleted.is_(False),
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
class DeliveryHubRepository(TenantBaseRepository[DeliveryHub]):
|
|
model = DeliveryHub
|
|
|
|
async def list_by_organization(
|
|
self, tenant_id: UUID, organization_id: UUID, *, offset: int = 0, limit: int = 20
|
|
) -> Sequence[DeliveryHub]:
|
|
stmt = (
|
|
select(self.model)
|
|
.where(
|
|
self.model.tenant_id == tenant_id,
|
|
self.model.organization_id == organization_id,
|
|
self.model.is_deleted.is_(False),
|
|
)
|
|
.offset(offset)
|
|
.limit(limit)
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalars().all()
|
|
|
|
|
|
class DeliveryRoleRepository(TenantBaseRepository[DeliveryRole]):
|
|
model = DeliveryRole
|
|
|
|
|
|
class DeliveryPermissionRepository(TenantBaseRepository[DeliveryPermission]):
|
|
model = DeliveryPermission
|
|
|
|
|
|
class ExternalProviderConfigRepository(TenantBaseRepository[ExternalProviderConfig]):
|
|
model = ExternalProviderConfig
|
|
|
|
async def get_by_code(
|
|
self, tenant_id: UUID, code: str
|
|
) -> ExternalProviderConfig | None:
|
|
stmt = select(self.model).where(
|
|
self.model.tenant_id == tenant_id,
|
|
self.model.code == code,
|
|
self.model.is_deleted.is_(False),
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
class RoutingEngineRegistrationRepository(
|
|
TenantBaseRepository[RoutingEngineRegistration]
|
|
):
|
|
model = RoutingEngineRegistration
|
|
|
|
|
|
class DeliveryConfigurationRepository(TenantBaseRepository[DeliveryConfiguration]):
|
|
model = DeliveryConfiguration
|
|
|
|
|
|
class DeliverySettingRepository(TenantBaseRepository[DeliverySetting]):
|
|
model = DeliverySetting
|
|
|
|
async def get_by_key(
|
|
self,
|
|
tenant_id: UUID,
|
|
key: str,
|
|
*,
|
|
organization_id: UUID | None = None,
|
|
hub_id: UUID | None = None,
|
|
) -> DeliverySetting | None:
|
|
clauses = [
|
|
self.model.tenant_id == tenant_id,
|
|
self.model.key == key,
|
|
self.model.is_deleted.is_(False),
|
|
]
|
|
if organization_id is None:
|
|
clauses.append(self.model.organization_id.is_(None))
|
|
else:
|
|
clauses.append(self.model.organization_id == organization_id)
|
|
if hub_id is None:
|
|
clauses.append(self.model.hub_id.is_(None))
|
|
else:
|
|
clauses.append(self.model.hub_id == hub_id)
|
|
stmt = select(self.model).where(*clauses)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
|
|
class DeliveryAuditLogRepository(TenantBaseRepository[DeliveryAuditLog]):
|
|
model = DeliveryAuditLog
|
|
|
|
async def list_for_entity(
|
|
self,
|
|
tenant_id: UUID,
|
|
entity_type: str,
|
|
entity_id: UUID,
|
|
*,
|
|
limit: int = 100,
|
|
) -> Sequence[DeliveryAuditLog]:
|
|
stmt = (
|
|
select(self.model)
|
|
.where(
|
|
self.model.tenant_id == tenant_id,
|
|
self.model.entity_type == entity_type,
|
|
self.model.entity_id == entity_id,
|
|
)
|
|
.order_by(self.model.created_at.desc())
|
|
.limit(limit)
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalars().all()
|