from collections.abc import Iterator from anydi import Module, provider from dns.resolver import Resolver from app.config import Settings from app.connectors.database.snowflake_client import SnowflakeClient from app.handlers import ValidateEmailDomainsHandler from app.services import EmailDomainValidationService class AppModule(Module): @provider(scope="singleton") def snowflake_client( self, settings: Settings, ) -> Iterator[SnowflakeClient]: snowflake_client = SnowflakeClient( env=settings.environment, user=settings.snowflake_user, account=settings.snowflake_account, warehouse=settings.snowflake_warehouse, database=settings.snowflake_database, role=settings.snowflake_role, schema=settings.snowflake_schema, private_key=settings.snowflake_private_key, ) yield snowflake_client snowflake_client.close() @provider(scope="singleton") def dns_resolver(self, settings: Settings) -> Resolver: resolver = Resolver() resolver.lifetime = settings.domain_resolving_timeout return resolver @provider(scope="singleton") def email_domain_validation_service( self, dns_resolver: Resolver, ) -> EmailDomainValidationService: return EmailDomainValidationService( dns_resolver=dns_resolver, ) @provider(scope="singleton") def handler( self, settings: Settings, snowflake_client: SnowflakeClient, email_domain_validation_service: EmailDomainValidationService, ) -> ValidateEmailDomainsHandler: return ValidateEmailDomainsHandler( email_domain_validation_service=email_domain_validation_service, snowflake_client=snowflake_client, domains_chunk_size=settings.domains_chunk_size, threads_count=settings.threads_count, )