summaryrefslogtreecommitdiffstats
path: root/server/src/api.cpp
diff options
context:
space:
mode:
authorRutger Broekhoff2026-08-28 22:17:10 +0200
committerRutger Broekhoff2026-08-28 22:17:10 +0200
commit70643a9e4821bd11c3f363f1708fe420965467d1 (patch)
tree65572b58e247248846628940a2aaca197a15d784 /server/src/api.cpp
parent173cd34bdd0717d3f4beeac76b3296ecd46ada0d (diff)
downloadroutemon-70643a9e4821bd11c3f363f1708fe420965467d1.tar.gz
routemon-70643a9e4821bd11c3f363f1708fe420965467d1.zip
Format again
Diffstat (limited to 'server/src/api.cpp')
-rw-r--r--server/src/api.cpp155
1 files changed, 74 insertions, 81 deletions
diff --git a/server/src/api.cpp b/server/src/api.cpp
index a6eef23..73dee32 100644
--- a/server/src/api.cpp
+++ b/server/src/api.cpp
@@ -39,7 +39,7 @@ auto json_value_from_linestring(geo::linestring const& ls) -> json::value
39} 39}
40 40
41auto json_value_from_linestrings(std::vector<geo::linestring> const& lss) 41auto json_value_from_linestrings(std::vector<geo::linestring> const& lss)
42 -> json::value 42 -> json::value
43{ 43{
44 json::array a; 44 json::array a;
45 for (auto const& ls : lss) 45 for (auto const& ls : lss)
@@ -48,59 +48,56 @@ auto json_value_from_linestrings(std::vector<geo::linestring> const& lss)
48} 48}
49 49
50auto tag_invoke( 50auto tag_invoke(
51 json::value_from_tag, json::value& jv, relevant_road_closure const& clo) 51 json::value_from_tag, json::value& jv, relevant_road_closure const& clo)
52 -> void 52 -> void
53{ 53{
54 jv = json::object{ 54 jv = json::object{
55 {"relevant_lss", json_value_from_linestrings(clo.relevant_lss)}, 55 {"relevant_lss", json_value_from_linestrings(clo.relevant_lss)},
56 }; 56 };
57} 57}
58 58
59auto tag_invoke( 59auto tag_invoke(
60 json::value_from_tag, json::value& jv, relevant_situation const& sit) 60 json::value_from_tag, json::value& jv, relevant_situation const& sit) -> void
61 -> void
62{ 61{
63 jv = json::object{ 62 jv = json::object{
64 {"id", json::value_from(sit.id)}, 63 {"id", json::value_from(sit.id)},
65 {"location", 64 {"location", sit.location ? json_value_from_point(*sit.location) : nullptr},
66 sit.location ? json_value_from_point(*sit.location) : nullptr}, 65 {"comments", json::value_from(sit.comments)},
67 {"comments", json::value_from(sit.comments)}, 66 {"relevant_road_closures", json::value_from(sit.relevant_road_closures)},
68 {"relevant_road_closures", json::value_from(sit.relevant_road_closures)},
69 }; 67 };
70} 68}
71 69
72auto tag_invoke(json::value_from_tag, json::value& jv, track_segment const& seg) 70auto tag_invoke(json::value_from_tag, json::value& jv, track_segment const& seg)
73 -> void 71 -> void
74{ 72{
75 jv = json::object{ 73 jv = json::object{
76 {"points", json_value_from_linestring(seg.points)}, 74 {"points", json_value_from_linestring(seg.points)},
77 }; 75 };
78} 76}
79 77
80auto tag_invoke(json::value_from_tag, json::value& jv, track const& track) 78auto tag_invoke(json::value_from_tag, json::value& jv, track const& track)
81 -> void 79 -> void
82{ 80{
83 jv = json::object{ 81 jv = json::object{
84 {"segments", json::value_from(track.segments)}, 82 {"segments", json::value_from(track.segments)},
85 }; 83 };
86} 84}
87 85
88auto tag_invoke( 86auto tag_invoke(
89 json::value_from_tag, json::value& jv, process_gpx_result const& res) 87 json::value_from_tag, json::value& jv, process_gpx_result const& res) -> void
90 -> void
91{ 88{
92 jv = json::object{ 89 jv = json::object{
93 {"tracks", json::value_from(res.tracks)}, 90 {"tracks", json::value_from(res.tracks)},
94 {"relevant_situations", json::value_from(res.relevant_situations)}, 91 {"relevant_situations", json::value_from(res.relevant_situations)},
95 }; 92 };
96} 93}
97 94
98auto tag_invoke(json::value_from_tag, json::value& jv, sysinfo const& info) 95auto tag_invoke(json::value_from_tag, json::value& jv, sysinfo const& info)
99 -> void 96 -> void
100{ 97{
101 jv = json::object{ 98 jv = json::object{
102 {"using_publication_of", 99 {"using_publication_of",
103 std::format("{:%FT%TZ}", info.using_publication_of)}, 100 std::format("{:%FT%TZ}", info.using_publication_of)},
104 }; 101 };
105} 102}
106 103
@@ -127,18 +124,18 @@ handler::handler(log::logger const& l, datex2::situation_publication pub)
127 } 124 }
128 auto const after_build = chrono::steady_clock::now(); 125 auto const after_build = chrono::steady_clock::now();
129 auto const dur_build = 126 auto const dur_build =
130 chrono::duration_cast<chrono::milliseconds>(after_build - before_build); 127 chrono::duration_cast<chrono::milliseconds>(after_build - before_build);
131 l_.info("Indices built in {}", dur_build); 128 l_.info("Indices built in {}", dur_build);
132 l_.info("LSE index size: {}", lse_index_.size()); 129 l_.info("LSE index size: {}", lse_index_.size());
133 l_.info("Point index size: {}", p_index_.size()); 130 l_.info("Point index size: {}", p_index_.size());
134} 131}
135 132
136auto handler::process_gpx(gpx::file&& gpx_file) 133auto handler::process_gpx(gpx::file&& gpx_file)
137 -> std::optional<process_gpx_result> 134 -> std::optional<process_gpx_result>
138{ 135{
139 auto const now = chrono::utc_clock::now(); 136 auto const now = chrono::utc_clock::now();
140 auto const relevant = std::initializer_list<time::period>{ 137 auto const relevant = std::initializer_list<time::period>{
141 time::period{now - chrono::days(7), now + chrono::days(7)} 138 time::period{now - chrono::days(7), now + chrono::days(7)}
142 }; 139 };
143 auto const check_periods = time::period_seq{relevant.begin(), relevant.end()}; 140 auto const check_periods = time::period_seq{relevant.begin(), relevant.end()};
144 141
@@ -146,14 +143,14 @@ auto handler::process_gpx(gpx::file&& gpx_file)
146 for (auto const& track : gpx_file.tracks) 143 for (auto const& track : gpx_file.tracks)
147 for (auto const& seg : track.segments) 144 for (auto const& seg : track.segments)
148 geo::split_linestring_with_overlap_segments( 145 geo::split_linestring_with_overlap_segments(
149 seg.waypoints, 146 seg.waypoints,
150 5000 /* meters max total dist until a new split is forced */, 147 5000 /* meters max total dist until a new split is forced */,
151 splits_with_overlap_segments); 148 splits_with_overlap_segments);
152 auto const before_query = chrono::steady_clock::now(); 149 auto const before_query = chrono::steady_clock::now();
153 150
154 l_.debug("Querying for relevant situations"); 151 l_.debug("Querying for relevant situations");
155 auto relevant_road_closures = 152 auto relevant_road_closures =
156 std::unordered_set<std::shared_ptr<datex2::road_closure>>{}; 153 std::unordered_set<std::shared_ptr<datex2::road_closure>>{};
157 auto ls_checked = 0uz; 154 auto ls_checked = 0uz;
158 auto p_checked = 0uz; 155 auto p_checked = 0uz;
159 auto i = 0; 156 auto i = 0;
@@ -200,70 +197,66 @@ auto handler::process_gpx(gpx::file&& gpx_file)
200 197
201 auto const after_query = chrono::steady_clock::now(); 198 auto const after_query = chrono::steady_clock::now();
202 l_.debug( 199 l_.debug(
203 "Done (checked {} line string(s) and {} point(s)) in {}", ls_checked, 200 "Done (checked {} line string(s) and {} point(s)) in {}", ls_checked,
204 p_checked, 201 p_checked,
205 chrono::duration_cast<chrono::milliseconds>(after_query - before_query)); 202 chrono::duration_cast<chrono::milliseconds>(after_query - before_query));
206 203
207 auto relevant_situations = 204 auto relevant_situations =
208 std::unordered_set<std::shared_ptr<datex2::situation>>{}; 205 std::unordered_set<std::shared_ptr<datex2::situation>>{};
209 for (auto const& rc : relevant_road_closures) 206 for (auto const& rc : relevant_road_closures)
210 relevant_situations.emplace(rc->parent); 207 relevant_situations.emplace(rc->parent);
211 208
212 l_.debug( 209 l_.debug(
213 "Identified {} relevant road closure(s), part of {} unique " 210 "Identified {} relevant road closure(s), part of {} unique "
214 "situation(s)", 211 "situation(s)",
215 relevant_road_closures.size(), relevant_situations.size()); 212 relevant_road_closures.size(), relevant_situations.size());
216 for (auto const& sit : relevant_situations) 213 for (auto const& sit : relevant_situations)
217 l_.debug("Relevant situation: {}", sit->id); 214 l_.debug("Relevant situation: {}", sit->id);
218 215
219 return process_gpx_result{ 216 return process_gpx_result{
220 .tracks = gpx_file.tracks 217 .tracks = gpx_file.tracks
221 | views::transform( 218 | views::transform(
222 [](auto const& trk) -> track 219 [](auto const& trk) -> track
223 { 220 {
224 return { 221 return {
225 .segments = 222 .segments = trk.segments
226 trk.segments 223 | views::transform(
227 | views::transform(
228 [](auto const& seg) -> track_segment 224 [](auto const& seg) -> track_segment
229 { return {.points = seg.waypoints}; }) 225 { return {.points = seg.waypoints}; })
230 | std::ranges::to<std::vector<track_segment>>(), 226 | std::ranges::to<std::vector<track_segment>>(),
231 }; 227 };
232 }) 228 })
233 | std::ranges::to<std::vector<track>>(), 229 | std::ranges::to<std::vector<track>>(),
234 .relevant_situations = 230 .relevant_situations =
235 relevant_situations 231 relevant_situations
236 | views::transform( 232 | views::transform(
237 [&](std::shared_ptr<datex2::situation> sit) -> relevant_situation 233 [&](std::shared_ptr<datex2::situation> sit) -> relevant_situation
238 { 234 {
239 return { 235 return {
240 .id = sit->id, 236 .id = sit->id,
241 .location = sit->location, 237 .location = sit->location,
242 .comments = sit->comments, 238 .comments = sit->comments,
243 .relevant_road_closures = 239 .relevant_road_closures =
244 relevant_road_closures 240 relevant_road_closures
245 | views::filter( 241 | views::filter(
246 [&](std::shared_ptr<datex2::road_closure> const& rc) 242 [&](std::shared_ptr<datex2::road_closure> const& rc) -> bool
247 -> bool 243 { return std::shared_ptr{rc->parent} == sit; })
248 { return std::shared_ptr{rc->parent} == sit; }) 244 | views::transform(
249 | views::transform( 245 [](std::shared_ptr<datex2::road_closure> const& rc)
250 [](std::shared_ptr<datex2::road_closure> const& rc) 246 -> relevant_road_closure
251 -> relevant_road_closure 247 {
252 { 248 return {
253 return { 249 .relevant_lss =
254 .relevant_lss = 250 rc->relevant_line_strings
255 rc->relevant_line_strings 251 | views::transform(
256 | views::transform( 252 [](auto const& lsp) -> geo::linestring { return *lsp; })
257 [](auto const& lsp) -> geo::linestring 253 | std::ranges::to<std::vector<geo::linestring>>(),
258 { return *lsp; }) 254 };
259 | std::ranges::to< 255 })
260 std::vector<geo::linestring>>(), 256 | std::ranges::to<std::vector<relevant_road_closure>>(),
261 }; 257 };
262 }) 258 })
263 | std::ranges::to<std::vector<relevant_road_closure>>(), 259 | std::ranges::to<std::vector<relevant_situation>>(),
264 };
265 })
266 | std::ranges::to<std::vector<relevant_situation>>(),
267 }; 260 };
268} 261}
269 262