from dataclasses import dataclass from typing import Any from campaigns.assets.models import Asset from campaigns.assets.repositories import AssetRepository from campaigns.assets.services import AssetService from campaigns.connectors.db import Database, session_context from campaigns.core.handler import Handler @dataclass(frozen=True) class UpdateAssetRequest: asset_id: str data: dict[str, Any] @dataclass class UpdateAssetHandler(Handler[UpdateAssetRequest, Asset]): db: Database asset_repository: AssetRepository asset_service: AssetService @session_context(in_transaction=True) async def handle(self, request: UpdateAssetRequest) -> Asset: asset = await self.asset_service.get_asset(asset_id=request.asset_id) asset.set(request.data) self.asset_repository.add(asset) return asset