Loading module
Resolving locale, route permissions, and workspace projection.
Vacancy Extraction Prep Map
Scope
This map covers the real Vacancy backend domain that exists today inside svc-tenders, not the broader future WorkStay umbrella. The goal is to separate:
- vacancy-owned core backend truth
- application and owner/internal vacancy truth
- public discovery compatibility residue
- shared Kvary shell dependencies
- temporary hosting that still lives in
svc-tenders
Ownership Map
| Surface | Current location | Verification | Runtime status | Ownership classification | Notes |
| --- | --- | --- | --- | --- | --- |
| Vacancy route registration | services/svc-tenders/src/routes/registerVacancyRoutes.ts | VERIFIED | REAL | vacancy-owned, temporary-hosted-in-svc-tenders | Active HTTP surface for public reads, owner reads, postings, and application flows. |
| Vacancy route support | services/svc-tenders/src/routes/support/vacancyRouteSupport.ts | VERIFIED | REAL | vacancy-owned, temporary-hosted-in-svc-tenders | Owns vacancy capability checks and mutation-error mapping; still consumes shared shell auth/parser inputs. |
| Vacancy-owned contracts | | VERIFIED | REAL | vacancy-owned | Active request/response/support type surface for vacancy routes and repositories. |
| Vacancy-owned validation | | VERIFIED | REAL | vacancy-owned | Already domain-local; no longer primarily hosted in mixed validation surfaces. |
| Vacancy aggregate/domain logic | | VERIFIED | REAL | vacancy-owned | Durable posting/application lifecycle truth. |
| Vacancy command handlers | | VERIFIED | REAL | vacancy-owned, temporary-hosted-in-svc-tenders | Owns posting/application writes, outbox appends, and projection updates. |
| Vacancy projections | | VERIFIED | REAL | vacancy-owned | Maintains vacancy read-side projections from vacancy domain events. |
| Vacancy read-model mapping | | VERIFIED | REAL | vacancy-owned | Maps projection rows and joined rows into route-facing storage shapes. |
| Vacancy preferred read repository | | VERIFIED | MIXED | vacancy-owned, temporary-hosted-in-svc-tenders | Owner/application reads are vacancy-owned and clean; public discovery still falls back to legacy . |
| Vacancy compatibility read wrapper | | VERIFIED | MIXED | compatibility residue | Exists only to preserve older call paths. |
| Vacancy compatibility application wrapper | | VERIFIED | MIXED | compatibility residue | Same pattern for applicant/owner application reads. |
| Vacancy root repository hosting | vacancy methods | VERIFIED | MIXED | compatibility residue, temporary-hosted-in-svc-tenders | Root repository still hosts legacy vacancy read entry points for older callers. |
| Vacancy runtime composition | | VERIFIED | SHELL | shared-Kvary-owned | Wires vacancy repository, handlers, and route support into the service shell. |
| API gateway vacancy public seam | | VERIFIED | REAL | shared-Kvary-owned | Uses . Stable extraction seam already exists. |
| API gateway vacancy posting seam | | VERIFIED | REAL | shared-Kvary-owned | Stable extracted-runtime target seam for posting mutations and owner review list-by-posting. |
| API gateway vacancy applications seam | | VERIFIED | REAL | shared-Kvary-owned | Stable extracted-runtime target seam for submit/review/withdraw routes. |
| API gateway owner vacancy seams | , | VERIFIED | REAL | shared-Kvary-owned | Stable extracted-runtime seams for owner/internal reads. |
| Vacancy public discovery backend truth | , via | VERIFIED | MIXED | vacancy-owned plus compatibility residue | Projection-backed postings are real; legacy fallback still participates in canonical public results. |
| Vacancy application backend truth | , , projection-backed reads | VERIFIED | REAL | vacancy-application-owned | Durable and backend-real. |
| Owner/internal vacancy reads | , | VERIFIED | REAL | owner/internal vacancy-owned | Mainly read from or joined vacancy application data. |
| Worker/applicant vacancy reads | | VERIFIED | REAL | vacancy-application-owned | Uses . |
| Web vacancy public consumer | | VERIFIED | REAL | temporary-hosted-in-svc-tenders consumer | Calls API routes directly, but falls back to static catalog on errors. |
| Web vacancy detail/catalog enrichment | , | VERIFIED | UI-FIRST | legacy compatibility residue / ambiguous | Frontend owns richer presentation-only shapes and mock enrichment that are not canonical backend contracts. |
| Map/nearby vacancy UI | , accommodation detail nearby vacancy UI | VERIFIED | UI-FIRST | not current vacancy backend extraction material | Consumes mock or derived data rather than vacancy backend truth. |
| Future worker/job intelligence platform surface | broader WorkStay intent | VERIFIED as strategy, UNVERIFIED as backend code | MISSING | ambiguous | Strategic direction is real, but not a backend extraction boundary today. |
READ 2026-03-28T23:42:21.903Z
READ 2026-03-29T04:52:41.869Z
CORE STRICT SAFE DELETE AFTER RERUN REPORT
PUBLIC | DRAFT | v1.0.0
READ 2026-03-29T03:13:33.020Z
services/svc-tenders/src/vacancy/contracts.ts
services/svc-tenders/src/vacancy/validation.ts
services/svc-tenders/src/vacancy/domain.ts
services/svc-tenders/src/vacancy/commandHandlers.ts
services/svc-tenders/src/vacancy/projections.ts
services/svc-tenders/src/vacancy/readModel.ts
services/svc-tenders/src/vacancy/readRepository.ts
vacancies
services/svc-tenders/src/vacancy/compatibilityReadRepository.ts
TendersRepository
services/svc-tenders/src/vacancy/compatibilityApplicationRepository.ts
services/svc-tenders/src/repository.ts
services/svc-tenders/src/server.ts
services/api/src/routes/vacancies.ts
VACANCIES_SERVICE_URL ?? TENDERS_SERVICE_URL
services/api/src/routes/vacancy-postings.ts
services/api/src/routes/vacancy-applications.ts
services/api/src/routes/owner-vacancy-postings.ts
services/api/src/routes/owner-vacancy-applications.ts
/vacancies
/vacancies/:id
VacancyReadRepository
vacancies
vacancy_postings
vacancy_applications
/owner/vacancy-postings*
/owner/vacancy-applications*
vacancy_postings
/vacancy-applications/me
my_vacancy_applications_view
apps/web/src/portal/api.ts
apps/web/src/features/domains/vacancyCatalog.ts
apps/web/src/features/domains/vacancyDetail.ts
apps/web/src/features/map/**
Real Vacancy Backend Boundary Today
Clearly real backend extraction material:
- vacancy postings write model and lifecycle
- vacancy application write model and lifecycle
- owner vacancy posting reads
- owner vacancy application reads
- applicant vacancy application reads
- API gateway seam through
VACANCIES_SERVICE_URL ?? TENDERS_SERVICE_URL
- vacancy-owned contracts and validation
Still mixed or compatibility-backed:
- public vacancy discovery list
- public vacancy detail fallback path
- older
TendersRepository vacancy call surface
- frontend detail/catalog enrichment and mock fallback
Not current backend extraction material:
- map vacancy layer
- nearby stay-work intelligence
- future travel or matching logic
Minimum Credible Vacancy Extraction Package
Move first
services/svc-tenders/src/routes/registerVacancyRoutes.ts
services/svc-tenders/src/routes/support/vacancyRouteSupport.ts
services/svc-tenders/src/vacancy/contracts.ts
services/svc-tenders/src/vacancy/validation.ts
services/svc-tenders/src/vacancy/domain.ts
services/svc-tenders/src/vacancy/commandHandlers.ts
services/svc-tenders/src/vacancy/projections.ts
services/svc-tenders/src/vacancy/readModel.ts
services/svc-tenders/src/vacancy/readRepository.ts
Keep shared with Kvary
services/api/src/routes/vacancies.ts
services/api/src/routes/vacancy-postings.ts
services/api/src/routes/vacancy-applications.ts
services/api/src/routes/owner-vacancy-postings.ts
services/api/src/routes/owner-vacancy-applications.ts
- shared auth ingress behavior and principal resolution behind
/auth/me
Keep temporarily in current host
- vacancy runtime composition in
services/svc-tenders/src/server.ts
- root repository compatibility methods in
services/svc-tenders/src/repository.ts
services/svc-tenders/src/vacancy/compatibilityReadRepository.ts
services/svc-tenders/src/vacancy/compatibilityApplicationRepository.ts
Treat as compatibility residue, not clean vacancy truth
- legacy
vacancies table reads in public discovery
- web fallback to
VACANCY_CATALOG
- web richer detail/catalog types that are not sourced from backend canonical contracts
Top Blockers
| Blocker | Severity | Type | Why it blocks extraction | What reduces it next |
| --- | --- | --- | --- | --- |
| Public reads still fall back to legacy vacancies | HIGH | code+infra | Prevents declaring /vacancies as clean extracted-domain truth. | Decide whether to keep this as an explicit compatibility seam or replace it with projection-owned public truth. |
| Root repository compatibility residue | MEDIUM | code-only | Older callers still see vacancy through TendersRepository, which keeps extraction less direct. | Reduce or isolate remaining root repository callers after the extracted vacancy runtime exists. |
| Public route and owner-review asymmetry | MEDIUM | code-only | /vacancy-postings/:id/applications still reads vacancy summary through the broader public finder even though application ownership checks are vacancy-owned. | Narrow that route’s supporting read path or make the composed dependency explicit in later hardening. |
| Web/backend contract duplication | MEDIUM | code-only | Web detail/catalog layers still enrich or fallback beyond backend contract truth. | Isolate portal-facing vacancy DTOs and keep UI-only enrichment clearly second-class. |
| Shared shell auth/principal dependency | LOW | code-only | Extraction still needs requireServiceAuth and principal resolution. | Keep as intentional shared shell contract first; narrow later if needed. |
| Mixed migration ownership | LOW | code+infra | Vacancy runtime code can move before migrations fully transfer, but extraction ownership stays less clean. | Classify vacancy-dominant vs mixed migrations when runtime prep starts. |
Recommended Extraction Direction
- Treat vacancy postings, applications, and owner/internal reads as the real extraction core.
- Treat public vacancy discovery as a named compatibility seam, not as already-clean canonical truth.
- Prefer package-first or API-first prep for vacancy core.
- Do public-read cleanup before claiming live cutover readiness for
/vacancies.
In practice, that means Vacancy is closer to:
- package-first for posting/application/owner surfaces
- public-read-cleanup-first before public cutover
not to a one-shot “everything vacancy moves at once” extraction.