From 8aecaf1468b1638a533122d04d805500f9de2117 Mon Sep 17 00:00:00 2001 From: Vladimir Zagainov Date: Mon, 17 Aug 2026 23:40:52 +0300 Subject: [PATCH] fix: address code review findings --- cmd/api/handlers.go | 6 +- cmd/cron/station_status.go | 8 +- cover.out | 1117 ++++++++++++++++---------------- internal/cache/preferences.go | 8 +- internal/cache/store.go | 3 + internal/routing/graph.go | 54 +- internal/routing/graph_test.go | 6 +- internal/yandex/client.go | 6 +- 8 files changed, 632 insertions(+), 576 deletions(-) diff --git a/cmd/api/handlers.go b/cmd/api/handlers.go index e7fb504..88010a9 100644 --- a/cmd/api/handlers.go +++ b/cmd/api/handlers.go @@ -429,16 +429,14 @@ func StationStatus(hc *HandlerContext, w http.ResponseWriter, r *http.Request) { // adminAuth checks authentication for admin endpoints. // Returns true if the request is authenticated, false otherwise. func adminAuth(hc *HandlerContext, w http.ResponseWriter, r *http.Request) bool { - // Check for admin API key in header expectedAPIKey := os.Getenv("TRIP_PLANNER_ADMIN_API_KEY") if expectedAPIKey == "" { - // Admin API key must be configured - http.Error(w, "unauthorized: admin API key not configured", http.StatusUnauthorized) + http.Error(w, "unauthorized", http.StatusUnauthorized) return false } providedAPIKey := r.Header.Get("X-Admin-Api-Key") if !hmac.Equal([]byte(providedAPIKey), []byte(expectedAPIKey)) { - http.Error(w, "unauthorized: invalid admin API key", http.StatusUnauthorized) + http.Error(w, "unauthorized", http.StatusUnauthorized) return false } return true diff --git a/cmd/cron/station_status.go b/cmd/cron/station_status.go index 76dd382..f64bbbb 100644 --- a/cmd/cron/station_status.go +++ b/cmd/cron/station_status.go @@ -132,8 +132,8 @@ func (sm *StationMonitor) updateStationStatus(ctx context.Context, tripCount int var zeroSince time.Time if err == nil && zeroSinceData != nil { var zeroSinceUnix int64 - _, err := fmt.Sscanf(string(zeroSinceData), "%d", &zeroSinceUnix) - if err == nil { + _, parseErr := fmt.Sscanf(string(zeroSinceData), "%d", &zeroSinceUnix) + if parseErr == nil { zeroSince = time.Unix(zeroSinceUnix, 0) } else { zeroSince = time.Time{} @@ -145,8 +145,8 @@ func (sm *StationMonitor) updateStationStatus(ctx context.Context, tripCount int var lastSeenFlight time.Time if err == nil && lastSeenFlightData != nil { var lastSeenFlightUnix int64 - _, err := fmt.Sscanf(string(lastSeenFlightData), "%d", &lastSeenFlightUnix) - if err == nil { + _, parseErr := fmt.Sscanf(string(lastSeenFlightData), "%d", &lastSeenFlightUnix) + if parseErr == nil { lastSeenFlight = time.Unix(lastSeenFlightUnix, 0) } else { lastSeenFlight = time.Time{} diff --git a/cover.out b/cover.out index 2f0f0f1..a789562 100644 --- a/cover.out +++ b/cover.out @@ -1,4 +1,124 @@ mode: set +trip-planner/internal/metrics/metrics.go:37.21,44.2 1 1 +trip-planner/internal/metrics/metrics.go:47.48,51.2 3 1 +trip-planner/internal/metrics/metrics.go:54.49,58.2 3 1 +trip-planner/internal/metrics/metrics.go:61.51,65.2 3 1 +trip-planner/internal/metrics/metrics.go:68.46,72.2 3 1 +trip-planner/internal/metrics/metrics.go:75.50,81.63 5 1 +trip-planner/internal/metrics/metrics.go:81.63,83.3 1 1 +trip-planner/internal/metrics/metrics.go:87.57,93.16 6 1 +trip-planner/internal/metrics/metrics.go:93.16,95.3 1 1 +trip-planner/internal/metrics/metrics.go:96.2,96.39 1 1 +trip-planner/internal/metrics/metrics.go:100.59,105.59 4 1 +trip-planner/internal/metrics/metrics.go:105.59,107.45 2 1 +trip-planner/internal/metrics/metrics.go:107.45,109.4 1 1 +trip-planner/internal/metrics/metrics.go:110.3,110.83 1 1 +trip-planner/internal/metrics/metrics.go:113.2,123.15 2 1 +trip-planner/internal/metrics/metrics.go:127.47,129.35 2 1 +trip-planner/internal/metrics/metrics.go:129.35,131.3 1 1 +trip-planner/internal/metrics/metrics.go:132.2,132.39 1 1 +trip-planner/internal/metrics/metrics.go:132.39,134.3 1 1 +trip-planner/internal/metrics/metrics.go:135.2,136.16 2 1 +trip-planner/internal/metrics/metrics.go:136.16,138.3 1 0 +trip-planner/internal/metrics/metrics.go:139.2,139.44 1 1 +trip-planner/internal/metrics/metrics.go:143.64,147.2 3 1 +trip-planner/internal/metrics/metrics.go:150.67,155.2 4 1 +trip-planner/internal/storage/neighbors.go:29.56,33.2 1 1 +trip-planner/internal/storage/neighbors.go:36.81,43.2 1 1 +trip-planner/internal/storage/neighbors.go:46.80,47.50 1 1 +trip-planner/internal/storage/neighbors.go:47.50,49.3 1 1 +trip-planner/internal/storage/neighbors.go:50.2,50.12 1 1 +trip-planner/internal/storage/neighbors.go:54.76,55.50 1 1 +trip-planner/internal/storage/neighbors.go:55.50,56.28 1 1 +trip-planner/internal/storage/neighbors.go:56.28,57.43 1 1 +trip-planner/internal/storage/neighbors.go:57.43,60.5 2 1 +trip-planner/internal/storage/neighbors.go:66.85,67.50 1 1 +trip-planner/internal/storage/neighbors.go:67.50,69.31 2 1 +trip-planner/internal/storage/neighbors.go:69.31,70.21 1 1 +trip-planner/internal/storage/neighbors.go:70.21,72.5 1 1 +trip-planner/internal/storage/neighbors.go:74.3,74.16 1 1 +trip-planner/internal/storage/neighbors.go:76.2,76.12 1 0 +trip-planner/internal/storage/transfer_rules.go:14.81,16.39 1 0 +trip-planner/internal/storage/transfer_rules.go:16.39,18.3 1 0 +trip-planner/internal/storage/transfer_rules.go:21.2,22.39 2 0 +trip-planner/internal/storage/transfer_rules.go:22.39,24.3 1 0 +trip-planner/internal/storage/transfer_rules.go:27.2,27.19 1 0 +trip-planner/internal/storage/transfer_rules.go:32.44,34.17 1 0 +trip-planner/internal/storage/transfer_rules.go:35.63,36.28 1 0 +trip-planner/internal/storage/transfer_rules.go:37.63,38.27 1 0 +trip-planner/internal/storage/transfer_rules.go:39.10,40.17 1 0 +trip-planner/internal/airports/airports.go:36.61,42.2 1 1 +trip-planner/internal/airports/airports.go:45.65,53.2 3 1 +trip-planner/internal/airports/airports.go:56.60,57.39 1 1 +trip-planner/internal/airports/airports.go:57.39,59.3 1 1 +trip-planner/internal/airports/airports.go:63.71,65.39 1 1 +trip-planner/internal/airports/airports.go:65.39,67.3 1 1 +trip-planner/internal/airports/airports.go:68.2,68.21 1 1 +trip-planner/internal/airports/airports.go:72.76,73.39 1 1 +trip-planner/internal/airports/airports.go:73.39,75.3 1 1 +trip-planner/internal/airports/airports.go:76.2,76.19 1 1 +trip-planner/internal/airports/airports.go:80.39,82.2 1 1 +trip-planner/internal/airports/airports.go:85.36,86.47 1 1 +trip-planner/internal/airports/airports.go:86.47,88.3 1 1 +trip-planner/internal/airports/airports.go:92.64,94.33 2 1 +trip-planner/internal/airports/airports.go:94.33,95.20 1 1 +trip-planner/internal/airports/airports.go:95.20,97.4 1 1 +trip-planner/internal/airports/airports.go:99.2,99.15 1 1 +trip-planner/cmd/cron/station_status.go:42.50,47.2 1 1 +trip-planner/cmd/cron/station_status.go:50.45,55.2 1 1 +trip-planner/cmd/cron/station_status.go:58.46,63.2 1 1 +trip-planner/cmd/cron/station_status.go:66.51,71.2 1 1 +trip-planner/cmd/cron/station_status.go:75.98,82.16 2 0 +trip-planner/cmd/cron/station_status.go:82.16,84.3 1 0 +trip-planner/cmd/cron/station_status.go:86.2,88.23 2 0 +trip-planner/cmd/cron/station_status.go:95.99,104.16 7 1 +trip-planner/cmd/cron/station_status.go:104.16,106.3 1 0 +trip-planner/cmd/cron/station_status.go:106.8,106.24 1 1 +trip-planner/cmd/cron/station_status.go:106.24,108.40 2 1 +trip-planner/cmd/cron/station_status.go:108.40,110.4 1 1 +trip-planner/cmd/cron/station_status.go:110.9,112.4 1 1 +trip-planner/cmd/cron/station_status.go:113.8,115.3 1 1 +trip-planner/cmd/cron/station_status.go:118.2,120.16 3 1 +trip-planner/cmd/cron/station_status.go:120.16,122.3 1 0 +trip-planner/cmd/cron/station_status.go:122.8,122.32 1 1 +trip-planner/cmd/cron/station_status.go:122.32,125.17 3 1 +trip-planner/cmd/cron/station_status.go:125.17,127.4 1 1 +trip-planner/cmd/cron/station_status.go:131.2,133.40 3 1 +trip-planner/cmd/cron/station_status.go:133.40,136.17 3 1 +trip-planner/cmd/cron/station_status.go:136.17,138.4 1 1 +trip-planner/cmd/cron/station_status.go:138.9,140.4 1 0 +trip-planner/cmd/cron/station_status.go:144.2,146.45 3 1 +trip-planner/cmd/cron/station_status.go:146.45,149.17 3 1 +trip-planner/cmd/cron/station_status.go:149.17,151.4 1 1 +trip-planner/cmd/cron/station_status.go:151.9,153.4 1 0 +trip-planner/cmd/cron/station_status.go:157.2,159.19 2 1 +trip-planner/cmd/cron/station_status.go:159.19,164.3 4 1 +trip-planner/cmd/cron/station_status.go:164.8,166.25 2 1 +trip-planner/cmd/cron/station_status.go:166.25,168.4 1 1 +trip-planner/cmd/cron/station_status.go:169.3,169.20 1 1 +trip-planner/cmd/cron/station_status.go:169.20,171.4 1 1 +trip-planner/cmd/cron/station_status.go:171.9,173.4 1 1 +trip-planner/cmd/cron/station_status.go:177.2,177.85 1 1 +trip-planner/cmd/cron/station_status.go:177.85,179.3 1 0 +trip-planner/cmd/cron/station_status.go:182.2,182.106 1 1 +trip-planner/cmd/cron/station_status.go:182.106,184.3 1 0 +trip-planner/cmd/cron/station_status.go:187.2,187.115 1 1 +trip-planner/cmd/cron/station_status.go:187.115,189.3 1 0 +trip-planner/cmd/cron/station_status.go:192.2,192.125 1 1 +trip-planner/cmd/cron/station_status.go:192.125,194.3 1 0 +trip-planner/cmd/cron/station_status.go:196.2,196.23 1 1 +trip-planner/cmd/cron/station_status.go:201.73,206.33 3 1 +trip-planner/cmd/cron/station_status.go:206.33,208.3 1 1 +trip-planner/cmd/cron/station_status.go:208.8,210.3 1 0 +trip-planner/cmd/cron/station_status.go:211.2,211.16 1 1 +trip-planner/cmd/cron/station_status.go:211.16,215.3 2 0 +trip-planner/cmd/cron/station_status.go:217.2,218.16 2 1 +trip-planner/cmd/cron/station_status.go:218.16,221.3 2 0 +trip-planner/cmd/cron/station_status.go:223.2,224.12 2 1 +trip-planner/cmd/cron/station_status.go:230.80,231.35 1 0 +trip-planner/cmd/cron/station_status.go:231.35,232.54 1 0 +trip-planner/cmd/cron/station_status.go:232.54,234.4 1 0 +trip-planner/cmd/cron/station_status.go:236.2,236.12 1 0 trip-planner/internal/cache/preferences.go:38.47,40.2 1 1 trip-planner/internal/cache/preferences.go:43.105,52.16 2 1 trip-planner/internal/cache/preferences.go:52.16,54.3 1 0 @@ -64,44 +184,42 @@ trip-planner/internal/cache/store.go:59.2,59.16 1 1 trip-planner/internal/cache/store.go:59.16,61.3 1 0 trip-planner/internal/cache/store.go:62.2,63.17 2 1 trip-planner/internal/cache/store.go:67.102,69.2 1 1 -trip-planner/internal/cache/store.go:72.80,74.31 2 1 -trip-planner/internal/cache/store.go:74.31,76.3 1 0 -trip-planner/internal/cache/store.go:77.2,77.16 1 1 -trip-planner/internal/cache/store.go:77.16,79.3 1 0 -trip-planner/internal/cache/store.go:80.2,80.18 1 1 -trip-planner/internal/cache/store.go:84.72,86.2 1 1 -trip-planner/internal/cache/store.go:89.84,91.2 1 0 -trip-planner/internal/cache/store.go:94.84,96.2 1 0 -trip-planner/internal/cache/store.go:100.44,109.2 7 1 -trip-planner/internal/cache/store.go:111.36,112.16 1 1 -trip-planner/internal/cache/store.go:113.14,114.64 1 1 -trip-planner/internal/cache/store.go:115.17,116.66 1 1 -trip-planner/internal/cache/store.go:117.16,121.33 1 1 -trip-planner/internal/cache/store.go:122.10,123.65 1 0 -trip-planner/internal/cache/store.go:133.68,137.2 1 0 -trip-planner/internal/cache/store.go:152.40,154.2 1 0 -trip-planner/internal/cache/store.go:157.41,159.2 1 0 -trip-planner/internal/cache/store.go:162.52,164.2 1 0 -trip-planner/internal/cache/store.go:174.65,176.2 1 1 -trip-planner/internal/cache/store.go:181.143,183.67 1 1 -trip-planner/internal/cache/store.go:183.67,185.3 1 1 -trip-planner/internal/cache/store.go:188.2,189.16 2 1 -trip-planner/internal/cache/store.go:189.16,191.3 1 0 -trip-planner/internal/cache/store.go:194.2,194.57 1 1 -trip-planner/internal/cache/store.go:194.57,196.3 1 0 -trip-planner/internal/cache/store.go:198.2,198.18 1 1 -trip-planner/internal/cache/store.go:202.112,204.2 1 1 -trip-planner/internal/cache/store.go:207.115,209.2 1 0 -trip-planner/internal/cache/store.go:214.130,216.15 2 1 -trip-planner/internal/cache/store.go:216.15,218.3 1 1 -trip-planner/internal/cache/store.go:218.8,220.3 1 1 -trip-planner/internal/cache/store.go:223.2,224.31 2 1 -trip-planner/internal/cache/store.go:224.31,227.3 2 0 -trip-planner/internal/cache/store.go:230.2,230.31 1 1 -trip-planner/internal/cache/store.go:230.31,232.3 1 0 -trip-planner/internal/cache/store.go:232.8,232.23 1 1 -trip-planner/internal/cache/store.go:232.23,234.3 1 0 -trip-planner/internal/cache/store.go:237.2,238.16 2 1 +trip-planner/internal/cache/store.go:72.80,74.16 2 1 +trip-planner/internal/cache/store.go:74.16,76.3 1 0 +trip-planner/internal/cache/store.go:77.2,77.23 1 1 +trip-planner/internal/cache/store.go:81.72,83.2 1 1 +trip-planner/internal/cache/store.go:86.84,88.2 1 0 +trip-planner/internal/cache/store.go:91.84,93.2 1 0 +trip-planner/internal/cache/store.go:97.44,106.2 7 1 +trip-planner/internal/cache/store.go:108.36,109.9 1 1 +trip-planner/internal/cache/store.go:110.54,111.74 1 0 +trip-planner/internal/cache/store.go:112.58,113.78 1 0 +trip-planner/internal/cache/store.go:114.24,115.64 1 1 +trip-planner/internal/cache/store.go:116.27,117.66 1 1 +trip-planner/internal/cache/store.go:118.26,122.33 1 1 +trip-planner/internal/cache/store.go:123.10,124.65 1 0 +trip-planner/internal/cache/store.go:134.68,138.2 1 0 +trip-planner/internal/cache/store.go:153.40,155.2 1 0 +trip-planner/internal/cache/store.go:158.41,160.2 1 0 +trip-planner/internal/cache/store.go:163.52,165.2 1 0 +trip-planner/internal/cache/store.go:175.65,177.2 1 1 +trip-planner/internal/cache/store.go:182.143,184.67 1 1 +trip-planner/internal/cache/store.go:184.67,186.3 1 1 +trip-planner/internal/cache/store.go:189.2,190.16 2 1 +trip-planner/internal/cache/store.go:190.16,192.3 1 0 +trip-planner/internal/cache/store.go:195.2,195.57 1 1 +trip-planner/internal/cache/store.go:195.57,197.3 1 0 +trip-planner/internal/cache/store.go:199.2,199.18 1 1 +trip-planner/internal/cache/store.go:203.112,205.2 1 1 +trip-planner/internal/cache/store.go:208.115,210.2 1 0 +trip-planner/internal/cache/store.go:215.130,217.15 2 1 +trip-planner/internal/cache/store.go:217.15,219.3 1 1 +trip-planner/internal/cache/store.go:219.8,221.3 1 1 +trip-planner/internal/cache/store.go:224.2,225.16 2 1 +trip-planner/internal/cache/store.go:225.16,227.3 1 0 +trip-planner/internal/cache/store.go:228.2,228.17 1 1 +trip-planner/internal/cache/store.go:228.17,231.3 2 0 +trip-planner/internal/cache/store.go:234.2,238.16 3 1 trip-planner/internal/cache/store.go:238.16,240.3 1 0 trip-planner/internal/cache/store.go:243.2,243.57 1 1 trip-planner/internal/cache/store.go:243.57,245.3 1 0 @@ -110,249 +228,17 @@ trip-planner/internal/cache/store.go:251.79,253.2 1 1 trip-planner/internal/cache/store.go:256.82,258.2 1 1 trip-planner/internal/cache/store.go:261.81,263.2 1 1 trip-planner/internal/cache/store.go:266.71,268.2 1 0 -trip-planner/internal/cache/store.go:271.78,273.31 2 0 -trip-planner/internal/cache/store.go:273.31,276.3 2 0 -trip-planner/internal/cache/store.go:277.2,277.16 1 0 -trip-planner/internal/cache/store.go:277.16,279.3 1 0 +trip-planner/internal/cache/store.go:271.78,273.16 2 0 +trip-planner/internal/cache/store.go:273.16,275.3 1 0 +trip-planner/internal/cache/store.go:276.2,276.16 1 0 +trip-planner/internal/cache/store.go:276.16,279.3 2 0 trip-planner/internal/cache/store.go:280.2,281.17 2 0 trip-planner/internal/cache/store.go:285.101,287.2 1 0 -trip-planner/internal/cache/store.go:290.79,292.31 2 0 -trip-planner/internal/cache/store.go:292.31,294.3 1 0 -trip-planner/internal/cache/store.go:295.2,295.16 1 0 -trip-planner/internal/cache/store.go:295.16,297.3 1 0 -trip-planner/internal/cache/store.go:298.2,298.18 1 0 -trip-planner/internal/cache/store.go:302.83,304.2 1 0 -trip-planner/internal/cache/store.go:307.83,309.2 1 0 -trip-planner/internal/airports/airports.go:36.61,42.2 1 1 -trip-planner/internal/airports/airports.go:45.65,53.2 3 1 -trip-planner/internal/airports/airports.go:56.60,57.39 1 1 -trip-planner/internal/airports/airports.go:57.39,59.3 1 1 -trip-planner/internal/airports/airports.go:63.71,65.39 1 1 -trip-planner/internal/airports/airports.go:65.39,67.3 1 1 -trip-planner/internal/airports/airports.go:68.2,68.21 1 1 -trip-planner/internal/airports/airports.go:72.76,73.39 1 1 -trip-planner/internal/airports/airports.go:73.39,75.3 1 1 -trip-planner/internal/airports/airports.go:76.2,76.19 1 1 -trip-planner/internal/airports/airports.go:80.39,82.2 1 1 -trip-planner/internal/airports/airports.go:85.36,86.47 1 1 -trip-planner/internal/airports/airports.go:86.47,88.3 1 1 -trip-planner/internal/airports/airports.go:92.64,94.33 2 1 -trip-planner/internal/airports/airports.go:94.33,95.20 1 1 -trip-planner/internal/airports/airports.go:95.20,97.4 1 1 -trip-planner/internal/airports/airports.go:99.2,99.15 1 1 -trip-planner/internal/storage/neighbors.go:29.56,33.2 1 1 -trip-planner/internal/storage/neighbors.go:36.81,43.2 1 1 -trip-planner/internal/storage/neighbors.go:46.80,47.50 1 1 -trip-planner/internal/storage/neighbors.go:47.50,49.3 1 1 -trip-planner/internal/storage/neighbors.go:50.2,50.12 1 1 -trip-planner/internal/storage/neighbors.go:54.76,55.50 1 1 -trip-planner/internal/storage/neighbors.go:55.50,56.28 1 1 -trip-planner/internal/storage/neighbors.go:56.28,57.43 1 1 -trip-planner/internal/storage/neighbors.go:57.43,60.5 2 1 -trip-planner/internal/storage/neighbors.go:66.85,67.50 1 1 -trip-planner/internal/storage/neighbors.go:67.50,69.31 2 1 -trip-planner/internal/storage/neighbors.go:69.31,70.21 1 1 -trip-planner/internal/storage/neighbors.go:70.21,72.5 1 1 -trip-planner/internal/storage/neighbors.go:74.3,74.16 1 1 -trip-planner/internal/storage/neighbors.go:76.2,76.12 1 0 -trip-planner/internal/storage/transfer_rules.go:14.81,16.39 1 0 -trip-planner/internal/storage/transfer_rules.go:16.39,18.3 1 0 -trip-planner/internal/storage/transfer_rules.go:21.2,22.39 2 0 -trip-planner/internal/storage/transfer_rules.go:22.39,24.3 1 0 -trip-planner/internal/storage/transfer_rules.go:27.2,27.19 1 0 -trip-planner/internal/storage/transfer_rules.go:32.44,34.17 1 0 -trip-planner/internal/storage/transfer_rules.go:35.63,36.28 1 0 -trip-planner/internal/storage/transfer_rules.go:37.63,38.27 1 0 -trip-planner/internal/storage/transfer_rules.go:39.10,40.17 1 0 -trip-planner/internal/metrics/metrics.go:37.21,44.2 1 1 -trip-planner/internal/metrics/metrics.go:47.48,51.2 3 1 -trip-planner/internal/metrics/metrics.go:54.49,58.2 3 1 -trip-planner/internal/metrics/metrics.go:61.51,65.2 3 1 -trip-planner/internal/metrics/metrics.go:68.46,72.2 3 1 -trip-planner/internal/metrics/metrics.go:75.50,81.63 5 1 -trip-planner/internal/metrics/metrics.go:81.63,83.3 1 1 -trip-planner/internal/metrics/metrics.go:87.57,93.16 6 1 -trip-planner/internal/metrics/metrics.go:93.16,95.3 1 1 -trip-planner/internal/metrics/metrics.go:96.2,96.39 1 1 -trip-planner/internal/metrics/metrics.go:100.59,105.59 4 1 -trip-planner/internal/metrics/metrics.go:105.59,107.45 2 1 -trip-planner/internal/metrics/metrics.go:107.45,109.4 1 1 -trip-planner/internal/metrics/metrics.go:110.3,110.83 1 1 -trip-planner/internal/metrics/metrics.go:113.2,123.15 2 1 -trip-planner/internal/metrics/metrics.go:127.47,129.35 2 1 -trip-planner/internal/metrics/metrics.go:129.35,131.3 1 1 -trip-planner/internal/metrics/metrics.go:132.2,132.39 1 1 -trip-planner/internal/metrics/metrics.go:132.39,134.3 1 1 -trip-planner/internal/metrics/metrics.go:135.2,136.16 2 1 -trip-planner/internal/metrics/metrics.go:136.16,138.3 1 0 -trip-planner/internal/metrics/metrics.go:139.2,139.44 1 1 -trip-planner/internal/metrics/metrics.go:143.64,147.2 3 1 -trip-planner/internal/metrics/metrics.go:150.67,155.2 4 1 -trip-planner/cmd/api/handlers.go:64.83,66.17 2 1 -trip-planner/cmd/api/handlers.go:66.17,69.3 2 0 -trip-planner/cmd/api/handlers.go:72.2,74.33 3 1 -trip-planner/cmd/api/handlers.go:97.79,99.20 2 1 -trip-planner/cmd/api/handlers.go:99.20,102.3 2 0 -trip-planner/cmd/api/handlers.go:103.2,112.26 4 1 -trip-planner/cmd/api/handlers.go:112.26,115.33 2 1 -trip-planner/cmd/api/handlers.go:115.33,116.43 1 0 -trip-planner/cmd/api/handlers.go:116.43,117.42 1 0 -trip-planner/cmd/api/handlers.go:117.42,119.11 2 0 -trip-planner/cmd/api/handlers.go:123.3,123.20 1 1 -trip-planner/cmd/api/handlers.go:123.20,125.4 1 1 -trip-planner/cmd/api/handlers.go:129.2,130.35 2 1 -trip-planner/cmd/api/handlers.go:130.35,134.20 2 1 -trip-planner/cmd/api/handlers.go:134.20,137.4 2 1 -trip-planner/cmd/api/handlers.go:138.3,138.20 1 1 -trip-planner/cmd/api/handlers.go:138.20,140.4 1 0 -trip-planner/cmd/api/handlers.go:143.3,143.34 1 1 -trip-planner/cmd/api/handlers.go:143.34,145.36 2 1 -trip-planner/cmd/api/handlers.go:145.36,153.5 1 1 -trip-planner/cmd/api/handlers.go:157.2,162.33 3 1 -trip-planner/cmd/api/handlers.go:167.55,168.16 1 1 -trip-planner/cmd/api/handlers.go:169.11,170.52 1 1 -trip-planner/cmd/api/handlers.go:171.11,172.52 1 0 -trip-planner/cmd/api/handlers.go:173.10,174.38 1 0 -trip-planner/cmd/api/handlers.go:179.78,185.61 2 1 -trip-planner/cmd/api/handlers.go:185.61,188.3 2 0 -trip-planner/cmd/api/handlers.go:191.2,217.32 8 1 -trip-planner/cmd/api/handlers.go:217.32,226.3 2 1 -trip-planner/cmd/api/handlers.go:228.2,233.33 3 1 -trip-planner/cmd/api/handlers.go:237.79,239.20 2 1 -trip-planner/cmd/api/handlers.go:239.20,242.3 2 0 -trip-planner/cmd/api/handlers.go:247.2,252.41 3 1 -trip-planner/cmd/api/handlers.go:252.41,253.22 1 1 -trip-planner/cmd/api/handlers.go:253.22,256.4 2 1 -trip-planner/cmd/api/handlers.go:261.2,263.41 2 1 -trip-planner/cmd/api/handlers.go:263.41,268.21 3 1 -trip-planner/cmd/api/handlers.go:268.21,270.4 1 1 -trip-planner/cmd/api/handlers.go:273.3,273.29 1 1 -trip-planner/cmd/api/handlers.go:274.35,275.27 1 0 -trip-planner/cmd/api/handlers.go:276.33,277.27 1 0 -trip-planner/cmd/api/handlers.go:278.35,279.27 1 1 -trip-planner/cmd/api/handlers.go:284.3,288.22 4 1 -trip-planner/cmd/api/handlers.go:288.22,289.12 1 0 -trip-planner/cmd/api/handlers.go:291.3,319.53 4 1 -trip-planner/cmd/api/handlers.go:319.53,344.4 3 1 -trip-planner/cmd/api/handlers.go:347.2,353.33 3 1 -trip-planner/cmd/api/handlers.go:357.80,361.20 2 1 -trip-planner/cmd/api/handlers.go:361.20,364.3 2 0 -trip-planner/cmd/api/handlers.go:365.2,372.20 4 1 -trip-planner/cmd/api/handlers.go:372.20,373.42 1 0 -trip-planner/cmd/api/handlers.go:373.42,374.60 1 0 -trip-planner/cmd/api/handlers.go:374.60,375.42 1 0 -trip-planner/cmd/api/handlers.go:375.42,377.11 2 0 -trip-planner/cmd/api/handlers.go:383.2,384.19 2 1 -trip-planner/cmd/api/handlers.go:384.19,386.3 1 1 -trip-planner/cmd/api/handlers.go:388.2,389.20 2 1 -trip-planner/cmd/api/handlers.go:389.20,391.3 1 0 -trip-planner/cmd/api/handlers.go:393.2,401.33 3 1 -trip-planner/cmd/api/handlers.go:406.81,410.38 3 1 -trip-planner/cmd/api/handlers.go:410.38,413.3 2 1 -trip-planner/cmd/api/handlers.go:414.2,414.13 1 1 -trip-planner/cmd/api/handlers.go:419.85,421.26 1 1 -trip-planner/cmd/api/handlers.go:421.26,423.3 1 1 -trip-planner/cmd/api/handlers.go:426.2,428.20 2 1 -trip-planner/cmd/api/handlers.go:428.20,431.3 2 0 -trip-planner/cmd/api/handlers.go:432.2,439.61 3 1 -trip-planner/cmd/api/handlers.go:439.61,442.3 2 1 -trip-planner/cmd/api/handlers.go:445.2,449.32 2 1 -trip-planner/cmd/api/handlers.go:449.32,452.3 2 1 -trip-planner/cmd/api/handlers.go:455.2,455.28 1 1 -trip-planner/cmd/api/handlers.go:455.28,458.3 2 1 -trip-planner/cmd/api/handlers.go:462.2,472.33 4 1 -trip-planner/cmd/api/handlers.go:477.58,484.2 3 1 -trip-planner/cmd/api/handlers.go:494.81,496.18 2 1 -trip-planner/cmd/api/handlers.go:496.18,498.3 1 0 -trip-planner/cmd/api/handlers.go:500.2,501.16 2 1 -trip-planner/cmd/api/handlers.go:501.16,504.3 2 0 -trip-planner/cmd/api/handlers.go:506.2,510.4 2 1 -trip-planner/cmd/api/handlers.go:514.79,516.18 2 1 -trip-planner/cmd/api/handlers.go:516.18,518.3 1 0 -trip-planner/cmd/api/handlers.go:520.2,524.61 2 1 -trip-planner/cmd/api/handlers.go:524.61,527.3 2 0 -trip-planner/cmd/api/handlers.go:529.2,529.97 1 1 -trip-planner/cmd/api/handlers.go:529.97,532.3 2 0 -trip-planner/cmd/api/handlers.go:534.2,537.4 2 1 -trip-planner/cmd/api/handlers.go:541.82,543.18 2 1 -trip-planner/cmd/api/handlers.go:543.18,545.3 1 0 -trip-planner/cmd/api/handlers.go:547.2,548.67 2 1 -trip-planner/cmd/api/handlers.go:548.67,551.3 2 0 -trip-planner/cmd/api/handlers.go:553.2,553.86 1 1 -trip-planner/cmd/api/handlers.go:553.86,556.3 2 0 -trip-planner/cmd/api/handlers.go:558.2,561.4 2 1 -trip-planner/cmd/api/handlers.go:565.83,567.18 2 1 -trip-planner/cmd/api/handlers.go:567.18,569.3 1 0 -trip-planner/cmd/api/handlers.go:571.2,572.16 2 1 -trip-planner/cmd/api/handlers.go:572.16,575.3 2 0 -trip-planner/cmd/api/handlers.go:577.2,581.4 2 1 -trip-planner/cmd/api/handlers.go:585.83,587.18 2 1 -trip-planner/cmd/api/handlers.go:587.18,589.3 1 0 -trip-planner/cmd/api/handlers.go:591.2,596.61 2 1 -trip-planner/cmd/api/handlers.go:596.61,599.3 2 0 -trip-planner/cmd/api/handlers.go:601.2,601.113 1 1 -trip-planner/cmd/api/handlers.go:601.113,604.3 2 0 -trip-planner/cmd/api/handlers.go:606.2,609.4 2 1 -trip-planner/cmd/api/handlers.go:613.81,616.2 2 0 -trip-planner/cmd/api/handlers.go:619.133,631.2 2 1 -trip-planner/cmd/api/main.go:16.13,38.2 15 0 -trip-planner/cmd/api/main.go:41.32,48.2 2 0 -trip-planner/cmd/api/main.go:52.73,57.2 2 0 -trip-planner/cmd/api/main.go:61.122,62.54 1 0 -trip-planner/cmd/api/main.go:62.54,64.3 1 0 -trip-planner/cmd/cron/station_status.go:42.50,47.2 1 1 -trip-planner/cmd/cron/station_status.go:50.45,55.2 1 1 -trip-planner/cmd/cron/station_status.go:58.46,63.2 1 1 -trip-planner/cmd/cron/station_status.go:66.51,71.2 1 1 -trip-planner/cmd/cron/station_status.go:75.98,82.16 2 0 -trip-planner/cmd/cron/station_status.go:82.16,84.3 1 0 -trip-planner/cmd/cron/station_status.go:86.2,88.23 2 0 -trip-planner/cmd/cron/station_status.go:95.99,104.16 7 1 -trip-planner/cmd/cron/station_status.go:104.16,106.3 1 0 -trip-planner/cmd/cron/station_status.go:106.8,106.24 1 1 -trip-planner/cmd/cron/station_status.go:106.24,108.40 2 1 -trip-planner/cmd/cron/station_status.go:108.40,110.4 1 1 -trip-planner/cmd/cron/station_status.go:110.9,112.4 1 1 -trip-planner/cmd/cron/station_status.go:113.8,115.3 1 1 -trip-planner/cmd/cron/station_status.go:118.2,120.16 3 1 -trip-planner/cmd/cron/station_status.go:120.16,122.3 1 0 -trip-planner/cmd/cron/station_status.go:122.8,122.32 1 1 -trip-planner/cmd/cron/station_status.go:122.32,125.17 3 1 -trip-planner/cmd/cron/station_status.go:125.17,127.4 1 1 -trip-planner/cmd/cron/station_status.go:131.2,133.40 3 1 -trip-planner/cmd/cron/station_status.go:133.40,135.17 2 1 -trip-planner/cmd/cron/station_status.go:135.17,137.4 1 1 -trip-planner/cmd/cron/station_status.go:141.2,143.45 3 1 -trip-planner/cmd/cron/station_status.go:143.45,145.17 2 1 -trip-planner/cmd/cron/station_status.go:145.17,147.4 1 1 -trip-planner/cmd/cron/station_status.go:151.2,153.19 2 1 -trip-planner/cmd/cron/station_status.go:153.19,158.3 4 1 -trip-planner/cmd/cron/station_status.go:158.8,160.25 2 1 -trip-planner/cmd/cron/station_status.go:160.25,162.4 1 1 -trip-planner/cmd/cron/station_status.go:163.3,163.20 1 1 -trip-planner/cmd/cron/station_status.go:163.20,165.4 1 1 -trip-planner/cmd/cron/station_status.go:165.9,167.4 1 1 -trip-planner/cmd/cron/station_status.go:171.2,171.85 1 1 -trip-planner/cmd/cron/station_status.go:171.85,173.3 1 0 -trip-planner/cmd/cron/station_status.go:176.2,176.106 1 1 -trip-planner/cmd/cron/station_status.go:176.106,178.3 1 0 -trip-planner/cmd/cron/station_status.go:181.2,181.115 1 1 -trip-planner/cmd/cron/station_status.go:181.115,183.3 1 0 -trip-planner/cmd/cron/station_status.go:186.2,186.125 1 1 -trip-planner/cmd/cron/station_status.go:186.125,188.3 1 0 -trip-planner/cmd/cron/station_status.go:190.2,190.23 1 1 -trip-planner/cmd/cron/station_status.go:195.73,200.33 3 1 -trip-planner/cmd/cron/station_status.go:200.33,202.3 1 1 -trip-planner/cmd/cron/station_status.go:202.8,204.3 1 0 -trip-planner/cmd/cron/station_status.go:205.2,205.16 1 1 -trip-planner/cmd/cron/station_status.go:205.16,209.3 2 0 -trip-planner/cmd/cron/station_status.go:211.2,212.16 2 1 -trip-planner/cmd/cron/station_status.go:212.16,215.3 2 0 -trip-planner/cmd/cron/station_status.go:217.2,218.12 2 1 -trip-planner/cmd/cron/station_status.go:224.80,225.35 1 0 -trip-planner/cmd/cron/station_status.go:225.35,226.54 1 0 -trip-planner/cmd/cron/station_status.go:226.54,228.4 1 0 -trip-planner/cmd/cron/station_status.go:230.2,230.12 1 0 +trip-planner/internal/cache/store.go:290.79,292.16 2 0 +trip-planner/internal/cache/store.go:292.16,294.3 1 0 +trip-planner/internal/cache/store.go:295.2,295.20 1 0 +trip-planner/internal/cache/store.go:299.83,301.2 1 0 +trip-planner/internal/cache/store.go:304.83,306.2 1 0 trip-planner/internal/routing/graph.go:100.24,106.2 1 1 trip-planner/internal/routing/graph.go:109.37,111.2 1 1 trip-planner/internal/routing/graph.go:114.37,116.2 1 1 @@ -388,276 +274,403 @@ trip-planner/internal/routing/graph.go:270.44,271.28 1 1 trip-planner/internal/routing/graph.go:271.28,272.17 1 1 trip-planner/internal/routing/graph.go:272.17,274.4 1 1 trip-planner/internal/routing/graph.go:276.2,276.12 1 0 -trip-planner/internal/routing/graph.go:283.190,289.56 2 1 -trip-planner/internal/routing/graph.go:289.56,292.31 2 0 -trip-planner/internal/routing/graph.go:292.31,294.4 1 0 -trip-planner/internal/routing/graph.go:295.3,295.29 1 0 -trip-planner/internal/routing/graph.go:295.29,297.4 1 0 -trip-planner/internal/routing/graph.go:300.3,300.54 1 0 -trip-planner/internal/routing/graph.go:300.54,303.21 2 0 -trip-planner/internal/routing/graph.go:303.21,305.25 1 0 -trip-planner/internal/routing/graph.go:305.25,307.6 1 0 -trip-planner/internal/routing/graph.go:309.5,309.32 1 0 -trip-planner/internal/routing/graph.go:309.32,311.6 1 0 -trip-planner/internal/routing/graph.go:314.4,314.46 1 0 -trip-planner/internal/routing/graph.go:314.46,317.34 2 0 -trip-planner/internal/routing/graph.go:317.34,318.152 1 0 -trip-planner/internal/routing/graph.go:318.152,320.11 2 0 -trip-planner/internal/routing/graph.go:323.5,323.23 1 0 -trip-planner/internal/routing/graph.go:323.23,344.6 2 0 -trip-planner/internal/routing/graph.go:348.2,355.41 4 1 -trip-planner/internal/routing/graph.go:355.41,357.3 1 0 -trip-planner/internal/routing/graph.go:360.2,386.21 7 1 -trip-planner/internal/routing/graph.go:386.21,392.31 3 1 -trip-planner/internal/routing/graph.go:392.31,394.89 1 1 -trip-planner/internal/routing/graph.go:394.89,399.5 3 1 -trip-planner/internal/routing/graph.go:401.4,401.12 1 1 -trip-planner/internal/routing/graph.go:405.3,405.44 1 1 -trip-planner/internal/routing/graph.go:405.44,413.33 4 1 -trip-planner/internal/routing/graph.go:413.33,416.5 1 0 -trip-planner/internal/routing/graph.go:418.4,422.52 3 1 -trip-planner/internal/routing/graph.go:422.52,423.48 1 1 -trip-planner/internal/routing/graph.go:423.48,425.14 1 0 -trip-planner/internal/routing/graph.go:428.4,431.23 3 1 -trip-planner/internal/routing/graph.go:431.23,433.5 1 1 -trip-planner/internal/routing/graph.go:436.4,440.40 3 1 -trip-planner/internal/routing/graph.go:440.40,448.5 1 1 -trip-planner/internal/routing/graph.go:448.10,456.5 1 1 -trip-planner/internal/routing/graph.go:458.4,466.66 2 1 -trip-planner/internal/routing/graph.go:466.66,467.13 1 1 -trip-planner/internal/routing/graph.go:470.4,476.6 1 1 -trip-planner/internal/routing/graph.go:480.3,480.41 1 1 -trip-planner/internal/routing/graph.go:480.41,481.46 1 1 -trip-planner/internal/routing/graph.go:481.46,483.5 1 1 -trip-planner/internal/routing/graph.go:484.4,484.50 1 1 -trip-planner/internal/routing/graph.go:490.2,490.17 1 1 -trip-planner/internal/routing/graph.go:490.17,494.24 2 1 -trip-planner/internal/routing/graph.go:494.24,516.24 8 1 -trip-planner/internal/routing/graph.go:516.24,520.33 3 1 -trip-planner/internal/routing/graph.go:520.33,522.93 1 0 -trip-planner/internal/routing/graph.go:522.93,526.7 3 0 -trip-planner/internal/routing/graph.go:527.6,527.14 1 0 -trip-planner/internal/routing/graph.go:530.5,530.72 1 1 -trip-planner/internal/routing/graph.go:530.72,531.14 1 0 -trip-planner/internal/routing/graph.go:534.5,534.46 1 1 -trip-planner/internal/routing/graph.go:534.46,540.35 4 1 -trip-planner/internal/routing/graph.go:540.35,542.7 1 0 -trip-planner/internal/routing/graph.go:544.6,547.38 3 1 -trip-planner/internal/routing/graph.go:547.38,548.15 1 0 -trip-planner/internal/routing/graph.go:550.6,553.25 3 1 -trip-planner/internal/routing/graph.go:553.25,555.7 1 1 -trip-planner/internal/routing/graph.go:557.6,560.42 3 1 -trip-planner/internal/routing/graph.go:560.42,568.7 1 1 -trip-planner/internal/routing/graph.go:568.12,576.7 1 1 -trip-planner/internal/routing/graph.go:578.6,585.70 2 1 -trip-planner/internal/routing/graph.go:585.70,586.16 1 1 -trip-planner/internal/routing/graph.go:589.6,595.8 1 1 -trip-planner/internal/routing/graph.go:599.5,599.44 1 1 -trip-planner/internal/routing/graph.go:599.44,600.50 1 0 -trip-planner/internal/routing/graph.go:600.50,602.7 1 0 -trip-planner/internal/routing/graph.go:603.6,603.54 1 0 -trip-planner/internal/routing/graph.go:607.4,607.20 1 1 -trip-planner/internal/routing/graph.go:607.20,609.5 1 0 -trip-planner/internal/routing/graph.go:614.3,614.44 1 1 -trip-planner/internal/routing/graph.go:614.44,625.18 4 0 -trip-planner/internal/routing/graph.go:625.18,628.5 1 0 -trip-planner/internal/routing/graph.go:631.4,631.38 1 0 -trip-planner/internal/routing/graph.go:631.38,636.24 3 0 -trip-planner/internal/routing/graph.go:636.24,643.6 2 0 -trip-planner/internal/routing/graph.go:644.5,644.22 1 0 -trip-planner/internal/routing/graph.go:644.22,651.6 2 0 -trip-planner/internal/routing/graph.go:653.5,661.7 1 0 -trip-planner/internal/routing/graph.go:665.4,683.24 7 0 -trip-planner/internal/routing/graph.go:683.24,687.33 3 0 -trip-planner/internal/routing/graph.go:687.33,689.93 1 0 -trip-planner/internal/routing/graph.go:689.93,693.7 3 0 -trip-planner/internal/routing/graph.go:694.6,694.14 1 0 -trip-planner/internal/routing/graph.go:697.5,697.72 1 0 -trip-planner/internal/routing/graph.go:697.72,698.14 1 0 -trip-planner/internal/routing/graph.go:701.5,701.46 1 0 -trip-planner/internal/routing/graph.go:701.46,707.35 4 0 -trip-planner/internal/routing/graph.go:707.35,709.7 1 0 -trip-planner/internal/routing/graph.go:711.6,714.38 3 0 -trip-planner/internal/routing/graph.go:714.38,715.15 1 0 -trip-planner/internal/routing/graph.go:717.6,720.25 3 0 -trip-planner/internal/routing/graph.go:720.25,722.7 1 0 -trip-planner/internal/routing/graph.go:724.6,727.42 3 0 -trip-planner/internal/routing/graph.go:727.42,735.7 1 0 -trip-planner/internal/routing/graph.go:735.12,743.7 1 0 -trip-planner/internal/routing/graph.go:745.6,752.70 2 0 -trip-planner/internal/routing/graph.go:752.70,753.16 1 0 -trip-planner/internal/routing/graph.go:756.6,762.8 1 0 -trip-planner/internal/routing/graph.go:766.5,766.44 1 0 -trip-planner/internal/routing/graph.go:766.44,767.50 1 0 -trip-planner/internal/routing/graph.go:767.50,769.7 1 0 -trip-planner/internal/routing/graph.go:770.6,770.54 1 0 -trip-planner/internal/routing/graph.go:774.4,774.20 1 0 -trip-planner/internal/routing/graph.go:774.20,776.5 1 0 -trip-planner/internal/routing/graph.go:779.3,779.13 1 1 -trip-planner/internal/routing/graph.go:782.2,782.13 1 1 -trip-planner/internal/routing/graph.go:787.72,788.50 1 0 -trip-planner/internal/routing/graph.go:788.50,791.3 1 0 -trip-planner/internal/routing/graph.go:794.2,794.18 1 0 -trip-planner/internal/routing/graph.go:794.18,796.3 1 0 -trip-planner/internal/routing/graph.go:799.2,802.41 3 0 -trip-planner/internal/routing/graph.go:802.41,812.41 5 0 -trip-planner/internal/routing/graph.go:812.41,814.4 1 0 -trip-planner/internal/routing/graph.go:817.3,817.45 1 0 -trip-planner/internal/routing/graph.go:817.45,819.4 1 0 -trip-planner/internal/routing/graph.go:822.3,822.33 1 0 -trip-planner/internal/routing/graph.go:826.2,827.18 2 0 -trip-planner/internal/routing/graph.go:883.92,888.75 2 1 -trip-planner/internal/routing/graph.go:888.75,893.48 4 1 -trip-planner/internal/routing/graph.go:893.48,895.4 1 1 -trip-planner/internal/routing/graph.go:899.2,899.26 1 1 -trip-planner/internal/routing/graph.go:900.26,901.50 1 1 -trip-planner/internal/routing/graph.go:901.50,902.76 1 1 -trip-planner/internal/routing/graph.go:902.76,904.5 1 1 -trip-planner/internal/routing/graph.go:905.4,905.74 1 1 -trip-planner/internal/routing/graph.go:905.74,907.5 1 0 -trip-planner/internal/routing/graph.go:908.4,908.58 1 1 -trip-planner/internal/routing/graph.go:910.18,911.50 1 1 -trip-planner/internal/routing/graph.go:911.50,912.56 1 1 -trip-planner/internal/routing/graph.go:912.56,914.5 1 1 -trip-planner/internal/routing/graph.go:915.4,915.74 1 1 -trip-planner/internal/routing/graph.go:915.74,917.5 1 0 -trip-planner/internal/routing/graph.go:918.4,918.78 1 1 -trip-planner/internal/routing/graph.go:920.10,921.50 1 1 -trip-planner/internal/routing/graph.go:921.50,922.74 1 1 -trip-planner/internal/routing/graph.go:922.74,924.5 1 1 -trip-planner/internal/routing/graph.go:925.4,925.76 1 1 -trip-planner/internal/routing/graph.go:925.76,927.5 1 0 -trip-planner/internal/routing/graph.go:928.4,928.58 1 1 -trip-planner/internal/routing/graph.go:934.2,935.43 2 1 -trip-planner/internal/routing/graph.go:935.43,937.35 2 1 -trip-planner/internal/routing/graph.go:937.35,944.38 1 1 -trip-planner/internal/routing/graph.go:944.38,946.10 2 0 -trip-planner/internal/routing/graph.go:949.3,949.17 1 1 -trip-planner/internal/routing/graph.go:949.17,951.4 1 1 -trip-planner/internal/routing/graph.go:954.2,954.15 1 1 -trip-planner/internal/routing/graph.go:970.51,975.17 2 1 -trip-planner/internal/routing/graph.go:975.17,977.3 1 0 -trip-planner/internal/routing/graph.go:985.2,985.19 1 1 -trip-planner/internal/routing/graph.go:991.80,996.30 2 0 -trip-planner/internal/routing/graph.go:996.30,999.3 2 0 -trip-planner/internal/routing/graph.go:1001.2,1005.30 3 0 -trip-planner/internal/routing/graph.go:1005.30,1013.44 2 0 -trip-planner/internal/routing/graph.go:1013.44,1015.4 1 0 -trip-planner/internal/routing/graph.go:1018.2,1018.13 1 0 -trip-planner/internal/routing/graph.go:1045.65,1049.67 2 1 -trip-planner/internal/routing/graph.go:1049.67,1051.3 1 1 -trip-planner/internal/routing/graph.go:1053.2,1057.37 3 1 -trip-planner/internal/routing/graph.go:1057.37,1060.32 1 1 -trip-planner/internal/routing/graph.go:1060.32,1061.62 1 1 -trip-planner/internal/routing/graph.go:1061.62,1064.30 1 1 -trip-planner/internal/routing/graph.go:1064.30,1068.11 4 1 -trip-planner/internal/routing/graph.go:1071.5,1071.51 1 1 -trip-planner/internal/routing/graph.go:1071.51,1072.74 1 1 -trip-planner/internal/routing/graph.go:1072.74,1076.7 3 1 -trip-planner/internal/routing/graph.go:1080.3,1080.20 1 1 -trip-planner/internal/routing/graph.go:1080.20,1081.9 1 1 -trip-planner/internal/routing/graph.go:1085.2,1085.22 1 1 -trip-planner/internal/routing/graph.go:1090.89,1093.19 2 1 -trip-planner/internal/routing/graph.go:1093.19,1097.3 3 1 -trip-planner/internal/routing/graph.go:1098.2,1098.15 1 1 -trip-planner/internal/routing/graph.go:1103.119,1104.39 1 1 -trip-planner/internal/routing/graph.go:1104.39,1106.3 1 1 -trip-planner/internal/routing/graph.go:1107.2,1107.18 1 0 -trip-planner/internal/routing/graph.go:1111.80,1114.17 2 0 -trip-planner/internal/routing/graph.go:1114.17,1116.3 1 0 -trip-planner/internal/routing/graph.go:1117.2,1122.30 3 0 -trip-planner/internal/routing/graph.go:1122.30,1123.79 1 0 -trip-planner/internal/routing/graph.go:1123.79,1131.4 1 0 -trip-planner/internal/routing/graph.go:1134.2,1134.25 1 0 -trip-planner/internal/routing/graph.go:1134.25,1136.3 1 0 -trip-planner/internal/routing/graph.go:1138.2,1138.18 1 0 -trip-planner/internal/routing/search_cache.go:20.116,26.2 1 1 -trip-planner/internal/routing/search_cache.go:30.130,35.38 2 0 -trip-planner/internal/routing/search_cache.go:35.38,38.3 1 0 -trip-planner/internal/routing/search_cache.go:41.2,43.16 3 0 -trip-planner/internal/routing/search_cache.go:43.16,45.3 1 0 -trip-planner/internal/routing/search_cache.go:48.2,49.63 2 0 -trip-planner/internal/routing/search_cache.go:49.63,51.3 1 0 -trip-planner/internal/routing/search_cache.go:53.2,53.21 1 0 -trip-planner/internal/routing/search_cache.go:57.130,67.16 3 0 -trip-planner/internal/routing/search_cache.go:67.16,69.3 1 0 -trip-planner/internal/routing/search_cache.go:72.2,72.37 1 0 -trip-planner/internal/routing/search_cache.go:76.68,79.20 1 1 -trip-planner/internal/routing/search_cache.go:79.20,81.3 1 1 -trip-planner/internal/routing/search_cache.go:82.2,82.12 1 1 -trip-planner/internal/routing/search_cache.go:86.68,88.17 1 1 -trip-planner/internal/routing/search_cache.go:88.17,90.3 1 1 -trip-planner/internal/routing/search_cache.go:91.2,91.72 1 1 -trip-planner/internal/yandex/client.go:65.58,81.30 2 1 -trip-planner/internal/yandex/client.go:81.30,83.3 1 1 -trip-planner/internal/yandex/client.go:85.2,85.10 1 1 -trip-planner/internal/yandex/client.go:92.55,93.25 1 1 -trip-planner/internal/yandex/client.go:93.25,95.3 1 1 -trip-planner/internal/yandex/client.go:99.62,100.25 1 1 -trip-planner/internal/yandex/client.go:100.25,102.3 1 1 -trip-planner/internal/yandex/client.go:106.97,107.25 1 1 -trip-planner/internal/yandex/client.go:107.25,114.3 1 1 -trip-planner/internal/yandex/client.go:118.45,119.25 1 0 -trip-planner/internal/yandex/client.go:119.25,121.3 1 0 -trip-planner/internal/yandex/client.go:125.107,127.48 1 0 -trip-planner/internal/yandex/client.go:127.48,129.3 1 0 -trip-planner/internal/yandex/client.go:132.2,138.67 4 0 -trip-planner/internal/yandex/client.go:138.67,140.32 1 0 -trip-planner/internal/yandex/client.go:140.32,143.4 2 0 -trip-planner/internal/yandex/client.go:145.3,146.17 2 0 -trip-planner/internal/yandex/client.go:146.17,149.4 2 0 -trip-planner/internal/yandex/client.go:152.3,152.29 1 0 -trip-planner/internal/yandex/client.go:152.29,155.4 2 0 -trip-planner/internal/yandex/client.go:157.3,159.41 2 0 -trip-planner/internal/yandex/client.go:159.41,161.28 2 0 -trip-planner/internal/yandex/client.go:161.28,163.5 1 0 -trip-planner/internal/yandex/client.go:164.4,164.23 1 0 -trip-planner/internal/yandex/client.go:168.2,170.17 3 0 -trip-planner/internal/yandex/client.go:174.85,176.16 2 0 -trip-planner/internal/yandex/client.go:176.16,178.3 1 0 -trip-planner/internal/yandex/client.go:180.2,183.20 2 0 -trip-planner/internal/yandex/client.go:183.20,185.3 1 0 -trip-planner/internal/yandex/client.go:187.2,188.16 2 0 -trip-planner/internal/yandex/client.go:188.16,190.3 1 0 -trip-planner/internal/yandex/client.go:191.2,193.28 2 0 -trip-planner/internal/yandex/client.go:193.28,195.3 1 0 -trip-planner/internal/yandex/client.go:197.2,198.65 2 0 -trip-planner/internal/yandex/client.go:198.65,200.3 1 0 -trip-planner/internal/yandex/client.go:202.2,202.19 1 0 -trip-planner/internal/yandex/client.go:259.35,261.2 1 1 -trip-planner/internal/yandex/client.go:263.54,265.2 1 1 -trip-planner/internal/yandex/client.go:268.39,269.16 1 1 -trip-planner/internal/yandex/client.go:269.16,271.3 1 1 -trip-planner/internal/yandex/client.go:273.2,273.13 1 1 -trip-planner/internal/yandex/client.go:277.60,280.26 3 1 -trip-planner/internal/yandex/client.go:280.26,282.3 1 1 -trip-planner/internal/yandex/client.go:283.2,284.10 2 1 -trip-planner/internal/yandex/client.go:289.60,296.2 1 1 -trip-planner/internal/yandex/client.go:298.40,305.19 5 1 -trip-planner/internal/yandex/client.go:305.19,308.3 2 1 -trip-planner/internal/yandex/client.go:310.2,310.117 1 1 -trip-planner/internal/yandex/client.go:313.46,315.28 2 1 -trip-planner/internal/yandex/client.go:315.28,319.3 2 1 -trip-planner/internal/yandex/client.go:325.42,331.2 1 1 -trip-planner/internal/yandex/client.go:334.49,341.2 6 1 -trip-planner/internal/yandex/client.go:343.40,347.18 3 1 -trip-planner/internal/yandex/client.go:348.14,349.14 1 1 -trip-planner/internal/yandex/client.go:350.12,352.45 1 1 -trip-planner/internal/yandex/client.go:352.45,356.4 3 1 -trip-planner/internal/yandex/client.go:357.3,357.15 1 1 -trip-planner/internal/yandex/client.go:358.16,359.14 1 0 -trip-planner/internal/yandex/client.go:361.2,361.14 1 0 -trip-planner/internal/yandex/client.go:364.43,368.18 3 1 -trip-planner/internal/yandex/client.go:369.14,369.14 0 0 -trip-planner/internal/yandex/client.go:371.16,373.24 2 1 -trip-planner/internal/yandex/client.go:373.24,376.4 2 1 -trip-planner/internal/yandex/client.go:377.12,377.12 0 0 -trip-planner/internal/yandex/client.go:382.43,386.18 3 1 -trip-planner/internal/yandex/client.go:387.14,389.38 2 1 -trip-planner/internal/yandex/client.go:389.38,392.4 2 1 -trip-planner/internal/yandex/client.go:393.16,395.28 2 0 -trip-planner/internal/yandex/client.go:396.12,396.12 0 1 -trip-planner/internal/yandex/client.go:403.55,405.16 2 0 -trip-planner/internal/yandex/client.go:405.16,407.3 1 0 -trip-planner/internal/yandex/client.go:408.2,408.25 1 0 -trip-planner/internal/yandex/client.go:411.28,414.2 1 0 +trip-planner/internal/routing/graph.go:283.190,288.56 2 1 +trip-planner/internal/routing/graph.go:288.56,291.31 2 0 +trip-planner/internal/routing/graph.go:291.31,293.4 1 0 +trip-planner/internal/routing/graph.go:294.3,294.29 1 0 +trip-planner/internal/routing/graph.go:294.29,296.4 1 0 +trip-planner/internal/routing/graph.go:299.3,299.54 1 0 +trip-planner/internal/routing/graph.go:299.54,302.21 2 0 +trip-planner/internal/routing/graph.go:302.21,304.25 1 0 +trip-planner/internal/routing/graph.go:304.25,306.6 1 0 +trip-planner/internal/routing/graph.go:308.5,308.32 1 0 +trip-planner/internal/routing/graph.go:308.32,310.6 1 0 +trip-planner/internal/routing/graph.go:313.4,313.46 1 0 +trip-planner/internal/routing/graph.go:313.46,316.34 2 0 +trip-planner/internal/routing/graph.go:316.34,317.152 1 0 +trip-planner/internal/routing/graph.go:317.152,319.12 2 0 +trip-planner/internal/routing/graph.go:322.5,322.23 1 0 +trip-planner/internal/routing/graph.go:322.23,343.6 2 0 +trip-planner/internal/routing/graph.go:349.2,356.41 4 1 +trip-planner/internal/routing/graph.go:356.41,358.3 1 0 +trip-planner/internal/routing/graph.go:361.2,387.21 7 1 +trip-planner/internal/routing/graph.go:387.21,393.31 3 1 +trip-planner/internal/routing/graph.go:393.31,395.89 1 1 +trip-planner/internal/routing/graph.go:395.89,400.5 3 1 +trip-planner/internal/routing/graph.go:402.4,402.12 1 1 +trip-planner/internal/routing/graph.go:406.3,406.44 1 1 +trip-planner/internal/routing/graph.go:406.44,414.33 4 1 +trip-planner/internal/routing/graph.go:414.33,417.5 1 0 +trip-planner/internal/routing/graph.go:419.4,423.52 3 1 +trip-planner/internal/routing/graph.go:423.52,424.48 1 1 +trip-planner/internal/routing/graph.go:424.48,426.14 1 1 +trip-planner/internal/routing/graph.go:429.4,432.23 3 1 +trip-planner/internal/routing/graph.go:432.23,434.5 1 1 +trip-planner/internal/routing/graph.go:437.4,441.40 3 1 +trip-planner/internal/routing/graph.go:441.40,449.5 1 1 +trip-planner/internal/routing/graph.go:449.10,457.5 1 1 +trip-planner/internal/routing/graph.go:459.4,467.66 2 1 +trip-planner/internal/routing/graph.go:467.66,468.13 1 1 +trip-planner/internal/routing/graph.go:471.4,477.6 1 1 +trip-planner/internal/routing/graph.go:481.3,481.41 1 1 +trip-planner/internal/routing/graph.go:481.41,482.46 1 1 +trip-planner/internal/routing/graph.go:482.46,484.5 1 1 +trip-planner/internal/routing/graph.go:485.4,485.50 1 1 +trip-planner/internal/routing/graph.go:491.2,491.17 1 1 +trip-planner/internal/routing/graph.go:491.17,495.24 2 1 +trip-planner/internal/routing/graph.go:495.24,517.24 8 1 +trip-planner/internal/routing/graph.go:517.24,521.33 3 1 +trip-planner/internal/routing/graph.go:521.33,523.93 1 0 +trip-planner/internal/routing/graph.go:523.93,527.7 3 0 +trip-planner/internal/routing/graph.go:528.6,528.14 1 0 +trip-planner/internal/routing/graph.go:531.5,531.72 1 1 +trip-planner/internal/routing/graph.go:531.72,532.14 1 0 +trip-planner/internal/routing/graph.go:535.5,535.46 1 1 +trip-planner/internal/routing/graph.go:535.46,541.35 4 1 +trip-planner/internal/routing/graph.go:541.35,543.7 1 0 +trip-planner/internal/routing/graph.go:545.6,549.54 3 1 +trip-planner/internal/routing/graph.go:549.54,550.50 1 0 +trip-planner/internal/routing/graph.go:550.50,552.16 1 0 +trip-planner/internal/routing/graph.go:555.6,558.25 3 1 +trip-planner/internal/routing/graph.go:558.25,560.7 1 1 +trip-planner/internal/routing/graph.go:562.6,565.42 3 1 +trip-planner/internal/routing/graph.go:565.42,573.7 1 1 +trip-planner/internal/routing/graph.go:573.12,581.7 1 1 +trip-planner/internal/routing/graph.go:583.6,590.68 2 1 +trip-planner/internal/routing/graph.go:590.68,591.15 1 1 +trip-planner/internal/routing/graph.go:594.6,600.8 1 1 +trip-planner/internal/routing/graph.go:604.5,604.44 1 1 +trip-planner/internal/routing/graph.go:604.44,605.50 1 0 +trip-planner/internal/routing/graph.go:605.50,607.7 1 0 +trip-planner/internal/routing/graph.go:608.6,608.54 1 0 +trip-planner/internal/routing/graph.go:612.4,612.20 1 1 +trip-planner/internal/routing/graph.go:612.20,614.5 1 0 +trip-planner/internal/routing/graph.go:619.3,619.44 1 1 +trip-planner/internal/routing/graph.go:619.44,630.18 4 0 +trip-planner/internal/routing/graph.go:630.18,633.5 1 0 +trip-planner/internal/routing/graph.go:636.4,636.38 1 0 +trip-planner/internal/routing/graph.go:636.38,641.24 3 0 +trip-planner/internal/routing/graph.go:641.24,648.6 2 0 +trip-planner/internal/routing/graph.go:649.5,649.22 1 0 +trip-planner/internal/routing/graph.go:649.22,656.6 2 0 +trip-planner/internal/routing/graph.go:658.5,666.7 1 0 +trip-planner/internal/routing/graph.go:670.4,688.24 7 0 +trip-planner/internal/routing/graph.go:688.24,692.33 3 0 +trip-planner/internal/routing/graph.go:692.33,694.93 1 0 +trip-planner/internal/routing/graph.go:694.93,698.7 3 0 +trip-planner/internal/routing/graph.go:699.6,699.14 1 0 +trip-planner/internal/routing/graph.go:702.5,702.72 1 0 +trip-planner/internal/routing/graph.go:702.72,703.14 1 0 +trip-planner/internal/routing/graph.go:706.5,706.46 1 0 +trip-planner/internal/routing/graph.go:706.46,712.35 4 0 +trip-planner/internal/routing/graph.go:712.35,714.7 1 0 +trip-planner/internal/routing/graph.go:716.6,720.54 3 0 +trip-planner/internal/routing/graph.go:720.54,721.50 1 0 +trip-planner/internal/routing/graph.go:721.50,723.16 1 0 +trip-planner/internal/routing/graph.go:726.6,729.25 3 0 +trip-planner/internal/routing/graph.go:729.25,731.7 1 0 +trip-planner/internal/routing/graph.go:733.6,736.42 3 0 +trip-planner/internal/routing/graph.go:736.42,744.7 1 0 +trip-planner/internal/routing/graph.go:744.12,752.7 1 0 +trip-planner/internal/routing/graph.go:754.6,761.68 2 0 +trip-planner/internal/routing/graph.go:761.68,762.15 1 0 +trip-planner/internal/routing/graph.go:765.6,771.8 1 0 +trip-planner/internal/routing/graph.go:775.5,775.44 1 0 +trip-planner/internal/routing/graph.go:775.44,776.50 1 0 +trip-planner/internal/routing/graph.go:776.50,778.7 1 0 +trip-planner/internal/routing/graph.go:779.6,779.54 1 0 +trip-planner/internal/routing/graph.go:783.4,783.20 1 0 +trip-planner/internal/routing/graph.go:783.20,785.5 1 0 +trip-planner/internal/routing/graph.go:788.3,788.13 1 1 +trip-planner/internal/routing/graph.go:791.2,791.13 1 1 +trip-planner/internal/routing/graph.go:796.72,797.50 1 0 +trip-planner/internal/routing/graph.go:797.50,800.3 1 0 +trip-planner/internal/routing/graph.go:803.2,803.18 1 0 +trip-planner/internal/routing/graph.go:803.18,805.3 1 0 +trip-planner/internal/routing/graph.go:808.2,811.41 3 0 +trip-planner/internal/routing/graph.go:811.41,821.41 5 0 +trip-planner/internal/routing/graph.go:821.41,823.4 1 0 +trip-planner/internal/routing/graph.go:826.3,826.45 1 0 +trip-planner/internal/routing/graph.go:826.45,828.4 1 0 +trip-planner/internal/routing/graph.go:831.3,831.33 1 0 +trip-planner/internal/routing/graph.go:835.2,836.18 2 0 +trip-planner/internal/routing/graph.go:892.172,897.75 2 1 +trip-planner/internal/routing/graph.go:897.75,902.48 4 1 +trip-planner/internal/routing/graph.go:902.48,904.4 1 1 +trip-planner/internal/routing/graph.go:908.2,908.26 1 1 +trip-planner/internal/routing/graph.go:909.26,910.50 1 1 +trip-planner/internal/routing/graph.go:910.50,911.76 1 1 +trip-planner/internal/routing/graph.go:911.76,913.5 1 0 +trip-planner/internal/routing/graph.go:914.4,914.74 1 1 +trip-planner/internal/routing/graph.go:914.74,916.5 1 0 +trip-planner/internal/routing/graph.go:917.4,917.58 1 1 +trip-planner/internal/routing/graph.go:919.18,920.50 1 1 +trip-planner/internal/routing/graph.go:920.50,921.56 1 1 +trip-planner/internal/routing/graph.go:921.56,923.5 1 0 +trip-planner/internal/routing/graph.go:924.4,924.74 1 1 +trip-planner/internal/routing/graph.go:924.74,926.5 1 0 +trip-planner/internal/routing/graph.go:927.4,927.78 1 1 +trip-planner/internal/routing/graph.go:929.10,930.50 1 1 +trip-planner/internal/routing/graph.go:930.50,931.74 1 1 +trip-planner/internal/routing/graph.go:931.74,933.5 1 0 +trip-planner/internal/routing/graph.go:934.4,934.76 1 1 +trip-planner/internal/routing/graph.go:934.76,936.5 1 0 +trip-planner/internal/routing/graph.go:937.4,937.58 1 1 +trip-planner/internal/routing/graph.go:943.2,944.43 2 1 +trip-planner/internal/routing/graph.go:944.43,946.35 2 1 +trip-planner/internal/routing/graph.go:946.35,953.38 1 1 +trip-planner/internal/routing/graph.go:953.38,955.10 2 0 +trip-planner/internal/routing/graph.go:958.3,958.17 1 1 +trip-planner/internal/routing/graph.go:958.17,960.4 1 1 +trip-planner/internal/routing/graph.go:963.2,963.15 1 1 +trip-planner/internal/routing/graph.go:979.51,984.17 2 1 +trip-planner/internal/routing/graph.go:984.17,986.3 1 0 +trip-planner/internal/routing/graph.go:993.2,993.19 1 1 +trip-planner/internal/routing/graph.go:999.80,1003.30 2 0 +trip-planner/internal/routing/graph.go:1003.30,1014.24 2 0 +trip-planner/internal/routing/graph.go:1014.24,1016.4 1 0 +trip-planner/internal/routing/graph.go:1019.2,1019.13 1 0 +trip-planner/internal/routing/graph.go:1047.65,1051.67 2 1 +trip-planner/internal/routing/graph.go:1051.67,1053.3 1 1 +trip-planner/internal/routing/graph.go:1055.2,1059.37 3 1 +trip-planner/internal/routing/graph.go:1059.37,1062.32 1 1 +trip-planner/internal/routing/graph.go:1062.32,1063.62 1 1 +trip-planner/internal/routing/graph.go:1063.62,1066.30 1 1 +trip-planner/internal/routing/graph.go:1066.30,1070.11 4 1 +trip-planner/internal/routing/graph.go:1073.5,1073.59 1 1 +trip-planner/internal/routing/graph.go:1073.59,1074.74 1 0 +trip-planner/internal/routing/graph.go:1074.74,1078.7 3 0 +trip-planner/internal/routing/graph.go:1082.3,1082.20 1 1 +trip-planner/internal/routing/graph.go:1082.20,1083.9 1 1 +trip-planner/internal/routing/graph.go:1087.2,1087.22 1 1 +trip-planner/internal/routing/graph.go:1092.89,1095.19 2 1 +trip-planner/internal/routing/graph.go:1095.19,1099.3 3 1 +trip-planner/internal/routing/graph.go:1100.2,1100.15 1 1 +trip-planner/internal/routing/graph.go:1105.119,1106.39 1 1 +trip-planner/internal/routing/graph.go:1106.39,1108.3 1 1 +trip-planner/internal/routing/graph.go:1109.2,1109.18 1 1 +trip-planner/internal/routing/graph.go:1113.80,1116.17 2 0 +trip-planner/internal/routing/graph.go:1116.17,1118.3 1 0 +trip-planner/internal/routing/graph.go:1119.2,1124.30 3 0 +trip-planner/internal/routing/graph.go:1124.30,1125.79 1 0 +trip-planner/internal/routing/graph.go:1125.79,1133.4 1 0 +trip-planner/internal/routing/graph.go:1136.2,1136.25 1 0 +trip-planner/internal/routing/graph.go:1136.25,1138.3 1 0 +trip-planner/internal/routing/graph.go:1140.2,1140.18 1 0 +trip-planner/internal/routing/search_cache.go:21.116,27.2 1 1 +trip-planner/internal/routing/search_cache.go:31.136,36.38 2 0 +trip-planner/internal/routing/search_cache.go:36.38,39.3 1 0 +trip-planner/internal/routing/search_cache.go:42.2,44.16 3 0 +trip-planner/internal/routing/search_cache.go:44.16,46.3 1 0 +trip-planner/internal/routing/search_cache.go:49.2,50.54 2 0 +trip-planner/internal/routing/search_cache.go:50.54,52.3 1 0 +trip-planner/internal/routing/search_cache.go:54.2,54.21 1 0 +trip-planner/internal/routing/search_cache.go:58.130,68.16 3 0 +trip-planner/internal/routing/search_cache.go:68.16,70.3 1 0 +trip-planner/internal/routing/search_cache.go:73.2,73.37 1 0 +trip-planner/internal/routing/search_cache.go:77.68,78.17 1 1 +trip-planner/internal/routing/search_cache.go:78.17,80.3 1 1 +trip-planner/internal/routing/search_cache.go:81.2,82.16 2 1 +trip-planner/internal/routing/search_cache.go:82.16,84.3 1 0 +trip-planner/internal/routing/search_cache.go:85.2,85.18 1 1 +trip-planner/cmd/api/handlers.go:66.83,68.17 2 1 +trip-planner/cmd/api/handlers.go:68.17,71.3 2 0 +trip-planner/cmd/api/handlers.go:74.2,76.33 3 1 +trip-planner/cmd/api/handlers.go:99.79,101.20 2 1 +trip-planner/cmd/api/handlers.go:101.20,104.3 2 0 +trip-planner/cmd/api/handlers.go:105.2,114.35 4 1 +trip-planner/cmd/api/handlers.go:114.35,117.42 2 1 +trip-planner/cmd/api/handlers.go:117.42,118.62 1 0 +trip-planner/cmd/api/handlers.go:118.62,119.42 1 0 +trip-planner/cmd/api/handlers.go:119.42,121.11 2 0 +trip-planner/cmd/api/handlers.go:125.3,125.20 1 1 +trip-planner/cmd/api/handlers.go:125.20,127.4 1 1 +trip-planner/cmd/api/handlers.go:131.2,132.35 2 1 +trip-planner/cmd/api/handlers.go:132.35,136.20 2 1 +trip-planner/cmd/api/handlers.go:136.20,139.4 2 1 +trip-planner/cmd/api/handlers.go:140.3,140.20 1 1 +trip-planner/cmd/api/handlers.go:140.20,142.4 1 0 +trip-planner/cmd/api/handlers.go:145.3,146.35 2 1 +trip-planner/cmd/api/handlers.go:146.35,154.4 1 1 +trip-planner/cmd/api/handlers.go:157.2,162.33 3 1 +trip-planner/cmd/api/handlers.go:167.55,168.16 1 1 +trip-planner/cmd/api/handlers.go:169.11,170.52 1 1 +trip-planner/cmd/api/handlers.go:171.11,172.52 1 0 +trip-planner/cmd/api/handlers.go:173.10,174.38 1 0 +trip-planner/cmd/api/handlers.go:179.78,185.61 2 1 +trip-planner/cmd/api/handlers.go:185.61,188.3 2 0 +trip-planner/cmd/api/handlers.go:191.2,214.50 7 1 +trip-planner/cmd/api/handlers.go:214.50,217.3 2 0 +trip-planner/cmd/api/handlers.go:218.2,218.50 1 1 +trip-planner/cmd/api/handlers.go:218.50,220.3 1 0 +trip-planner/cmd/api/handlers.go:223.2,223.64 1 1 +trip-planner/cmd/api/handlers.go:223.64,225.35 2 1 +trip-planner/cmd/api/handlers.go:225.35,227.4 1 0 +trip-planner/cmd/api/handlers.go:231.2,239.32 5 1 +trip-planner/cmd/api/handlers.go:239.32,248.3 2 1 +trip-planner/cmd/api/handlers.go:250.2,255.33 3 1 +trip-planner/cmd/api/handlers.go:259.79,261.20 2 1 +trip-planner/cmd/api/handlers.go:261.20,264.3 2 0 +trip-planner/cmd/api/handlers.go:269.2,274.41 3 1 +trip-planner/cmd/api/handlers.go:274.41,275.22 1 1 +trip-planner/cmd/api/handlers.go:275.22,278.4 2 1 +trip-planner/cmd/api/handlers.go:283.2,285.41 2 1 +trip-planner/cmd/api/handlers.go:285.41,290.21 3 1 +trip-planner/cmd/api/handlers.go:290.21,292.4 1 1 +trip-planner/cmd/api/handlers.go:295.3,295.29 1 1 +trip-planner/cmd/api/handlers.go:296.35,297.27 1 0 +trip-planner/cmd/api/handlers.go:298.33,299.27 1 0 +trip-planner/cmd/api/handlers.go:300.35,301.27 1 1 +trip-planner/cmd/api/handlers.go:306.3,310.22 4 1 +trip-planner/cmd/api/handlers.go:310.22,311.12 1 0 +trip-planner/cmd/api/handlers.go:313.3,341.53 4 1 +trip-planner/cmd/api/handlers.go:341.53,366.4 3 1 +trip-planner/cmd/api/handlers.go:369.2,375.56 3 1 +trip-planner/cmd/api/handlers.go:375.56,378.3 2 0 +trip-planner/cmd/api/handlers.go:382.80,386.20 2 1 +trip-planner/cmd/api/handlers.go:386.20,389.3 2 0 +trip-planner/cmd/api/handlers.go:390.2,397.20 4 1 +trip-planner/cmd/api/handlers.go:397.20,398.42 1 0 +trip-planner/cmd/api/handlers.go:398.42,399.60 1 0 +trip-planner/cmd/api/handlers.go:399.60,400.42 1 0 +trip-planner/cmd/api/handlers.go:400.42,402.11 2 0 +trip-planner/cmd/api/handlers.go:408.2,409.19 2 1 +trip-planner/cmd/api/handlers.go:409.19,411.3 1 1 +trip-planner/cmd/api/handlers.go:413.2,414.20 2 1 +trip-planner/cmd/api/handlers.go:414.20,416.3 1 0 +trip-planner/cmd/api/handlers.go:418.2,426.33 3 1 +trip-planner/cmd/api/handlers.go:431.81,434.26 2 1 +trip-planner/cmd/api/handlers.go:434.26,438.3 2 0 +trip-planner/cmd/api/handlers.go:439.2,440.65 2 1 +trip-planner/cmd/api/handlers.go:440.65,443.3 2 1 +trip-planner/cmd/api/handlers.go:444.2,444.13 1 1 +trip-planner/cmd/api/handlers.go:449.85,451.26 1 1 +trip-planner/cmd/api/handlers.go:451.26,453.3 1 1 +trip-planner/cmd/api/handlers.go:456.2,458.20 2 1 +trip-planner/cmd/api/handlers.go:458.20,461.3 2 0 +trip-planner/cmd/api/handlers.go:462.2,469.61 3 1 +trip-planner/cmd/api/handlers.go:469.61,472.3 2 1 +trip-planner/cmd/api/handlers.go:475.2,479.32 2 1 +trip-planner/cmd/api/handlers.go:479.32,482.3 2 1 +trip-planner/cmd/api/handlers.go:485.2,485.28 1 1 +trip-planner/cmd/api/handlers.go:485.28,488.3 2 1 +trip-planner/cmd/api/handlers.go:492.2,502.33 4 1 +trip-planner/cmd/api/handlers.go:507.58,514.2 3 1 +trip-planner/cmd/api/handlers.go:524.81,526.18 2 1 +trip-planner/cmd/api/handlers.go:526.18,528.3 1 0 +trip-planner/cmd/api/handlers.go:530.2,531.16 2 1 +trip-planner/cmd/api/handlers.go:531.16,534.3 2 0 +trip-planner/cmd/api/handlers.go:536.2,540.4 2 1 +trip-planner/cmd/api/handlers.go:544.79,546.18 2 1 +trip-planner/cmd/api/handlers.go:546.18,548.3 1 0 +trip-planner/cmd/api/handlers.go:550.2,554.61 2 1 +trip-planner/cmd/api/handlers.go:554.61,557.3 2 0 +trip-planner/cmd/api/handlers.go:559.2,559.97 1 1 +trip-planner/cmd/api/handlers.go:559.97,562.3 2 0 +trip-planner/cmd/api/handlers.go:564.2,567.4 2 1 +trip-planner/cmd/api/handlers.go:571.82,573.18 2 1 +trip-planner/cmd/api/handlers.go:573.18,575.3 1 0 +trip-planner/cmd/api/handlers.go:577.2,579.20 2 1 +trip-planner/cmd/api/handlers.go:579.20,582.3 2 0 +trip-planner/cmd/api/handlers.go:583.2,585.86 2 1 +trip-planner/cmd/api/handlers.go:585.86,588.3 2 0 +trip-planner/cmd/api/handlers.go:590.2,593.4 2 1 +trip-planner/cmd/api/handlers.go:597.83,599.18 2 1 +trip-planner/cmd/api/handlers.go:599.18,601.3 1 0 +trip-planner/cmd/api/handlers.go:603.2,604.16 2 1 +trip-planner/cmd/api/handlers.go:604.16,607.3 2 0 +trip-planner/cmd/api/handlers.go:609.2,613.4 2 1 +trip-planner/cmd/api/handlers.go:617.83,619.18 2 1 +trip-planner/cmd/api/handlers.go:619.18,621.3 1 0 +trip-planner/cmd/api/handlers.go:623.2,628.61 2 1 +trip-planner/cmd/api/handlers.go:628.61,631.3 2 0 +trip-planner/cmd/api/handlers.go:634.2,634.76 1 1 +trip-planner/cmd/api/handlers.go:634.76,637.3 2 0 +trip-planner/cmd/api/handlers.go:639.2,639.113 1 1 +trip-planner/cmd/api/handlers.go:639.113,642.3 2 0 +trip-planner/cmd/api/handlers.go:644.2,647.4 2 1 +trip-planner/cmd/api/handlers.go:651.81,654.2 2 0 +trip-planner/cmd/api/handlers.go:657.133,669.2 2 1 +trip-planner/cmd/api/main.go:17.13,23.18 5 0 +trip-planner/cmd/api/main.go:23.18,25.3 1 0 +trip-planner/cmd/api/main.go:26.2,43.46 12 0 +trip-planner/cmd/api/main.go:47.32,54.2 2 0 +trip-planner/cmd/api/main.go:58.73,63.2 2 0 +trip-planner/cmd/api/main.go:67.122,68.54 1 0 +trip-planner/cmd/api/main.go:68.54,70.3 1 0 +trip-planner/internal/yandex/client.go:67.58,83.30 2 1 +trip-planner/internal/yandex/client.go:83.30,85.3 1 1 +trip-planner/internal/yandex/client.go:87.2,87.10 1 1 +trip-planner/internal/yandex/client.go:94.55,95.25 1 1 +trip-planner/internal/yandex/client.go:95.25,97.3 1 1 +trip-planner/internal/yandex/client.go:101.62,102.25 1 1 +trip-planner/internal/yandex/client.go:102.25,104.3 1 1 +trip-planner/internal/yandex/client.go:108.97,109.25 1 1 +trip-planner/internal/yandex/client.go:109.25,116.3 1 1 +trip-planner/internal/yandex/client.go:120.45,121.25 1 0 +trip-planner/internal/yandex/client.go:121.25,123.3 1 0 +trip-planner/internal/yandex/client.go:127.107,129.48 1 0 +trip-planner/internal/yandex/client.go:129.48,131.3 1 0 +trip-planner/internal/yandex/client.go:134.2,140.67 4 0 +trip-planner/internal/yandex/client.go:140.67,142.32 1 0 +trip-planner/internal/yandex/client.go:142.32,145.4 2 0 +trip-planner/internal/yandex/client.go:147.3,148.17 2 0 +trip-planner/internal/yandex/client.go:148.17,151.4 2 0 +trip-planner/internal/yandex/client.go:154.3,154.29 1 0 +trip-planner/internal/yandex/client.go:154.29,157.4 2 0 +trip-planner/internal/yandex/client.go:159.3,161.41 2 0 +trip-planner/internal/yandex/client.go:161.41,163.28 2 0 +trip-planner/internal/yandex/client.go:163.28,165.5 1 0 +trip-planner/internal/yandex/client.go:166.4,166.23 1 0 +trip-planner/internal/yandex/client.go:170.2,172.17 3 0 +trip-planner/internal/yandex/client.go:176.85,178.16 2 0 +trip-planner/internal/yandex/client.go:178.16,180.3 1 0 +trip-planner/internal/yandex/client.go:182.2,185.20 2 0 +trip-planner/internal/yandex/client.go:185.20,187.3 1 0 +trip-planner/internal/yandex/client.go:189.2,190.16 2 0 +trip-planner/internal/yandex/client.go:190.16,192.3 1 0 +trip-planner/internal/yandex/client.go:194.2,194.28 1 0 +trip-planner/internal/yandex/client.go:194.28,198.3 3 0 +trip-planner/internal/yandex/client.go:200.2,201.65 2 0 +trip-planner/internal/yandex/client.go:201.65,203.3 1 0 +trip-planner/internal/yandex/client.go:205.2,205.19 1 0 +trip-planner/internal/yandex/client.go:262.35,264.2 1 1 +trip-planner/internal/yandex/client.go:266.54,268.2 1 1 +trip-planner/internal/yandex/client.go:271.39,272.16 1 1 +trip-planner/internal/yandex/client.go:272.16,274.3 1 1 +trip-planner/internal/yandex/client.go:276.2,277.8 2 1 +trip-planner/internal/yandex/client.go:277.8,279.3 1 0 +trip-planner/internal/yandex/client.go:281.2,285.56 2 1 +trip-planner/internal/yandex/client.go:289.60,292.26 3 1 +trip-planner/internal/yandex/client.go:292.26,294.3 1 1 +trip-planner/internal/yandex/client.go:295.2,296.10 2 1 +trip-planner/internal/yandex/client.go:301.60,308.2 1 1 +trip-planner/internal/yandex/client.go:310.40,317.19 5 1 +trip-planner/internal/yandex/client.go:317.19,320.3 2 1 +trip-planner/internal/yandex/client.go:322.2,322.117 1 1 +trip-planner/internal/yandex/client.go:325.46,327.28 2 1 +trip-planner/internal/yandex/client.go:327.28,329.42 2 1 +trip-planner/internal/yandex/client.go:329.42,331.4 1 0 +trip-planner/internal/yandex/client.go:331.9,333.4 1 1 +trip-planner/internal/yandex/client.go:334.3,334.22 1 1 +trip-planner/internal/yandex/client.go:341.42,347.2 1 1 +trip-planner/internal/yandex/client.go:349.49,356.2 6 1 +trip-planner/internal/yandex/client.go:358.40,362.18 3 1 +trip-planner/internal/yandex/client.go:363.14,364.14 1 1 +trip-planner/internal/yandex/client.go:365.12,367.45 1 1 +trip-planner/internal/yandex/client.go:367.45,371.4 3 1 +trip-planner/internal/yandex/client.go:372.3,372.15 1 1 +trip-planner/internal/yandex/client.go:373.16,374.14 1 0 +trip-planner/internal/yandex/client.go:376.2,376.14 1 0 +trip-planner/internal/yandex/client.go:379.43,383.18 3 1 +trip-planner/internal/yandex/client.go:384.14,384.14 0 0 +trip-planner/internal/yandex/client.go:386.16,388.24 2 1 +trip-planner/internal/yandex/client.go:388.24,391.4 2 1 +trip-planner/internal/yandex/client.go:392.12,392.12 0 0 +trip-planner/internal/yandex/client.go:397.43,401.18 3 1 +trip-planner/internal/yandex/client.go:402.14,404.38 2 1 +trip-planner/internal/yandex/client.go:404.38,407.4 2 1 +trip-planner/internal/yandex/client.go:408.16,410.28 2 0 +trip-planner/internal/yandex/client.go:411.12,411.12 0 1 +trip-planner/internal/yandex/client.go:418.55,421.2 2 0 +trip-planner/internal/yandex/client.go:423.28,426.2 1 0 diff --git a/internal/cache/preferences.go b/internal/cache/preferences.go index 9e21b5b..41de4ec 100644 --- a/internal/cache/preferences.go +++ b/internal/cache/preferences.go @@ -105,7 +105,7 @@ func (p *Preferences) AddSavedCity(ctx context.Context, userID, cityCode, cityNa Date: "", Request: "", } - if err := p.store.Set(ctx, cacheKey, data, CityTTL); err != nil { + if err := p.store.Set(ctx, cacheKey, data, PreferenceTTL); err != nil { return err } @@ -148,7 +148,7 @@ func (p *Preferences) RemoveSavedCity(ctx context.Context, userID, cityCode stri return err } - return p.store.Set(ctx, key, data, CityTTL) + return p.store.Set(ctx, key, data, PreferenceTTL) } // GetSearchHistory returns the user's search history. @@ -217,7 +217,7 @@ func (p *Preferences) AddSearchHistory(ctx context.Context, userID, fromCity, to return err } - if err := p.store.Set(ctx, key, data, CityTTL); err != nil { + if err := p.store.Set(ctx, key, data, PreferenceTTL); err != nil { return err } @@ -260,7 +260,7 @@ func (p *Preferences) RemoveOldSearchHistory(ctx context.Context, userID string, return err } - if err := p.store.Set(ctx, key, data, CityTTL); err != nil { + if err := p.store.Set(ctx, key, data, PreferenceTTL); err != nil { return err } diff --git a/internal/cache/store.go b/internal/cache/store.go index 8d7160f..640701e 100644 --- a/internal/cache/store.go +++ b/internal/cache/store.go @@ -147,6 +147,9 @@ const ( // SearchFarTermTTL is the time-to-live for search results with far-term dates (7 days). SearchFarTermTTL = 7 * 24 * time.Hour + + // PreferenceTTL is the time-to-live for user preferences (7 days). + PreferenceTTL = 7 * 24 * time.Hour ) // GetCityKey returns the cache key for a city code. diff --git a/internal/routing/graph.go b/internal/routing/graph.go index c55bb8e..5ec7e25 100644 --- a/internal/routing/graph.go +++ b/internal/routing/graph.go @@ -808,6 +808,8 @@ func (g *Graph) ApplyMCT(itinerary *Itinerary, mctBase int) *Itinerary { adjustedLegs := make([]RouteLeg, len(itinerary.Legs)) copy(adjustedLegs, itinerary.Legs) + totalMCT := 0 + for i := 1; i < len(adjustedLegs); i++ { prevLeg := &adjustedLegs[i-1] currLeg := &adjustedLegs[i] @@ -828,9 +830,36 @@ func (g *Graph) ApplyMCT(itinerary *Itinerary, mctBase int) *Itinerary { } // Add the MCT to the total duration (as waiting time at transfer) - itinerary.TotalDuration += mct + totalMCT += mct } + // Update leg durations to include MCT for transfer legs + for i := 1; i < len(adjustedLegs); i++ { + prevLeg := &adjustedLegs[i-1] + currLeg := &adjustedLegs[i] + + // Determine MCT based on node types and transfer kinds + mct := mctBase + + // Reduce MCT for city hub transfers (the transfer point node is a city) + // The transfer point is the destination of the previous leg / start of current leg + transferPoint := prevLeg.To // = currLeg.From + if transferPoint.Type == NodeTypeCity { + mct = mctBase / 2 // 30 min -> 15 min for city hub transfers + } + + // Increase MCT for mode changes (different transport types) + if prevLeg.Transport != currLeg.Transport { + mct = mctBase + 600 // 30 min + 10 min for mode change + } + + // Add MCT to the current leg's duration (transfer wait time) + adjustedLegs[i].Duration += mct + } + + // Update total duration + itinerary.TotalDuration += totalMCT + // Recalculate leg structure with proper transfer timing itinerary.Legs = adjustedLegs return itinerary @@ -894,14 +923,25 @@ func (g *Graph) FindRoutesPareto(originID, destID string, opts SearchOptions, cl var allItineraries []*Itinerary // Search with different max transfer limits to find diverse routes - for maxTransfers := 0; maxTransfers <= opts.MaxTransfers; maxTransfers++ { + if opts.MaxTransfers < 0 { + // No limit on transfers - use a reasonable default optsCopy := opts - optsCopy.MaxTransfers = maxTransfers + optsCopy.MaxTransfers = 5 result := g.FindRoute(originID, destID, optsCopy, closedStations, neighbors) if result != nil && result.TotalDuration > 0 { allItineraries = append(allItineraries, result) } + } else { + for maxTransfers := 0; maxTransfers <= opts.MaxTransfers; maxTransfers++ { + optsCopy := opts + optsCopy.MaxTransfers = maxTransfers + + result := g.FindRoute(originID, destID, optsCopy, closedStations, neighbors) + if result != nil && result.TotalDuration > 0 { + allItineraries = append(allItineraries, result) + } + } } // Sort according to the specified RankingMode @@ -1089,9 +1129,9 @@ func (g *Graph) checkRouteForChanges(itinerary *Itinerary) bool { // rescheduleRoute performs a re-search for the route with updated graph data. // This is called when significant changes are detected in the route legs. -func (g *Graph) rescheduleRoute(originID, destID string, opts SearchOptions) *Itinerary { +func (g *Graph) rescheduleRoute(originID, destID string, opts SearchOptions, closedStations map[string]bool, neighbors map[string][]storage.StationNeighbor) *Itinerary { // Re-run the search with the same options to get an updated route - result := g.FindRoute(originID, destID, opts, nil, nil) + result := g.FindRoute(originID, destID, opts, closedStations, neighbors) if result != nil { result.LastChecked = time.Now().Unix() result.NeedsReSearch = false @@ -1102,9 +1142,9 @@ func (g *Graph) rescheduleRoute(originID, destID string, opts SearchOptions) *It // CheckAndRescheduleRoute checks a route for changes and returns an updated route if needed. // This is the main entry point for flight change notification logic. -func (g *Graph) CheckAndRescheduleRoute(itinerary *Itinerary, originID, destID string, opts SearchOptions) *Itinerary { +func (g *Graph) CheckAndRescheduleRoute(itinerary *Itinerary, originID, destID string, opts SearchOptions, closedStations map[string]bool, neighbors map[string][]storage.StationNeighbor) *Itinerary { if g.checkRouteForChanges(itinerary) { - return g.rescheduleRoute(originID, destID, opts) + return g.rescheduleRoute(originID, destID, opts, closedStations, neighbors) } return itinerary } diff --git a/internal/routing/graph_test.go b/internal/routing/graph_test.go index 7e2b06e..8bb0f79 100644 --- a/internal/routing/graph_test.go +++ b/internal/routing/graph_test.go @@ -388,7 +388,7 @@ func TestRouteReSearchOnChange(t *testing.T) { // Since LastChecked is 2 hours ago (> 3600s ago), the recent-check skip won't apply // and checkRouteForChanges will run full evaluation - checked := graph.CheckAndRescheduleRoute(itinerary, "s1", "s3", SearchOptions{MaxTransfers: 5}) + checked := graph.CheckAndRescheduleRoute(itinerary, "s1", "s3", SearchOptions{MaxTransfers: 5}, nil, nil) t.Logf("Initial - NeedsReSearch: %v, ReSearchReason: %s", itinerary.NeedsReSearch, itinerary.ReSearchReason) t.Logf("Initial - checked route ID: %s, NeedsReSearch: %v", checked.ID, checked.NeedsReSearch) @@ -414,7 +414,7 @@ func TestRouteReSearchOnChange(t *testing.T) { } // Re-check for changes after simulating cancellation - checked2 := graph.CheckAndRescheduleRoute(itinerary, "s1", "s3", SearchOptions{MaxTransfers: 5}) + checked2 := graph.CheckAndRescheduleRoute(itinerary, "s1", "s3", SearchOptions{MaxTransfers: 5}, nil, nil) t.Logf("After cancellation - NeedsReSearch: %v, ReSearchReason: %s", checked2.NeedsReSearch, checked2.ReSearchReason) t.Logf("After cancellation - route ID: %s", checked2.ID) @@ -451,7 +451,7 @@ func TestRouteReSearchOnChange(t *testing.T) { } // Re-check for major delay - checked3 := graph.CheckAndRescheduleRoute(itinerary2, "s1", "s3", SearchOptions{MaxTransfers: 5}) + checked3 := graph.CheckAndRescheduleRoute(itinerary2, "s1", "s3", SearchOptions{MaxTransfers: 5}, nil, nil) t.Logf("After major delay - NeedsReSearch: %v, ReSearchReason: %s", checked3.NeedsReSearch, checked3.ReSearchReason) t.Logf("After major delay - route ID: %s", checked3.ID) diff --git a/internal/yandex/client.go b/internal/yandex/client.go index be84dd7..d84eb11 100644 --- a/internal/yandex/client.go +++ b/internal/yandex/client.go @@ -15,6 +15,9 @@ import ( "trip-planner/internal/metrics" ) +// rng is a seeded random number generator for jitter calculations. +var rng = rand.New(rand.NewSource(time.Now().UnixNano())) + // Client represents a Yandex Schedules API client with rate limiting, // circuit breaking, and retry capabilities. type Client struct { @@ -421,6 +424,5 @@ func applyJitter(backoff time.Duration) time.Duration { } func randFloat64() float64 { - // Use math/rand with a seed based on function call index for variability - return rand.Float64() + return rng.Float64() }