45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
import logging
|
|
from typing import TYPE_CHECKING
|
|
|
|
from src import domain, dto
|
|
|
|
if TYPE_CHECKING:
|
|
from .. import Usecase
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
async def get_placement(self: 'Usecase', input: dto.GetPlacementInput) -> dto.PlacementOutput:
|
|
context = await self.ensure_workspace_permission(
|
|
input.workspace_id, input.user_id, domain.PermissionKey.PLACEMENTS_READ
|
|
)
|
|
|
|
placement = await self.database.get_placement(input.workspace_id, input.placement_id)
|
|
if not placement:
|
|
log.warning('Placement %s not found for user %s', input.placement_id, input.user_id)
|
|
raise domain.PlacementNotFound(input.placement_id)
|
|
|
|
context.ensure_project_permission(domain.PermissionKey.PLACEMENTS_READ, placement.project_id)
|
|
|
|
return dto.PlacementOutput(
|
|
id=placement.id,
|
|
project_id=placement.project_id,
|
|
project_channel_title=placement.project.channel.title,
|
|
placement_channel_id=placement.placement_channel_id,
|
|
placement_channel_title=placement.placement_channel.title,
|
|
creative_id=placement.creative_id,
|
|
creative_name=placement.creative.name,
|
|
placement_date=placement.placement_date,
|
|
cost=placement.cost,
|
|
comment=placement.comment,
|
|
ad_post_url=placement.ad_post_url,
|
|
invite_link_type=placement.invite_link_type,
|
|
invite_link=placement.invite_link,
|
|
status=placement.status,
|
|
subscriptions_count=placement.subscriptions_count,
|
|
views_count=placement.views_count,
|
|
views_availability=placement.views_availability,
|
|
last_views_fetch_at=placement.last_views_fetch_at,
|
|
created_at=placement.created_at,
|
|
)
|