Files
VacatureRadar/docs/architecture/DATA_FLOW.md
T
Jens b8091e59bd
deploy / deploy (push) Canceled after 0s
Initial deploy setup
2026-07-21 14:00:00 +02:00

83 lines
3.3 KiB
Markdown

# Dataflows en invarianten
## Flow A — Publieke vacaturepagina
1. Scheduler selecteert alleen `allow` + `active/trial` + due.
2. Fetcher controleert policy, URL, DNS/IP, poort en iedere redirect.
3. Response wordt begrensd op type/grootte en als `RawDocument` met korte retentie opgeslagen.
4. Registry kiest RSS wanneer XML/feed, anders JSON-LD en daarna generieke HTML.
5. `ExtractedJob` wordt gesanitized en genormaliseerd.
6. Dedupe zoekt external ID, canonieke URL, canonieke key en conservatieve fuzzy kandidaat.
7. Pipeline schrijft werkgever, vacature, alias, provenance en versie.
8. Alle actieve profielen krijgen een nieuwe `ScoreRun`.
9. SourceRun registreert metrics en plant volgende run.
Invarianten:
- geen fetch zonder policy + URL-validatie;
- één canonieke vacature per canonical key;
- originele bronURL blijft als alias bewaard;
- HTML in de UI is gesanitized;
- verwerking van dezelfde broninhoud is idempotent.
## Flow B — Vacaturemail
1. IMAP-task haalt maximaal een begrensd aantal berichten op.
2. `message_identity` gebruikt RFC Message-ID of SHA-256 fallback.
3. Bestaand record stopt dubbele verwerking.
4. Raw mail wordt tijdelijk opgeslagen.
5. E-mailadapter extraheert alleen HTTP(S)-links en slaat unsubscribe/privacylinks over.
6. Iedere link wordt als vacaturedraft verwerkt; denylistlink wordt niet automatisch gefetcht.
7. Record bewaart linklijst, processedstatus en begrensde foutmelding.
Invarianten:
- mailboxpassword staat alleen in environment/secrets;
- geen attachmentverwerking in MVP;
- e-mailtekst is data, geen AI-/agentinstructie;
- duplicate Message-ID maakt geen extra vacaturesnapshot.
## Flow C — Feedback en sollicitatie
1. Authenticated user POST met CSRF.
2. Actie wordt tegen enum gevalideerd.
3. `Feedback` is append-only.
4. `applied` maakt atomair één `Application` per user/job.
5. Dossier krijgt vacaturesnapshot en standaard opvolgdatum.
6. Externe verzending bestaat niet.
Invarianten:
- user-scoped querysets voor dossierwijziging;
- één dossier per user/job;
- undo/verbergen is traceerbaar;
- feedbackleren mag uitsluitend begrensde soft weights wijzigen.
## Flow D — Dagelijkse digest
1. Scheduler evalueert actieve profielen in hun tijdzone.
2. Alleen binnen het 30-minutenvak rond digesttijd wordt een outbox gemaakt.
3. Dedupe key is profiel + lokale datum.
4. Selectie neemt laatste sterke/mogelijke score per actieve vacature, verborgen jobs uitgesloten.
5. Template rendert tekst en HTML.
6. Bij succes status `sent`; bij fout `failed` met begrensde foutcontext.
Invarianten:
- maximaal één outbox per profiel/dag;
- een reeds verzonden outbox wordt niet opnieuw verzonden;
- geen recipient betekent `skipped`, geen crash;
- digest bevat nooit raw HTML van vacaturebron.
## Dataretentie
| Data | Standaard | Reden |
|---|---:|---|
| Raw publieke documenten | 7 dagen | parserdebug en provenance |
| Raw vacaturemail | 7 dagen | idempotentie/debug; daarna verwijderen |
| Canonieke vacature | totdat verwijderd/retentiebeleid | gebruikerswaarde en historie |
| JobVersion | blijvend tenzij gebruiker wist | wijzigingsaudit |
| ScoreRun | configureerbaar, initieel blijvend | uitlegbaarheid/modelvergelijking |
| Feedback/Application | totdat gebruiker wist | persoonlijke opvolging |
| Logs | operationeel begrensd/geroteerd | foutdiagnose zonder inhoud/secrets |