Rozhodnutá podoba
Nenásilné omezení launche na
Ostravu
Uživatel může zadávat cokoli odkudkoli, ale aplikace dočasně zobrazuje jen Ostravsko — vysvětleno štítkem [beta]. Omezuje se tedy zobrazování, ne vstup. Vše řízené jednou env proměnnou. Implementováno a ověřeno — backend e2e testy a manuální průchod na fyzickém zařízení.
01Shrnutí
Omezit zobrazování, ne uživatele. Řízeno jednou env proměnnou, bez zásahu do datového modelu.
- Zadávat lze cokoli odkudkoli — profily i nabídky vznikají po celé ČR bez omezení. Dočasně se jen zobrazuje pouze Ostravsko, což uživateli vysvětlí [beta] štítek.
- Řízeno jednou env proměnnou: API
LAUNCH_REGION_BBOX, mobilEXPO_PUBLIC_LAUNCH_REGION_BBOX(build-time). Nenastaveno = žádné omezení, celorepublikové chování beze změny. - Omezení je serverové (display-side): bbox se přišpendlí jako AND podmínka do všech variant vyhledávacích dotazů. Zámek mapy je jen kosmetika navrch — sám o sobě nic negarantuje.
- Přímý přístup zůstává funkční: detail, pin-resolution (by-ids) a konverzace bboxem omezené nejsou. Firma z Prahy může kontaktovat kandidáta z Ostravy.
- Vstup adres se nezamyká nikde — pickery adres si drží celorepublikové
CZECHIA_BOUNDS. Zamyká se jen procházecí mapa. - Rozšíření nebo zrušení = změna/odebrání jedné env hodnoty na API + mobilní release. Regionem je aglomerace Ostravska.
02Rozhodnutá podoba
U každé volby zvolená varianta.
| Rozhodnutí | Zvolená podoba |
|---|---|
| Hranice regionu | bbox aglomerace Ostravska: 49,55 / 17,80 / 50,00 / 18,70 (latMin,lngMin,latMax,lngMax). Pokrývá Ostravu, Havířov, Frýdek-Místek, Karvinou, Bohumín, Opavu i Český Těšín. |
| Vstup obsahu | Bez omezení. Zadávat profily i nabídky lze odkudkoli po celé ČR. |
| Co se omezuje | Jen zobrazování ve vyhledávání. Serverově, na všech variantách discovery dotazů. |
| Řízení | Env proměnná (API + mobil). Hodnoty se musí shodovat, jinak by piny padaly mimo zamčený viewport. Nenastaveno = žádné omezení. |
| Komunikace uživateli | [beta] štítek + bannery na místech rozhodnutí + tailored empty state. Žádné tvrdé blokování účtu. |
Bbox se předává jako latMin,lngMin,latMax,lngMax. Hodnoty na API a mobilu
musí být identické — mobil podle nich zamyká viewport, API podle nich filtruje
obsah. Rozejdou-li se, piny skončí mimo viditelnou oblast mapy.
03Co se omezuje a co ne
Bbox jako AND podmínka do všech discovery dotazů. Přímý přístup zůstává otevřený.
Bbox se přišpendlí do všech variant discovery dotazů v obou vyhledávacích repozitářích:
| Dotaz | Repozitář |
|---|---|
| Stránkovaný seznam | candidate-search-repository.ts / job-offers-repository.ts |
| Count (počet výsledků) | tytéž repozitáře |
| Map-points (piny na mapě) | tytéž repozitáře |
| Near-me radius feed | tytéž repozitáře |
U skrytých kandidátů bbox testuje tutéž ~500m posunutou zobrazovací souřadnici, jakou už dnes používá viewport filtr — ne skutečnou adresu. Identita kandidáta se tím dál nevyzradí.
Neomezuje se: detailové endpointy, by-ids pin-resolution ani konverzace. Firma z Prahy může legitimně napsat kandidátovi z Ostravy — přímý přístup přes odkaz či konverzaci funguje dál.
Vstup adres zůstává otevřený všude. Pickery adres si drží celorepublikové
CZECHIA_BOUNDS — zamyká se výhradně procházecí mapa.
04UX komponenty
Vše se renderuje jen když je env proměnná nastavená. Jeden sdílený zdroj české copy.
- Inline banner na místech rozhodnutí — onboarding formuláře (kandidát i firma, kde se zadává adresa) a formulář nabídky. Text ~ „Aplikace běží v beta provozu na Ostravsku. Profily a nabídky můžete zadávat odkudkoliv, ale ve vyhledávání zatím zobrazujeme jen Ostravsko a okolí.“
- BETA chip v hlavičkách — procházecí mapa, profilové obrazovky, správa nabídek. Klepnutí otevře bottom sheet se stejným vysvětlením.
- Tailored empty state — když je střed hledání uživatele mimo bbox (klientská kontrola), generické „žádné výsledky“ nahradí beta vysvětlení. Brání dojmu „appka je rozbitá“ třeba u pražského kandidáta, jehož near-me radius region neprotíná.
Na mobilu se navíc zúží hranice posunu procházecí mapy na bbox a výchozí kamera
se vycentruje na region (nahradí hardcoded Prahu, když je proměnná nastavená).
fitToPoints není třeba měnit — výsledky jsou už jen z regionu.
05Proč zámek mapy nestačí
Klíčový důvod pro serverové omezení — a obchodní riziko k zohlednění.
Zámek mapy není omezení zobrazování. Dva důvody:
- Near-me feed kandidáta se centruje na jeho vlastní adresu, ne na viewport mapy — kandidát mimo region by jinak dál viděl celorepublikové okolí.
- Map-points endpoint viewport bbox neaplikuje vůbec — piny by se vracely bez ohledu na to, kam je mapa zamčená.
Proto omezení musí sedět na serveru, v dotazech. Zámek mapy je jen vizuální vrstva navrch.
Obchodní riziko: firma z Prahy může zaplatit předplatné a zveřejnit nabídku, která bude mít nulovou viditelnost (nikdo v regionu ji neuvidí ve vyhledávání). Proto banner sedí i u vytváření nabídky, ne jen jako odznak v hlavičce.
06Testování
Jeden backend e2e spec pokrývající ON cestu; stávající suity dokazují nezměněnou OFF cestu.
- e2e spec nastaví
LAUNCH_REGION_BBOXpředcreateTestApp() - naseeduje jednoho in-region a jednoho out-of-region kandidáta i nabídku
- ověří, že discovery outsidera vyloučí, zatímco by-ids a detail ho stále vrátí
- stávající suity běží s proměnnou nenastavenou — OFF cesta prokázána beze změny
- mobil ověřen manuálně na fyzickém zařízení
07Rollout a odstranění
Změna rozsahu je operace nad jednou env hodnotou plus mobilní release.
Rozšíření regionu, zúžení nebo úplné zrušení omezení = změna nebo odebrání jedné env hodnoty na API a mobilní release se změněnou hodnotou (mobilní hodnoty jsou build-time, inlinují se při buildu). Nenastavená proměnná vrací aplikaci do plně celorepublikového režimu bez jakéhokoli omezení.
Žádná nová infrastruktura, žádný config endpoint, žádný zásah do datového modelu. Postupný rozjezd město po městu je otázka měnění bboxu mezi releasy.