# In-memory cache

- Cachování v paměti instance služby
- Nejdříve se načtou data z PSQL, následně si instance služby data drží v paměti
- Variabilní nebo žádné TTL (tedy pro obnovení dat je nutné službu/instanci/pod restartovat)
- Vhodné pro data, která se často nemění, ale zároveň se nevyplatí je ukládat do Redisu

## Kolejové obvody

- Třída [CachedMetroRailTrackLookup](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/data-access/metro/CachedMetroRailtrackLookup.ts)
- Využití v rámci procesování metro zpráv manipulací shape anchor pointů na trase pro přesnější určení stavu vozidla (`on_track` X `at_stop`) a zpoždění na příjezdu/odjezdu do/ze zastávky
  - Viz [MetroShapePointsFixer](../../../src/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/metro/MetroShapePointsFixer.ts)
- TTL žádné
  - :warning: Dříve se nové kolejové obvody načítaly podle potřeby ROPIDu (zpravidla 2x za rok), takže současný způsob cachování byl v pořádku. Nyní se načítají každý den spolu s JŘ stažením z Blob Storage (kde si soubor ROPIDu spravuje sám), takže je absence TTL kvůli neaktualizaci dat problematická (neaktuálnost kolejových obvodů a špatné určení stavu vozidla, případně zpoždění v zastávce), je potřeba to řešit jinak

```mermaid
flowchart TB;
  initial[Příjem zprávy, zpárování s GTFS, uložení do DB]-->amqp_updateDelay[AMQP updateDelay];
  amqp_updateDelay--select-->trips[(PSQL trips)];
  amqp_updateDelay--select-->positions[(PSQL positions)];

  trips--Anchor pointy neexistují-->anchor_points_new[Vytvoření anchor points podle GTFS shapes];
  positions--Anchor pointy neexistují-->anchor_points_new;
  trips--Anchor pointy existují-->anchor_points_exist[Načtení anchor points z Redisu];
  positions--Anchor pointy existují-->anchor_points_exist;

  anchor_points_new-->fixer[MetroShapePointsFixer];
  fixer-->lookup[CachedMetroRailTrackLookup];
  lookup--select pokud cache miss<-->railtrack[(PSQL metro railtrack data)];
  lookup-->save_anchor_points[Uložení anchor points do Redisu];
  save_anchor_points-->continue[Pokračování ve zpracování zprávy];

  anchor_points_exist-->continue;
```

## Popisky vozidel

- Třída [VehicleDescriptorCachedRepository](../../../src/output-gateway/public/data-access/VehicleDescriptorCachedRepository.ts)
- Využití v rámci:
  - Public VP detailu pro získání dodatečných informací o konkrétním vozidle na trase (pokud si uživatel vyžádá `scope[]=vehicle_descriptor`)
  - Public odjezdů pro získání dodatečných informací (USB nabíječky, klimatizace) o vozidle na každém odjezdu z vybraných zastávek, pokud už víme, které vozidlo daný spoj obsluhuje
- TTL 4 hodiny
- Data stahujeme 2x denně, takže současný způsob cachování teď ničemu úplně nevadí

```mermaid
flowchart TB;
  api_request_vp[GET /v2/public/vehiclepositions/$vehicle_id]-->process_vp[Zpracování API requestu];
  api_request_departures[GET /v2/public/departureboards]-->process_departures[Zpracování API requestu];
  
  process_vp--uživatel vyžádal vehicle_descriptor-->descriptor_repository[VehicleDescriptorCachedRepository];
  process_vp--uživatel nevyžádal vehicle_descriptor-->continue[Pokračování ve zpracování];

  process_departures--známe vozidlo k odjezdu-->descriptor_repository;
  process_departures--neznáme vozidlo k odjezdu-->continue;

  descriptor_repository--select pokud cache miss<-->descriptors[(PSQL vehicle descriptors)];
  descriptor_repository-->continue;
```
