mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-27 23:35:01 +00:00
The service was the last one living wholly under backend/. It now follows the same layering as abri and the other newer services: domain/pashub_fetcher/ core file classification, subfolders infrastructure/pashub_fetcher/ PasHub client, token getter, wire DTOs orchestration/ PashubFetcherOrchestrator (was PashubService) applications/pashub_fetcher/ lambda handler, trigger request, dev tooling core_files.py is split along the layer boundary: the domain module keeps the filename/evidence-category classification rules and no longer imports infrastructure.postgres, while the CoreFiles -> FileTypeEnum translation moves to infrastructure/pashub_fetcher/core_file_types.py. Tests move into the tests/ tree by layer. Note this puts them in the only suite CI currently runs (unit_tests.yml is disabled), so these 73 tests now execute on PRs for the first time; they were previously reachable only via the legacy pytest.ini testpaths. sharepoint_renamer's image now copies just domain/pashub_fetcher/ rather than the whole service, since SharepointSubfolders is all it needed. Behaviour is unchanged. tests/ goes 9927 -> 10000 passed (+73, exactly the tests that moved in); the legacy suite keeps its same 17 pre-existing failures and 11 errors. tests/test_lambda_packaging.py confirms both changed Dockerfiles still copy their handler's full import closure. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
from typing import Any, Callable, Dict, List, Optional
|
|
|
|
from backend.app.config import get_settings
|
|
from infrastructure.pashub_fetcher.pashub_client import PashubClient
|
|
from orchestration.pashub_fetcher_orchestrator import PashubFetcherOrchestrator
|
|
from applications.pashub_fetcher.pashub_to_ara_trigger_request import (
|
|
PashubToAraTriggerRequest,
|
|
)
|
|
from infrastructure.pashub_fetcher.token_getter import get_token_from_local_storage
|
|
from backend.app.db.models.tasks import SourceEnum
|
|
from backend.utils.subtasks import task_handler
|
|
from utils.logger import setup_logger
|
|
from utils.sharepoint.domna_sharepoint_client import DomnaSharepointClient
|
|
from utils.sharepoint.domna_sites import DomnaSites
|
|
|
|
logger = setup_logger()
|
|
|
|
S3_BUCKET = "retrofit-energy-assessments-dev"
|
|
|
|
|
|
def get_pashub_client(email: str, password: str) -> PashubClient:
|
|
token = get_token_from_local_storage(email, password)
|
|
logger.info("Token extracted successfully")
|
|
return PashubClient(token=token)
|
|
|
|
|
|
@task_handler(task_source="pashub_fetcher", source=SourceEnum.HUBSPOT_DEAL)
|
|
def handler(body: Dict[str, Any], context: Any) -> List[str]:
|
|
logger.info("Received message")
|
|
|
|
settings = get_settings()
|
|
|
|
pashub_email = settings.PASHUB_EMAIL
|
|
pashub_password = settings.PASHUB_PASSWORD
|
|
|
|
coordination_hub_email = settings.PASHUB_COORDINATION_EMAIL
|
|
coordination_hub_password = settings.PASHUB_COORDINATION_PASSWORD
|
|
coordination_client_factory: Optional[Callable[[], PashubClient]] = None
|
|
|
|
if (not pashub_email) or (not pashub_password):
|
|
raise ValueError("Pas Hub credentials not provided")
|
|
|
|
if coordination_hub_email and coordination_hub_password:
|
|
_coord_email, _coord_password = (
|
|
coordination_hub_email,
|
|
coordination_hub_password,
|
|
)
|
|
coordination_client_factory = lambda: get_pashub_client(
|
|
_coord_email, _coord_password
|
|
)
|
|
|
|
logger.debug("Validating request body")
|
|
payload = PashubToAraTriggerRequest.model_validate(body)
|
|
logger.debug("Successfully validated request body")
|
|
|
|
sharepoint_client: Optional[DomnaSharepointClient] = None
|
|
if payload.sharepoint_site is not None:
|
|
try:
|
|
resolved_site = DomnaSites[payload.sharepoint_site]
|
|
sharepoint_client = DomnaSharepointClient(sharepoint_location=resolved_site)
|
|
except KeyError:
|
|
logger.warning(
|
|
f"Unrecognised sharepoint_site '{payload.sharepoint_site}'; skipping SharePoint upload"
|
|
)
|
|
|
|
service = PashubFetcherOrchestrator(
|
|
pashub_client=get_pashub_client(pashub_email, pashub_password),
|
|
sharepoint_client=sharepoint_client,
|
|
s3_bucket=S3_BUCKET,
|
|
coordination_client_factory=coordination_client_factory,
|
|
)
|
|
|
|
files: List[str] = service.run(payload)
|
|
|
|
logger.info(f"Saved {len(files)} files")
|
|
|
|
return files
|
|
|
|
|
|
if __name__ == "__main__":
|
|
event = {"Records": [{"body": "{}"}]}
|
|
handler(event, None)
|