TorbatYar/backend/services/communication/app/api/v1/providers.py
Mortezakoohjani e41ecfad4c Sync platform docs, infra, and module services with Accounting integration.
Include Loyalty/Communication/Sports Center backends and registry updates alongside production nginx and compose wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-25 22:35:23 +03:30

128 lines
4.3 KiB
Python

from uuid import UUID
from fastapi import APIRouter, Depends
from app.api.deps import AsyncSession, CurrentUser, get_db, require_tenant
from app.api.permissions import require_permissions
from app.permissions.definitions import PROVIDERS_MANAGE, PROVIDERS_VIEW, SENDERS_MANAGE, SENDERS_VIEW
from app.schemas.common import (
ProviderCreate,
ProviderOut,
ProviderStatusOut,
ProviderUpdate,
SenderCreate,
SenderOut,
)
from app.services.monitoring_service import MonitoringService
from app.services.provider_service import ProviderService
router = APIRouter()
@router.get("", response_model=list[ProviderOut])
async def list_providers(
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(PROVIDERS_VIEW)),
):
return await ProviderService(session).list(tenant_id)
@router.post("", response_model=ProviderOut, status_code=201)
async def create_provider(
body: ProviderCreate,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
user: CurrentUser = Depends(require_permissions(PROVIDERS_MANAGE)),
):
return await ProviderService(session).create(
tenant_id, body.model_dump(), actor_id=user.user_id
)
@router.get("/status", response_model=list[ProviderStatusOut])
async def providers_status(
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(PROVIDERS_VIEW)),
):
return await MonitoringService(session).providers_status(tenant_id)
@router.get("/{provider_id}", response_model=ProviderOut)
async def get_provider(
provider_id: UUID,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(PROVIDERS_VIEW)),
):
return await ProviderService(session).get(tenant_id, provider_id)
@router.patch("/{provider_id}", response_model=ProviderOut)
async def update_provider(
provider_id: UUID,
body: ProviderUpdate,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
user: CurrentUser = Depends(require_permissions(PROVIDERS_MANAGE)),
):
return await ProviderService(session).update(
tenant_id,
provider_id,
body.model_dump(exclude_unset=True),
actor_id=user.user_id,
)
@router.delete("/{provider_id}", status_code=204)
async def delete_provider(
provider_id: UUID,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
user: CurrentUser = Depends(require_permissions(PROVIDERS_MANAGE)),
):
await ProviderService(session).delete(tenant_id, provider_id, actor_id=user.user_id)
@router.get("/{provider_id}/balance")
async def provider_balance(
provider_id: UUID,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(PROVIDERS_VIEW)),
):
balance = await ProviderService(session).get_balance(tenant_id, provider_id)
return {"provider_id": provider_id, "balance": balance}
@router.post("/{provider_id}/health")
async def provider_health(
provider_id: UUID,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(PROVIDERS_VIEW)),
):
return await ProviderService(session).health_probe(tenant_id, provider_id)
@router.post("/senders", response_model=SenderOut, status_code=201)
async def create_sender(
body: SenderCreate,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
user: CurrentUser = Depends(require_permissions(SENDERS_MANAGE)),
):
return await ProviderService(session).create_sender(
tenant_id, body.model_dump(), actor_id=user.user_id
)
@router.get("/senders/list", response_model=list[SenderOut])
async def list_senders(
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(SENDERS_VIEW)),
):
return await ProviderService(session).list_senders(tenant_id)