from functools import lru_cache from fastapi import Depends from src.application.abstractions import IUnitOfWork from src.application.commands import ( AdminLoginCommand, AdminLogoutCommand, AdminJwtRefreshCommand, GetAdminMeCommand, CreateOrganizationCommand, CreateOrganizationWalletsCommand, GetOrganizationMnemonicCommand, GetOrganizationSecretKeysCommand, GetOrganizationCommand, ListOrganizationWalletsCommand, GetPurchaseRequestCommand, ListOrganizationsCommand, GetOrganizationDocumentCommand, ListOrganizationDocumentsCommand, ListPurchaseRequestsCommand, SetPurchaseRequestQuoteCommand, UpdateOrganizationCommand, UpdatePurchaseRequestStatusCommand, UploadOrganizationDocumentCommand, ) from src.application.contracts import IHashService, IJwtService, ILogger from src.infrastructure.config import settings from src.infrastructure.storage.s3_documents_service import S3DocumentsService from src.presentation.dependencies.logger import get_logger from src.presentation.dependencies.security import get_hash_service, get_jwt_service from src.presentation.dependencies.unit_of_work import get_unit_of_work @lru_cache(maxsize=1) def _s3_documents_service() -> S3DocumentsService: return S3DocumentsService( bucket=settings.LEGAL_DOCS_S3_BUCKET, region=settings.LEGAL_DOCS_S3_REGION, access_key_id=settings.LEGAL_DOCS_S3_ACCESS_KEY_ID or None, secret_access_key=settings.LEGAL_DOCS_S3_SECRET_ACCESS_KEY or None, endpoint_url=settings.LEGAL_DOCS_S3_ENDPOINT_URL or None, key_prefix=settings.LEGAL_DOCS_S3_KEY_PREFIX, presigned_ttl_seconds=settings.LEGAL_DOCS_S3_PRESIGNED_TTL_SECONDS, ) def get_s3_documents_service() -> S3DocumentsService: return _s3_documents_service() def get_admin_login_command( uow: IUnitOfWork = Depends(get_unit_of_work), hash_service: IHashService = Depends(get_hash_service), jwt_service: IJwtService = Depends(get_jwt_service), logger: ILogger = Depends(get_logger), ) -> AdminLoginCommand: return AdminLoginCommand(uow, hash_service, jwt_service, logger) def get_admin_me_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetAdminMeCommand: return GetAdminMeCommand(uow, logger) def get_admin_logout_command( logger: ILogger = Depends(get_logger), ) -> AdminLogoutCommand: return AdminLogoutCommand(logger) def get_admin_jwt_refresh_command( uow: IUnitOfWork = Depends(get_unit_of_work), jwt_service: IJwtService = Depends(get_jwt_service), logger: ILogger = Depends(get_logger), ) -> AdminJwtRefreshCommand: return AdminJwtRefreshCommand(uow, jwt_service, logger) def get_create_organization_command( uow: IUnitOfWork = Depends(get_unit_of_work), hash_service: IHashService = Depends(get_hash_service), logger: ILogger = Depends(get_logger), ) -> CreateOrganizationCommand: return CreateOrganizationCommand(uow, hash_service, logger) def get_create_organization_wallets_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> CreateOrganizationWalletsCommand: return CreateOrganizationWalletsCommand(uow, logger) def get_list_organization_wallets_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> ListOrganizationWalletsCommand: return ListOrganizationWalletsCommand(uow, logger) def get_get_organization_mnemonic_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetOrganizationMnemonicCommand: return GetOrganizationMnemonicCommand(uow, logger) def get_get_organization_secret_keys_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetOrganizationSecretKeysCommand: return GetOrganizationSecretKeysCommand(uow, logger) def get_upload_organization_document_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> UploadOrganizationDocumentCommand: return UploadOrganizationDocumentCommand(uow, get_s3_documents_service(), logger) def get_list_organizations_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> ListOrganizationsCommand: return ListOrganizationsCommand(uow, logger) def get_get_organization_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetOrganizationCommand: return GetOrganizationCommand(uow, logger) def get_update_organization_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> UpdateOrganizationCommand: return UpdateOrganizationCommand(uow, logger) def get_list_organization_documents_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> ListOrganizationDocumentsCommand: return ListOrganizationDocumentsCommand(uow, logger) def get_get_organization_document_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetOrganizationDocumentCommand: return GetOrganizationDocumentCommand(uow, logger) def get_list_purchase_requests_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> ListPurchaseRequestsCommand: return ListPurchaseRequestsCommand(uow, logger) def get_get_purchase_request_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> GetPurchaseRequestCommand: return GetPurchaseRequestCommand(uow, logger) def get_update_purchase_request_status_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> UpdatePurchaseRequestStatusCommand: return UpdatePurchaseRequestStatusCommand(uow, logger) def get_set_purchase_request_quote_command( uow: IUnitOfWork = Depends(get_unit_of_work), logger: ILogger = Depends(get_logger), ) -> SetPurchaseRequestQuoteCommand: return SetPurchaseRequestQuoteCommand(uow, logger)