LoaderActivity.Execute
Purpose
Резолвит текущую Terry loader config по data_source_id, собирает middleware/fetcher chain и выполняет один universal fetch run.
Код: internal/worker/loader/activity.go
Legacy Temporal activity name Execute remains registered as a compatibility alias for old workflow histories.
Flow
flowchart TD
Start([Start]) --> Validate[Validate request]
Validate --> HasDataSource{data_source_id present?}
HasDataSource -- No --> Invalid[Return validation error]
HasDataSource -- Yes --> Resolve[Resolve current loader config]
Resolve --> Active{Source and config active?}
Active -- No --> ConfigError[Return config error]
Active -- Yes --> Build[Build middleware and fetcher chain]
Build --> Fetch[Execute fetcher]
Fetch --> FetchOK{Fetch succeeded?}
FetchOK -- No --> FetchError[Return fetcher error]
FetchOK -- Yes --> Metadata[Build runtime metadata]
Metadata --> Store[Store raw payload in object storage]
Store --> StoreOK{Stored?}
StoreOK -- No --> StorageError[Return storage error]
StoreOK -- Yes --> Output[Return LoaderOutput with raw_data metadata]
Output --> End([End])
Invalid --> End
ConfigError --> End
FetchError --> End
StorageError --> End
Input / Output
Input (loader.LoaderRequest):
- data_source_id
- name (optional)
- metadata (optional)
Output (loader.LoaderOutput):
- metadata
- fetched_at
- source_type
- raw_data
Сырой payload не возвращается в output. raw_data описывает payload, сохранённый activity в Hetzner S3:
- file_uid — UUID объекта в raw storage;
- hash — SHA-256 сохранённых байтов;
- hash_algorithm — сейчас всегда sha256;
- content_type — MIME type сохранённого payload, сейчас application/json;
- requested_at — UTC-время перед вызовом fetcher.
В runtime metadata дополнительно пробрасываются:
- data_source_id, loader_config_id, loader_config_version, loader_config_status
- workspace_id, domain_id, page_type, code_name
External Dependencies
- PostgreSQL catalog
terry.*через repository/config resolver - Hetzner S3-compatible object storage для raw payload artifacts
- loader fetchers (
sdk,http,file,database,playwright,custom) - loader middleware (
fingerprint,proxy,incremental,ratelimit)
HTTP Fetcher
source_type=http теперь поддерживается как рабочий fetcher, а не scaffold-заглушка.
Кратко:
- выполняет
GET,POST,PUT,PATCH,DELETE; - применяет enabled/disabled headers и query params из
source.http; - поддерживает
body.jsonиbody.raw; - парсит JSON response по
response.items_path; - поддерживает
disabled,page,offset,cursorpagination; - применяет per-request timeout/retry;
- блокирует unsafe SSRF targets;
- возвращает JSON payload для сохранения в raw storage.
Подробный contract: Terry HTTP Fetcher.
Idempotency
- сама activity не пишет в Terry catalog;
- retry одного activity пишет в тот же raw object key, переданный workflow-ом;
- новый workflow run получает новый raw object key;
- идемпотентность downstream side effects зависит от конкретного fetcher/consumer.
Error Taxonomy
- invalid request (
missing data_source_id) - source/config inactive
- raw storage не сконфигурирован или ошибка записи в Hetzner S3
- unsupported source type или middleware type
- transport/fetcher runtime errors