from pyxdi import Module, provider from campaigns.assets.handlers import GetAssetHandler, UpdateAssetHandler from campaigns.assets.repositories import AssetRepository from campaigns.assets.services import AssetService from campaigns.config import AppSettings from campaigns.connectors.aws.s3 import S3Client from campaigns.connectors.aws.sts import STSClient from campaigns.connectors.db import Database class AssetsModule(Module): # Repositories @provider(scope="singleton") def asset_repository(self, db: Database) -> AssetRepository: return AssetRepository(db=db) # Services @provider(scope="singleton") def asset_service( self, settings: AppSettings, s3_client: S3Client, sts_client: STSClient, asset_repository: AssetRepository, ) -> AssetService: return AssetService( s3_client=s3_client, sts_client=sts_client, asset_repository=asset_repository, upload_policy_func=settings.get_asset_upload_policy, upload_bucket_name=settings.assets_bucket_name, upload_iam_role_arn=settings.assets_upload_iam_role_arn, upload_region_name=settings.aws_region_name, ) # Handlers @provider(scope="singleton") def get_asset_handler( self, db: Database, asset_service: AssetService ) -> GetAssetHandler: return GetAssetHandler(db=db, asset_service=asset_service) @provider(scope="singleton") def update_asset_handler( self, db: Database, asset_repository: AssetRepository, asset_service: AssetService, ) -> UpdateAssetHandler: return UpdateAssetHandler( db=db, asset_repository=asset_repository, asset_service=asset_service, )