ソースを参照

Added Graph of API NavigationLinks, fixed OpenAPI IDs

Lukas Cerny 1 年間 前
コミット
14d85d752c

+ 697 - 0
doc/openAPI_NavigationLinks.svg

@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+<!-- Title: regexp Pages: 1 -->
+<svg width="2814pt" height="980pt"
+ viewBox="0.00 0.00 2813.77 980.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 976)">
+<title>regexp</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-976 2809.77,-976 2809.77,4 -4,4"/>
+<!-- infoGET -->
+<g id="node1" class="node">
+<title>infoGET</title>
+<ellipse fill="none" stroke="black" cx="2086.74" cy="-954" rx="27.9" ry="18"/>
+<text text-anchor="middle" x="2086.74" y="-950.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/info</text>
+</g>
+<!-- campaignsGET -->
+<g id="node2" class="node">
+<title>campaignsGET</title>
+<ellipse fill="none" stroke="black" cx="540.74" cy="-594" rx="55.79" ry="18"/>
+<text text-anchor="middle" x="540.74" y="-590.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns</text>
+</g>
+<!-- campaignIdGET -->
+<g id="node3" class="node">
+<title>campaignIdGET</title>
+<ellipse fill="none" stroke="black" cx="540.74" cy="-522" rx="110.48" ry="18"/>
+<text text-anchor="middle" x="540.74" y="-518.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}</text>
+</g>
+<!-- campaignsGET&#45;&gt;campaignIdGET -->
+<g id="edge1" class="edge">
+<title>campaignsGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M540.74,-575.7C540.74,-567.98 540.74,-558.71 540.74,-550.11"/>
+<polygon fill="black" stroke="black" points="544.24,-550.1 540.74,-540.1 537.24,-550.1 544.24,-550.1"/>
+</g>
+<!-- campaignIdGET&#45;&gt;campaignIdGET -->
+<g id="edge2" class="edge">
+<title>campaignIdGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M614.68,-535.42C644.34,-536.18 669.23,-531.7 669.23,-522 669.23,-513.43 649.83,-508.94 624.88,-508.53"/>
+<polygon fill="black" stroke="black" points="624.66,-505.03 614.68,-508.58 624.7,-512.03 624.66,-505.03"/>
+</g>
+<!-- campaignIdUnitsGET -->
+<g id="node4" class="node">
+<title>campaignIdUnitsGET</title>
+<ellipse fill="none" stroke="black" cx="1354.74" cy="-450" rx="131.88" ry="18"/>
+<text text-anchor="middle" x="1354.74" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units</text>
+</g>
+<!-- campaignIdGET&#45;&gt;campaignIdUnitsGET -->
+<g id="edge5" class="edge">
+<title>campaignIdGET&#45;&gt;campaignIdUnitsGET</title>
+<path fill="none" stroke="black" d="M641.19,-514.39C772.83,-505.43 1010.81,-488.21 1213.74,-468 1225.93,-466.79 1238.71,-465.4 1251.38,-463.96"/>
+<polygon fill="black" stroke="black" points="1251.97,-467.41 1261.51,-462.79 1251.17,-460.46 1251.97,-467.41"/>
+</g>
+<!-- campaignIdUnitsObservationsGET -->
+<g id="node5" class="node">
+<title>campaignIdUnitsObservationsGET</title>
+<ellipse fill="none" stroke="black" cx="540.74" cy="-450" rx="184.67" ry="18"/>
+<text text-anchor="middle" x="540.74" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/observations</text>
+</g>
+<!-- campaignIdGET&#45;&gt;campaignIdUnitsObservationsGET -->
+<g id="edge3" class="edge">
+<title>campaignIdGET&#45;&gt;campaignIdUnitsObservationsGET</title>
+<path fill="none" stroke="black" d="M534.82,-503.7C534.03,-495.98 533.8,-486.71 534.14,-478.11"/>
+<polygon fill="black" stroke="black" points="537.64,-478.32 534.84,-468.1 530.65,-477.84 537.64,-478.32"/>
+</g>
+<!-- campaignIdUnitsObservationsLocationsGET -->
+<g id="node6" class="node">
+<title>campaignIdUnitsObservationsLocationsGET</title>
+<ellipse fill="none" stroke="black" cx="982.74" cy="-450" rx="221.76" ry="18"/>
+<text text-anchor="middle" x="982.74" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/observations/locations</text>
+</g>
+<!-- campaignIdGET&#45;&gt;campaignIdUnitsObservationsLocationsGET -->
+<g id="edge4" class="edge">
+<title>campaignIdGET&#45;&gt;campaignIdUnitsObservationsLocationsGET</title>
+<path fill="none" stroke="black" d="M614.44,-508.49C684.64,-497.1 791.16,-480.2 871.64,-467.67"/>
+<polygon fill="black" stroke="black" points="872.48,-471.08 881.82,-466.09 871.4,-464.16 872.48,-471.08"/>
+</g>
+<!-- campaignIdUnitIdGET -->
+<g id="node7" class="node">
+<title>campaignIdUnitIdGET</title>
+<ellipse fill="none" stroke="black" cx="995.74" cy="-378" rx="161.67" ry="18"/>
+<text text-anchor="middle" x="995.74" y="-374.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}</text>
+</g>
+<!-- campaignIdUnitsGET&#45;&gt;campaignIdUnitIdGET -->
+<g id="edge7" class="edge">
+<title>campaignIdUnitsGET&#45;&gt;campaignIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1282.52,-434.92C1224.72,-423.65 1143.48,-407.81 1082.22,-395.86"/>
+<polygon fill="black" stroke="black" points="1082.66,-392.38 1072.18,-393.91 1081.32,-399.25 1082.66,-392.38"/>
+</g>
+<!-- unitIdGET -->
+<g id="node14" class="node">
+<title>unitIdGET</title>
+<ellipse fill="none" stroke="black" cx="1549.74" cy="-306" rx="61.99" ry="18"/>
+<text text-anchor="middle" x="1549.74" y="-302.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/units/{unitId}</text>
+</g>
+<!-- campaignIdUnitsGET&#45;&gt;unitIdGET -->
+<g id="edge6" class="edge">
+<title>campaignIdUnitsGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1370.17,-431.78C1387.87,-412.68 1418.39,-381.7 1448.74,-360 1467.07,-346.9 1489.05,-334.97 1507.83,-325.77"/>
+<polygon fill="black" stroke="black" points="1509.54,-328.83 1517.03,-321.34 1506.5,-322.52 1509.54,-328.83"/>
+</g>
+<!-- campaignIdUnitsObservationsGET&#45;&gt;campaignIdGET -->
+<g id="edge20" class="edge">
+<title>campaignIdUnitsObservationsGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M546.63,-468.1C547.44,-475.79 547.67,-485.05 547.34,-493.67"/>
+<polygon fill="black" stroke="black" points="543.85,-493.48 546.65,-503.7 550.83,-493.96 543.85,-493.48"/>
+</g>
+<!-- campaignIdUnitsObservationsGET&#45;&gt;campaignIdUnitsObservationsGET -->
+<g id="edge21" class="edge">
+<title>campaignIdUnitsObservationsGET&#45;&gt;campaignIdUnitsObservationsGET</title>
+<path fill="none" stroke="black" d="M663.12,-463.49C707.28,-463.79 743.32,-459.3 743.32,-450 743.32,-441.43 712.69,-436.94 673.31,-436.53"/>
+<polygon fill="black" stroke="black" points="673.13,-433.03 663.12,-436.51 673.12,-440.03 673.13,-433.03"/>
+</g>
+<!-- campaignIdUnitsObservationsLocationsGET&#45;&gt;campaignIdGET -->
+<g id="edge31" class="edge">
+<title>campaignIdUnitsObservationsLocationsGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M890.85,-466.46C814.14,-478.84 705.54,-496.02 629.67,-507.77"/>
+<polygon fill="black" stroke="black" points="629,-504.34 619.65,-509.32 630.07,-511.25 629,-504.34"/>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;campaignIdGET -->
+<g id="edge10" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M835.84,-380.97C654.4,-384.91 379.27,-396.7 346.74,-432 309.53,-472.37 380.36,-495.82 446.64,-508.41"/>
+<polygon fill="black" stroke="black" points="446.33,-511.91 456.79,-510.27 447.58,-505.03 446.33,-511.91"/>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdGET -->
+<g id="edge8" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1103.26,-391.48C1142.97,-391.88 1175.57,-387.39 1175.57,-378 1175.57,-369.42 1148.33,-364.93 1113.33,-364.53"/>
+<polygon fill="black" stroke="black" points="1113.27,-361.03 1103.26,-364.52 1113.26,-368.03 1113.27,-361.03"/>
+</g>
+<!-- campaignIdUnitIdObservationsGET -->
+<g id="node8" class="node">
+<title>campaignIdUnitIdObservationsGET</title>
+<ellipse fill="none" stroke="black" cx="1237.74" cy="-306" rx="214.46" ry="18"/>
+<text text-anchor="middle" x="1237.74" y="-302.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}/observations</text>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdObservationsGET -->
+<g id="edge12" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdObservationsGET</title>
+<path fill="none" stroke="black" d="M1045.77,-360.85C1080.5,-350.47 1127.22,-336.93 1165.9,-326.02"/>
+<polygon fill="black" stroke="black" points="1166.87,-329.38 1175.55,-323.31 1164.97,-322.65 1166.87,-329.38"/>
+</g>
+<!-- campaignIdUnitIdLocationsGET -->
+<g id="node9" class="node">
+<title>campaignIdUnitIdLocationsGET</title>
+<ellipse fill="none" stroke="black" cx="289.74" cy="-306" rx="252.36" ry="18"/>
+<text text-anchor="middle" x="289.74" y="-302.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}/observations/locations</text>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdLocationsGET -->
+<g id="edge13" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdLocationsGET</title>
+<path fill="none" stroke="black" d="M876.79,-365.71C755.56,-353.89 567.35,-335.25 436.83,-322.15"/>
+<polygon fill="black" stroke="black" points="437.05,-318.65 426.75,-321.13 436.35,-325.62 437.05,-318.65"/>
+</g>
+<!-- campaignIdUnitIdSensorsGET -->
+<g id="node10" class="node">
+<title>campaignIdUnitIdSensorsGET</title>
+<ellipse fill="none" stroke="black" cx="772.74" cy="-306" rx="194.97" ry="18"/>
+<text text-anchor="middle" x="772.74" y="-302.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}/sensors</text>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdSensorsGET -->
+<g id="edge11" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;campaignIdUnitIdSensorsGET</title>
+<path fill="none" stroke="black" d="M944.3,-360.85C911.75,-350.64 869.47,-337.37 835.03,-326.55"/>
+<polygon fill="black" stroke="black" points="835.67,-323.09 825.08,-323.43 833.57,-329.76 835.67,-323.09"/>
+</g>
+<!-- campaignIdUnitIdGET&#45;&gt;unitIdGET -->
+<g id="edge9" class="edge">
+<title>campaignIdUnitIdGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1125.51,-367.22C1223.11,-358.78 1359.89,-344.66 1478.74,-324 1484.12,-323.06 1489.71,-321.96 1495.27,-320.77"/>
+<polygon fill="black" stroke="black" points="1496.22,-324.15 1505.22,-318.56 1494.7,-317.31 1496.22,-324.15"/>
+</g>
+<!-- campaignIdUnitIdObservationsGET&#45;&gt;campaignIdUnitIdGET -->
+<g id="edge22" class="edge">
+<title>campaignIdUnitIdObservationsGET&#45;&gt;campaignIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1186.22,-323.59C1151.23,-334.04 1104.58,-347.55 1066.18,-358.37"/>
+<polygon fill="black" stroke="black" points="1064.78,-355.13 1056.1,-361.2 1066.67,-361.87 1064.78,-355.13"/>
+</g>
+<!-- campaignIdUnitIdObservationsGET&#45;&gt;campaignIdUnitIdObservationsGET -->
+<g id="edge23" class="edge">
+<title>campaignIdUnitIdObservationsGET&#45;&gt;campaignIdUnitIdObservationsGET</title>
+<path fill="none" stroke="black" d="M1379.9,-319.49C1429.79,-319.69 1470.22,-315.19 1470.22,-306 1470.22,-297.44 1435.13,-292.95 1389.99,-292.53"/>
+<polygon fill="black" stroke="black" points="1389.91,-289.03 1379.9,-292.51 1389.89,-296.03 1389.91,-289.03"/>
+</g>
+<!-- campaignIdUnitIdLocationsGET&#45;&gt;campaignIdGET -->
+<g id="edge28" class="edge">
+<title>campaignIdUnitIdLocationsGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M288.93,-324.06C288.38,-356.78 292.08,-428.61 331.74,-468 349.04,-485.18 402.85,-498.6 451.54,-507.64"/>
+<polygon fill="black" stroke="black" points="451.05,-511.11 461.52,-509.44 452.3,-504.22 451.05,-511.11"/>
+</g>
+<!-- campaignIdUnitIdLocationsGET&#45;&gt;campaignIdUnitIdGET -->
+<g id="edge29" class="edge">
+<title>campaignIdUnitIdLocationsGET&#45;&gt;campaignIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M434.25,-320.78C562.96,-333.38 749.26,-351.85 871.43,-364.14"/>
+<polygon fill="black" stroke="black" points="871.28,-367.65 881.58,-365.17 871.98,-360.68 871.28,-367.65"/>
+</g>
+<!-- campaignIdUnitIdLocationsGET&#45;&gt;campaignIdUnitIdLocationsGET -->
+<g id="edge30" class="edge">
+<title>campaignIdUnitIdLocationsGET&#45;&gt;campaignIdUnitIdLocationsGET</title>
+<path fill="none" stroke="black" d="M456.61,-319.5C513.82,-319.6 559.91,-315.11 559.91,-306 559.91,-297.45 519.24,-292.96 466.88,-292.53"/>
+<polygon fill="black" stroke="black" points="466.63,-289.03 456.61,-292.5 466.6,-296.03 466.63,-289.03"/>
+</g>
+<!-- campaignIdUnitIdSensorIdGET -->
+<g id="node11" class="node">
+<title>campaignIdUnitIdSensorIdGET</title>
+<ellipse fill="none" stroke="black" cx="843.74" cy="-234" rx="237.46" ry="18"/>
+<text text-anchor="middle" x="843.74" y="-230.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}/sensors/{sensorId}</text>
+</g>
+<!-- campaignIdUnitIdSensorsGET&#45;&gt;campaignIdUnitIdSensorIdGET -->
+<g id="edge14" class="edge">
+<title>campaignIdUnitIdSensorsGET&#45;&gt;campaignIdUnitIdSensorIdGET</title>
+<path fill="none" stroke="black" d="M789.92,-288.05C798.6,-279.5 809.29,-268.96 818.85,-259.54"/>
+<polygon fill="black" stroke="black" points="821.55,-261.79 826.21,-252.28 816.64,-256.8 821.55,-261.79"/>
+</g>
+<!-- campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdGET -->
+<g id="edge17" class="edge">
+<title>campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M920.09,-251.13C941.13,-259.02 962.15,-270.71 976.74,-288 991.18,-305.12 995.45,-330.56 996.39,-349.87"/>
+<polygon fill="black" stroke="black" points="992.89,-349.95 996.61,-359.87 999.89,-349.8 992.89,-349.95"/>
+</g>
+<!-- campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdSensorIdGET -->
+<g id="edge15" class="edge">
+<title>campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdSensorIdGET</title>
+<path fill="none" stroke="black" d="M1000.75,-247.5C1055.09,-247.64 1098.97,-243.14 1098.97,-234 1098.97,-225.43 1060.4,-220.94 1010.81,-220.53"/>
+<polygon fill="black" stroke="black" points="1010.76,-217.03 1000.75,-220.5 1010.75,-224.03 1010.76,-217.03"/>
+</g>
+<!-- campaignIdUnitIdSensorIdObservationsGET -->
+<g id="node12" class="node">
+<title>campaignIdUnitIdSensorIdObservationsGET</title>
+<ellipse fill="none" stroke="black" cx="912.74" cy="-162" rx="289.75" ry="18"/>
+<text text-anchor="middle" x="912.74" y="-158.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/campaigns/{campaignId}/units/{unitId}/sensors/{sensorId}/observations</text>
+</g>
+<!-- campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdSensorIdObservationsGET -->
+<g id="edge19" class="edge">
+<title>campaignIdUnitIdSensorIdGET&#45;&gt;campaignIdUnitIdSensorIdObservationsGET</title>
+<path fill="none" stroke="black" d="M854.88,-215.7C862.51,-207.05 872.78,-196.45 882.61,-187.03"/>
+<polygon fill="black" stroke="black" points="885.09,-189.5 889.98,-180.1 880.3,-184.4 885.09,-189.5"/>
+</g>
+<!-- sensorIdGET -->
+<g id="node18" class="node">
+<title>sensorIdGET</title>
+<ellipse fill="none" stroke="black" cx="1324.74" cy="-162" rx="86.38" ry="18"/>
+<text text-anchor="middle" x="1324.74" y="-158.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/sensors/{sensorId}</text>
+</g>
+<!-- campaignIdUnitIdSensorIdGET&#45;&gt;sensorIdGET -->
+<g id="edge16" class="edge">
+<title>campaignIdUnitIdSensorIdGET&#45;&gt;sensorIdGET</title>
+<path fill="none" stroke="black" d="M960.04,-218.28C1036.75,-208.27 1139.37,-194.28 1229.74,-180 1237.1,-178.84 1244.78,-177.56 1252.43,-176.25"/>
+<polygon fill="black" stroke="black" points="1253.2,-179.67 1262.45,-174.52 1252,-172.78 1253.2,-179.67"/>
+</g>
+<!-- phenomenonIdGET -->
+<g id="node21" class="node">
+<title>phenomenonIdGET</title>
+<ellipse fill="none" stroke="black" cx="751.74" cy="-90" rx="137.58" ry="18"/>
+<text text-anchor="middle" x="751.74" y="-86.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/phenomenons/{phenomenonId}</text>
+</g>
+<!-- campaignIdUnitIdSensorIdGET&#45;&gt;phenomenonIdGET -->
+<g id="edge18" class="edge">
+<title>campaignIdUnitIdSensorIdGET&#45;&gt;phenomenonIdGET</title>
+<path fill="none" stroke="black" d="M720.85,-218.6C673.84,-210.34 628.03,-197.96 613.74,-180 603.77,-167.48 604.68,-157.19 613.74,-144 625.11,-127.44 642.44,-116.06 661,-108.23"/>
+<polygon fill="black" stroke="black" points="662.43,-111.43 670.5,-104.55 659.91,-104.9 662.43,-111.43"/>
+</g>
+<!-- campaignIdUnitIdSensorIdObservationsGET&#45;&gt;campaignIdUnitIdSensorIdGET -->
+<g id="edge24" class="edge">
+<title>campaignIdUnitIdSensorIdObservationsGET&#45;&gt;campaignIdUnitIdSensorIdGET</title>
+<path fill="none" stroke="black" d="M901.62,-180.28C893.95,-188.97 883.61,-199.64 873.73,-209.11"/>
+<polygon fill="black" stroke="black" points="871.22,-206.66 866.32,-216.05 876.01,-211.77 871.22,-206.66"/>
+</g>
+<!-- campaignIdUnitIdSensorIdObservationsGET&#45;&gt;campaignIdUnitIdSensorIdObservationsGET -->
+<g id="edge25" class="edge">
+<title>campaignIdUnitIdSensorIdObservationsGET&#45;&gt;campaignIdUnitIdSensorIdObservationsGET</title>
+<path fill="none" stroke="black" d="M1104.78,-175.5C1169.1,-175.52 1220.61,-171.02 1220.61,-162 1220.61,-153.46 1174.39,-148.97 1114.84,-148.53"/>
+<polygon fill="black" stroke="black" points="1114.79,-145.03 1104.78,-148.5 1114.77,-152.03 1114.79,-145.03"/>
+</g>
+<!-- unitsGET -->
+<g id="node13" class="node">
+<title>unitsGET</title>
+<ellipse fill="none" stroke="black" cx="1489.74" cy="-378" rx="31.7" ry="18"/>
+<text text-anchor="middle" x="1489.74" y="-374.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/units</text>
+</g>
+<!-- unitsGET&#45;&gt;unitIdGET -->
+<g id="edge34" class="edge">
+<title>unitsGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1503.05,-361.46C1510.57,-352.69 1520.14,-341.53 1528.66,-331.6"/>
+<polygon fill="black" stroke="black" points="1531.35,-333.83 1535.2,-323.96 1526.03,-329.28 1531.35,-333.83"/>
+</g>
+<!-- unitIdGET&#45;&gt;unitIdGET -->
+<g id="edge35" class="edge">
+<title>unitIdGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1591.99,-319.2C1611.95,-320.74 1629.48,-316.34 1629.48,-306 1629.48,-297.44 1617.46,-292.95 1601.99,-292.53"/>
+<polygon fill="black" stroke="black" points="1601.9,-289.03 1591.99,-292.8 1602.08,-296.03 1601.9,-289.03"/>
+</g>
+<!-- unitIdSensorsGET -->
+<g id="node15" class="node">
+<title>unitIdSensorsGET</title>
+<ellipse fill="none" stroke="black" cx="1549.74" cy="-234" rx="94.78" ry="18"/>
+<text text-anchor="middle" x="1549.74" y="-230.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/units/{unitId}/sensors</text>
+</g>
+<!-- unitIdGET&#45;&gt;unitIdSensorsGET -->
+<g id="edge36" class="edge">
+<title>unitIdGET&#45;&gt;unitIdSensorsGET</title>
+<path fill="none" stroke="black" d="M1549.74,-287.7C1549.74,-279.98 1549.74,-270.71 1549.74,-262.11"/>
+<polygon fill="black" stroke="black" points="1553.24,-262.1 1549.74,-252.1 1546.24,-262.1 1553.24,-262.1"/>
+</g>
+<!-- unitIdCampaignsGET -->
+<g id="node16" class="node">
+<title>unitIdCampaignsGET</title>
+<ellipse fill="none" stroke="black" cx="1223.74" cy="-234" rx="107.48" ry="18"/>
+<text text-anchor="middle" x="1223.74" y="-230.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/units/{unitId}/campaigns</text>
+</g>
+<!-- unitIdGET&#45;&gt;unitIdCampaignsGET -->
+<g id="edge37" class="edge">
+<title>unitIdGET&#45;&gt;unitIdCampaignsGET</title>
+<path fill="none" stroke="black" d="M1503.95,-293.82C1495.57,-291.84 1486.9,-289.83 1478.74,-288 1418.75,-274.59 1350.57,-260.48 1299.81,-250.19"/>
+<polygon fill="black" stroke="black" points="1300.39,-246.74 1289.9,-248.18 1299.01,-253.6 1300.39,-246.74"/>
+</g>
+<!-- unitIdSensorsGET&#45;&gt;sensorIdGET -->
+<g id="edge38" class="edge">
+<title>unitIdSensorsGET&#45;&gt;sensorIdGET</title>
+<path fill="none" stroke="black" d="M1502.57,-218.33C1466.96,-207.25 1418,-192.01 1380.46,-180.34"/>
+<polygon fill="black" stroke="black" points="1381.28,-176.92 1370.69,-177.3 1379.2,-183.61 1381.28,-176.92"/>
+</g>
+<!-- unitIdCampaignsGET&#45;&gt;campaignIdGET -->
+<g id="edge39" class="edge">
+<title>unitIdCampaignsGET&#45;&gt;campaignIdGET</title>
+<path fill="none" stroke="black" d="M1149.94,-247.08C1135.95,-249.01 1121.42,-250.77 1107.74,-252 1048,-257.36 70.43,-244.89 28.74,-288 -102.6,-423.79 256.89,-487.4 440.43,-510.39"/>
+<polygon fill="black" stroke="black" points="440.02,-513.86 450.37,-511.61 440.88,-506.91 440.02,-513.86"/>
+</g>
+<!-- sensorsGET -->
+<g id="node17" class="node">
+<title>sensorsGET</title>
+<ellipse fill="none" stroke="black" cx="1392.74" cy="-234" rx="44.39" ry="18"/>
+<text text-anchor="middle" x="1392.74" y="-230.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/sensors</text>
+</g>
+<!-- sensorsGET&#45;&gt;sensorIdGET -->
+<g id="edge45" class="edge">
+<title>sensorsGET&#45;&gt;sensorIdGET</title>
+<path fill="none" stroke="black" d="M1377.31,-217.12C1368.69,-208.24 1357.77,-197.01 1348.13,-187.08"/>
+<polygon fill="black" stroke="black" points="1350.53,-184.53 1341.05,-179.8 1345.51,-189.41 1350.53,-184.53"/>
+</g>
+<!-- sensorIdGET&#45;&gt;sensorIdGET -->
+<g id="edge46" class="edge">
+<title>sensorIdGET&#45;&gt;sensorIdGET</title>
+<path fill="none" stroke="black" d="M1383,-175.35C1407.91,-176.4 1429.18,-171.95 1429.18,-162 1429.18,-153.45 1413.47,-148.96 1393.24,-148.53"/>
+<polygon fill="black" stroke="black" points="1392.96,-145.04 1383,-148.65 1393.04,-152.04 1392.96,-145.04"/>
+</g>
+<!-- sensorIdUnitsGET -->
+<g id="node19" class="node">
+<title>sensorIdUnitsGET</title>
+<ellipse fill="none" stroke="black" cx="1189.74" cy="-90" rx="107.48" ry="18"/>
+<text text-anchor="middle" x="1189.74" y="-86.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/sensors/{sensorId}/units</text>
+</g>
+<!-- sensorIdGET&#45;&gt;sensorIdUnitsGET -->
+<g id="edge47" class="edge">
+<title>sensorIdGET&#45;&gt;sensorIdUnitsGET</title>
+<path fill="none" stroke="black" d="M1294.1,-145.12C1275.21,-135.32 1250.77,-122.65 1230.28,-112.02"/>
+<polygon fill="black" stroke="black" points="1231.67,-108.8 1221.19,-107.31 1228.45,-115.02 1231.67,-108.8"/>
+</g>
+<!-- sensorIdGET&#45;&gt;phenomenonIdGET -->
+<g id="edge48" class="edge">
+<title>sensorIdGET&#45;&gt;phenomenonIdGET</title>
+<path fill="none" stroke="black" d="M1263,-149.34C1251.94,-147.42 1240.52,-145.56 1229.74,-144 1108.03,-126.38 968.14,-111.49 871.28,-102.02"/>
+<polygon fill="black" stroke="black" points="871.45,-98.53 861.16,-101.04 870.78,-105.49 871.45,-98.53"/>
+</g>
+<!-- phenomenonsGET -->
+<g id="node20" class="node">
+<title>phenomenonsGET</title>
+<ellipse fill="none" stroke="black" cx="496.74" cy="-162" rx="69.59" ry="18"/>
+<text text-anchor="middle" x="496.74" y="-158.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/phenomenons</text>
+</g>
+<!-- phenomenonsGET&#45;&gt;phenomenonIdGET -->
+<g id="edge49" class="edge">
+<title>phenomenonsGET&#45;&gt;phenomenonIdGET</title>
+<path fill="none" stroke="black" d="M542.62,-148.4C582.43,-137.48 640.55,-121.52 685.42,-109.2"/>
+<polygon fill="black" stroke="black" points="686.36,-112.58 695.07,-106.55 684.5,-105.83 686.36,-112.58"/>
+</g>
+<!-- phenomenonIdGET&#45;&gt;phenomenonIdGET -->
+<g id="edge50" class="edge">
+<title>phenomenonIdGET&#45;&gt;phenomenonIdGET</title>
+<path fill="none" stroke="black" d="M843.34,-103.45C878.43,-104.01 907.52,-99.53 907.52,-90 907.52,-81.4 883.83,-76.91 853.42,-76.53"/>
+<polygon fill="black" stroke="black" points="853.33,-73.03 843.34,-76.55 853.34,-80.03 853.33,-73.03"/>
+</g>
+<!-- phenomenonIdSensorsGET -->
+<g id="node22" class="node">
+<title>phenomenonIdSensorsGET</title>
+<ellipse fill="none" stroke="black" cx="751.74" cy="-18" rx="170.87" ry="18"/>
+<text text-anchor="middle" x="751.74" y="-14.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/phenomenons/{phenomenonId}/sensors</text>
+</g>
+<!-- phenomenonIdGET&#45;&gt;phenomenonIdSensorsGET -->
+<g id="edge51" class="edge">
+<title>phenomenonIdGET&#45;&gt;phenomenonIdSensorsGET</title>
+<path fill="none" stroke="black" d="M745.82,-71.7C745.03,-63.98 744.8,-54.71 745.14,-46.11"/>
+<polygon fill="black" stroke="black" points="748.64,-46.32 745.84,-36.1 741.65,-45.84 748.64,-46.32"/>
+</g>
+<!-- phenomenonIdSensorsGET&#45;&gt;sensorIdGET -->
+<g id="edge53" class="edge">
+<title>phenomenonIdSensorsGET&#45;&gt;sensorIdGET</title>
+<path fill="none" stroke="black" d="M910.57,-24.72C1063.75,-31.75 1276.61,-46.05 1305.74,-72 1322.73,-87.15 1326.62,-113.44 1326.76,-133.53"/>
+<polygon fill="black" stroke="black" points="1323.26,-133.59 1326.53,-143.67 1330.26,-133.75 1323.26,-133.59"/>
+</g>
+<!-- phenomenonIdSensorsGET&#45;&gt;phenomenonIdGET -->
+<g id="edge52" class="edge">
+<title>phenomenonIdSensorsGET&#45;&gt;phenomenonIdGET</title>
+<path fill="none" stroke="black" d="M757.63,-36.1C758.44,-43.79 758.67,-53.05 758.34,-61.67"/>
+<polygon fill="black" stroke="black" points="754.85,-61.48 757.65,-71.7 761.83,-61.96 754.85,-61.48"/>
+</g>
+<!-- driversGET -->
+<g id="node23" class="node">
+<title>driversGET</title>
+<ellipse fill="none" stroke="black" cx="1631.74" cy="-738" rx="39.79" ry="18"/>
+<text text-anchor="middle" x="1631.74" y="-734.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers</text>
+</g>
+<!-- driverIdGET -->
+<g id="node24" class="node">
+<title>driverIdGET</title>
+<ellipse fill="none" stroke="black" cx="1786.74" cy="-666" rx="77.19" ry="18"/>
+<text text-anchor="middle" x="1786.74" y="-662.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}</text>
+</g>
+<!-- driversGET&#45;&gt;driverIdGET -->
+<g id="edge54" class="edge">
+<title>driversGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M1658.74,-724.81C1682.17,-714.22 1716.51,-698.72 1743.72,-686.43"/>
+<polygon fill="black" stroke="black" points="1745.35,-689.53 1753.02,-682.23 1742.47,-683.15 1745.35,-689.53"/>
+</g>
+<!-- driverIdGET&#45;&gt;driverIdGET -->
+<g id="edge55" class="edge">
+<title>driverIdGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M1839.2,-679.31C1862.25,-680.49 1882.08,-676.05 1882.08,-666 1882.08,-657.48 1867.83,-652.99 1849.45,-652.54"/>
+<polygon fill="black" stroke="black" points="1849.15,-649.04 1839.2,-652.69 1849.25,-656.04 1849.15,-649.04"/>
+</g>
+<!-- driverIdUnitsGET -->
+<g id="node25" class="node">
+<title>driverIdUnitsGET</title>
+<ellipse fill="none" stroke="black" cx="1910.74" cy="-594" rx="98.58" ry="18"/>
+<text text-anchor="middle" x="1910.74" y="-590.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/units</text>
+</g>
+<!-- driverIdGET&#45;&gt;driverIdUnitsGET -->
+<g id="edge56" class="edge">
+<title>driverIdGET&#45;&gt;driverIdUnitsGET</title>
+<path fill="none" stroke="black" d="M1814.87,-649.12C1832.07,-639.41 1854.27,-626.87 1872.98,-616.31"/>
+<polygon fill="black" stroke="black" points="1874.86,-619.27 1881.85,-611.31 1871.42,-613.18 1874.86,-619.27"/>
+</g>
+<!-- driverIdActionsGET -->
+<g id="node28" class="node">
+<title>driverIdActionsGET</title>
+<ellipse fill="none" stroke="black" cx="1685.74" cy="-594" rx="107.78" ry="18"/>
+<text text-anchor="middle" x="1685.74" y="-590.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/actions</text>
+</g>
+<!-- driverIdGET&#45;&gt;driverIdActionsGET -->
+<g id="edge57" class="edge">
+<title>driverIdGET&#45;&gt;driverIdActionsGET</title>
+<path fill="none" stroke="black" d="M1763.31,-648.76C1749.87,-639.45 1732.79,-627.61 1718.08,-617.41"/>
+<polygon fill="black" stroke="black" points="1719.95,-614.45 1709.74,-611.63 1715.96,-620.21 1719.95,-614.45"/>
+</g>
+<!-- driverIdUnitsGET&#45;&gt;driverIdUnitsGET -->
+<g id="edge58" class="edge">
+<title>driverIdUnitsGET&#45;&gt;driverIdUnitsGET</title>
+<path fill="none" stroke="black" d="M1977.07,-607.39C2004.41,-608.27 2027.53,-603.81 2027.53,-594 2027.53,-585.42 2009.83,-580.93 1987.08,-580.53"/>
+<polygon fill="black" stroke="black" points="1987.04,-577.03 1977.07,-580.61 1987.09,-584.03 1987.04,-577.03"/>
+</g>
+<!-- driverIdUnitIdGET -->
+<g id="node26" class="node">
+<title>driverIdUnitIdGET</title>
+<ellipse fill="none" stroke="black" cx="1922.74" cy="-882" rx="128.88" ry="18"/>
+<text text-anchor="middle" x="1922.74" y="-878.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/units/{unitId}</text>
+</g>
+<!-- driverIdUnitIdGET&#45;&gt;unitIdGET -->
+<g id="edge60" class="edge">
+<title>driverIdUnitIdGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1807.03,-874.03C1756.88,-867.16 1698.96,-853.79 1651.74,-828 1526.29,-759.49 1549.74,-665.94 1549.74,-523 1549.74,-523 1549.74,-523 1549.74,-449 1549.74,-409 1549.74,-362.65 1549.74,-334.08"/>
+<polygon fill="black" stroke="black" points="1553.24,-334.05 1549.74,-324.05 1546.24,-334.05 1553.24,-334.05"/>
+</g>
+<!-- driverIdUnitIdGET&#45;&gt;driverIdUnitIdGET -->
+<g id="edge59" class="edge">
+<title>driverIdUnitIdGET&#45;&gt;driverIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M2008.62,-895.45C2041.83,-896.04 2069.43,-891.56 2069.43,-882 2069.43,-873.45 2047.34,-868.96 2018.91,-868.53"/>
+<polygon fill="black" stroke="black" points="2018.61,-865.03 2008.62,-868.55 2018.63,-872.03 2018.61,-865.03"/>
+</g>
+<!-- driverIdUnitIdActionsGET -->
+<g id="node27" class="node">
+<title>driverIdUnitIdActionsGET</title>
+<ellipse fill="none" stroke="black" cx="1819.74" cy="-810" rx="159.47" ry="18"/>
+<text text-anchor="middle" x="1819.74" y="-806.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/units/{unitId}/actions</text>
+</g>
+<!-- driverIdUnitIdGET&#45;&gt;driverIdUnitIdActionsGET -->
+<g id="edge61" class="edge">
+<title>driverIdUnitIdGET&#45;&gt;driverIdUnitIdActionsGET</title>
+<path fill="none" stroke="black" d="M1898.07,-864.23C1884.53,-855.04 1867.57,-843.51 1852.9,-833.54"/>
+<polygon fill="black" stroke="black" points="1854.8,-830.6 1844.56,-827.87 1850.87,-836.39 1854.8,-830.6"/>
+</g>
+<!-- driverIdUnitIdActionIdGET -->
+<g id="node32" class="node">
+<title>driverIdUnitIdActionIdGET</title>
+<ellipse fill="none" stroke="black" cx="1887.74" cy="-738" rx="198.47" ry="18"/>
+<text text-anchor="middle" x="1887.74" y="-734.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/units/{unitId}/actions/{actionId}</text>
+</g>
+<!-- driverIdUnitIdActionsGET&#45;&gt;driverIdUnitIdActionIdGET -->
+<g id="edge63" class="edge">
+<title>driverIdUnitIdActionsGET&#45;&gt;driverIdUnitIdActionIdGET</title>
+<path fill="none" stroke="black" d="M1836.2,-792.05C1844.51,-783.5 1854.75,-772.96 1863.9,-763.54"/>
+<polygon fill="black" stroke="black" points="1866.5,-765.89 1870.96,-756.28 1861.48,-761.01 1866.5,-765.89"/>
+</g>
+<!-- driverIdActionIdGET -->
+<g id="node29" class="node">
+<title>driverIdActionIdGET</title>
+<ellipse fill="none" stroke="black" cx="1745.74" cy="-522" rx="147.57" ry="18"/>
+<text text-anchor="middle" x="1745.74" y="-518.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/actions/{actionId}</text>
+</g>
+<!-- driverIdActionsGET&#45;&gt;driverIdActionIdGET -->
+<g id="edge62" class="edge">
+<title>driverIdActionsGET&#45;&gt;driverIdActionIdGET</title>
+<path fill="none" stroke="black" d="M1700.26,-576.05C1707.45,-567.67 1716.27,-557.38 1724.23,-548.1"/>
+<polygon fill="black" stroke="black" points="1727.08,-550.15 1730.93,-540.28 1721.76,-545.59 1727.08,-550.15"/>
+</g>
+<!-- driverIdActionIdGET&#45;&gt;driverIdGET -->
+<g id="edge65" class="edge">
+<title>driverIdActionIdGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M1875.84,-530.61C1943.22,-537.57 2015.72,-550.81 2036.74,-576 2086.31,-635.41 1963.23,-655.18 1872.7,-661.74"/>
+<polygon fill="black" stroke="black" points="1872.41,-658.25 1862.67,-662.43 1872.88,-665.24 1872.41,-658.25"/>
+</g>
+<!-- driverIdActionIdGET&#45;&gt;driverIdActionIdGET -->
+<g id="edge64" class="edge">
+<title>driverIdActionIdGET&#45;&gt;driverIdActionIdGET</title>
+<path fill="none" stroke="black" d="M1843.89,-535.47C1880.81,-535.95 1911.27,-531.46 1911.27,-522 1911.27,-513.43 1886.26,-508.94 1854.09,-508.53"/>
+<polygon fill="black" stroke="black" points="1853.89,-505.03 1843.89,-508.53 1853.89,-512.03 1853.89,-505.03"/>
+</g>
+<!-- driverIdActionIdUnitsGET -->
+<g id="node30" class="node">
+<title>driverIdActionIdUnitsGET</title>
+<ellipse fill="none" stroke="black" cx="1745.74" cy="-450" rx="168.17" ry="18"/>
+<text text-anchor="middle" x="1745.74" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/actions/{actionId}/units</text>
+</g>
+<!-- driverIdActionIdGET&#45;&gt;driverIdActionIdUnitsGET -->
+<g id="edge66" class="edge">
+<title>driverIdActionIdGET&#45;&gt;driverIdActionIdUnitsGET</title>
+<path fill="none" stroke="black" d="M1745.74,-503.7C1745.74,-495.98 1745.74,-486.71 1745.74,-478.11"/>
+<polygon fill="black" stroke="black" points="1749.24,-478.1 1745.74,-468.1 1742.24,-478.1 1749.24,-478.1"/>
+</g>
+<!-- driverIdActionIdUnitIdGET -->
+<g id="node31" class="node">
+<title>driverIdActionIdUnitIdGET</title>
+<ellipse fill="none" stroke="black" cx="1812.74" cy="-378" rx="198.47" ry="18"/>
+<text text-anchor="middle" x="1812.74" y="-374.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/actions/{actionId}/units/{unitId}</text>
+</g>
+<!-- driverIdActionIdUnitsGET&#45;&gt;driverIdActionIdUnitIdGET -->
+<g id="edge40" class="edge">
+<title>driverIdActionIdUnitsGET&#45;&gt;driverIdActionIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1761.96,-432.05C1770.15,-423.5 1780.23,-412.96 1789.25,-403.54"/>
+<polygon fill="black" stroke="black" points="1791.82,-405.92 1796.2,-396.28 1786.76,-401.08 1791.82,-405.92"/>
+</g>
+<!-- driverIdActionIdUnitIdGET&#45;&gt;unitIdGET -->
+<g id="edge44" class="edge">
+<title>driverIdActionIdUnitIdGET&#45;&gt;unitIdGET</title>
+<path fill="none" stroke="black" d="M1752.07,-360.85C1707.17,-348.9 1646.58,-332.78 1603.43,-321.29"/>
+<polygon fill="black" stroke="black" points="1604.25,-317.89 1593.68,-318.7 1602.45,-324.65 1604.25,-317.89"/>
+</g>
+<!-- driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdGET -->
+<g id="edge42" class="edge">
+<title>driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdGET</title>
+<path fill="none" stroke="black" d="M1875.54,-395.16C1893.93,-403.13 1911.97,-414.86 1922.74,-432 1931.25,-445.55 1932.29,-455.17 1922.74,-468 1911.53,-483.06 1873.57,-495.42 1835.67,-504.41"/>
+<polygon fill="black" stroke="black" points="1834.49,-501.09 1825.53,-506.74 1836.06,-507.92 1834.49,-501.09"/>
+</g>
+<!-- driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdUnitIdGET -->
+<g id="edge41" class="edge">
+<title>driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1944.17,-391.49C1990.93,-391.74 2028.97,-387.25 2028.97,-378 2028.97,-369.44 1996.37,-364.95 1954.42,-364.53"/>
+<polygon fill="black" stroke="black" points="1954.17,-361.03 1944.17,-364.51 1954.16,-368.03 1954.17,-361.03"/>
+</g>
+<!-- driverIdUnitIdActionIdEventsGET -->
+<g id="node33" class="node">
+<title>driverIdUnitIdActionIdEventsGET</title>
+<ellipse fill="none" stroke="black" cx="1876.74" cy="-306" rx="226.66" ry="18"/>
+<text text-anchor="middle" x="1876.74" y="-302.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}/units/{unitId}/actions/{actionId}/events</text>
+</g>
+<!-- driverIdActionIdUnitIdGET&#45;&gt;driverIdUnitIdActionIdEventsGET -->
+<g id="edge43" class="edge">
+<title>driverIdActionIdUnitIdGET&#45;&gt;driverIdUnitIdActionIdEventsGET</title>
+<path fill="none" stroke="black" d="M1828.23,-360.05C1835.98,-351.58 1845.5,-341.17 1854.05,-331.82"/>
+<polygon fill="black" stroke="black" points="1856.78,-334.02 1860.94,-324.28 1851.61,-329.29 1856.78,-334.02"/>
+</g>
+<!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdGET -->
+<g id="edge68" class="edge">
+<title>driverIdUnitIdActionIdGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M1863.29,-720.05C1849.94,-710.81 1833.26,-699.24 1818.87,-689.27"/>
+<polygon fill="black" stroke="black" points="1820.48,-686.13 1810.27,-683.31 1816.49,-691.88 1820.48,-686.13"/>
+</g>
+<!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdGET -->
+<g id="edge69" class="edge">
+<title>driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M1942.6,-755.3C1960.13,-763.39 1977.61,-775.16 1987.74,-792 1995.99,-805.71 1994.6,-813.55 1987.74,-828 1982.02,-840.04 1972.08,-850.24 1961.67,-858.39"/>
+<polygon fill="black" stroke="black" points="1959.33,-855.76 1953.29,-864.47 1963.44,-861.43 1959.33,-855.76"/>
+</g>
+<!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdGET -->
+<g id="edge67" class="edge">
+<title>driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdGET</title>
+<path fill="none" stroke="black" d="M2019.17,-751.49C2065.93,-751.74 2103.97,-747.25 2103.97,-738 2103.97,-729.44 2071.37,-724.95 2029.42,-724.53"/>
+<polygon fill="black" stroke="black" points="2029.17,-721.03 2019.17,-724.51 2029.16,-728.03 2029.17,-721.03"/>
+</g>
+<!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdEventsGET -->
+<g id="edge70" class="edge">
+<title>driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdEventsGET</title>
+<path fill="none" stroke="black" d="M1954.05,-721.04C2014.27,-702.12 2093.74,-664.07 2093.74,-595 2093.74,-595 2093.74,-595 2093.74,-449 2093.74,-402.27 2074.55,-388.79 2037.74,-360 2018.18,-344.71 1994.02,-333.74 1970.42,-325.9"/>
+<polygon fill="black" stroke="black" points="1971.31,-322.51 1960.72,-322.84 1969.2,-329.19 1971.31,-322.51"/>
+</g>
+<!-- driverIdUnitIdActionIdEventIdGET -->
+<g id="node37" class="node">
+<title>driverIdUnitIdActionIdEventIdGET</title>
+<ellipse fill="none" stroke="black" cx="2003.74" cy="-234" rx="142.97" ry="18"/>
+<text text-anchor="middle" x="2003.74" y="-230.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">driverIdUnitIdActionIdEventIdGET</text>
+</g>
+<!-- driverIdUnitIdActionIdEventsGET&#45;&gt;driverIdUnitIdActionIdEventIdGET -->
+<g id="edge71" class="edge">
+<title>driverIdUnitIdActionIdEventsGET&#45;&gt;driverIdUnitIdActionIdEventIdGET</title>
+<path fill="none" stroke="black" d="M1907.48,-288.05C1924.56,-278.64 1946,-266.82 1964.3,-256.74"/>
+<polygon fill="black" stroke="black" points="1966.21,-259.68 1973.28,-251.79 1962.83,-253.55 1966.21,-259.68"/>
+</g>
+<!-- eventIdGET -->
+<g id="node34" class="node">
+<title>eventIdGET</title>
+<ellipse fill="none" stroke="black" cx="2209.74" cy="-954" rx="76.89" ry="18"/>
+<text text-anchor="middle" x="2209.74" y="-950.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/events/{eventId}</text>
+</g>
+<!-- eventIdGET&#45;&gt;driverIdGET -->
+<g id="edge73" class="edge">
+<title>eventIdGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M2154.81,-941.38C2144.51,-939.42 2133.82,-937.53 2123.74,-936 1873.2,-898.01 1677.21,-991.13 1582.74,-756 1576.77,-741.15 1572.95,-732.66 1582.74,-720 1598.58,-699.51 1659.28,-685.48 1710.39,-677.02"/>
+<polygon fill="black" stroke="black" points="1711.14,-680.44 1720.46,-675.4 1710.04,-673.53 1711.14,-680.44"/>
+</g>
+<!-- eventIdGET&#45;&gt;driverIdUnitIdGET -->
+<g id="edge74" class="edge">
+<title>eventIdGET&#45;&gt;driverIdUnitIdGET</title>
+<path fill="none" stroke="black" d="M2158.43,-940.49C2112.55,-929.3 2044.88,-912.79 1993.8,-900.33"/>
+<polygon fill="black" stroke="black" points="1994.36,-896.87 1983.81,-897.9 1992.7,-903.67 1994.36,-896.87"/>
+</g>
+<!-- eventIdGET&#45;&gt;driverIdActionIdGET -->
+<g id="edge75" class="edge">
+<title>eventIdGET&#45;&gt;driverIdActionIdGET</title>
+<path fill="none" stroke="black" d="M2155.31,-941.22C2144.87,-939.25 2133.99,-937.4 2123.74,-936 1914.84,-907.51 1852.89,-959.86 1650.74,-900 1571.59,-876.57 1487.74,-893.54 1487.74,-811 1487.74,-811 1487.74,-811 1487.74,-665 1487.74,-591.02 1570.16,-555.31 1641.83,-538.23"/>
+<polygon fill="black" stroke="black" points="1642.89,-541.58 1651.86,-535.95 1641.34,-534.76 1642.89,-541.58"/>
+</g>
+<!-- eventIdObservationsGET -->
+<g id="node35" class="node">
+<title>eventIdObservationsGET</title>
+<ellipse fill="none" stroke="black" cx="2288.74" cy="-882" rx="129.18" ry="18"/>
+<text text-anchor="middle" x="2288.74" y="-878.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/events/{eventId}/observations</text>
+</g>
+<!-- eventIdGET&#45;&gt;eventIdObservationsGET -->
+<g id="edge76" class="edge">
+<title>eventIdGET&#45;&gt;eventIdObservationsGET</title>
+<path fill="none" stroke="black" d="M2222.98,-936.05C2232.13,-927.11 2244.49,-916.01 2256.08,-906.27"/>
+<polygon fill="black" stroke="black" points="2258.44,-908.85 2263.93,-899.79 2253.99,-903.45 2258.44,-908.85"/>
+</g>
+<!-- eventIdLocationsGET -->
+<g id="node36" class="node">
+<title>eventIdLocationsGET</title>
+<ellipse fill="none" stroke="black" cx="2620.74" cy="-882" rx="167.07" ry="18"/>
+<text text-anchor="middle" x="2620.74" y="-878.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/events/{eventId}/observations/locations</text>
+</g>
+<!-- eventIdGET&#45;&gt;eventIdLocationsGET -->
+<g id="edge77" class="edge">
+<title>eventIdGET&#45;&gt;eventIdLocationsGET</title>
+<path fill="none" stroke="black" d="M2268.02,-942.22C2333.92,-930.65 2442.23,-912.16 2521.49,-898.92"/>
+<polygon fill="black" stroke="black" points="2522.21,-902.35 2531.5,-897.25 2521.06,-895.45 2522.21,-902.35"/>
+</g>
+<!-- eventIdGET&#45;&gt;driverIdUnitIdActionIdEventIdGET -->
+<g id="edge72" class="edge">
+<title>eventIdGET&#45;&gt;driverIdUnitIdActionIdEventIdGET</title>
+<path fill="none" stroke="black" d="M2185.38,-936.82C2173.17,-927.47 2159.22,-914.66 2150.74,-900 2130.48,-864.99 2131.74,-851.45 2131.74,-811 2131.74,-811 2131.74,-811 2131.74,-377 2131.74,-336.55 2137.67,-319.85 2112.74,-288 2101.35,-273.46 2084.97,-262.66 2068.35,-254.75"/>
+<polygon fill="black" stroke="black" points="2069.68,-251.51 2059.12,-250.64 2066.83,-257.91 2069.68,-251.51"/>
+</g>
+<!-- eventIdObservationsGET&#45;&gt;eventIdGET -->
+<g id="edge26" class="edge">
+<title>eventIdObservationsGET&#45;&gt;eventIdGET</title>
+<path fill="none" stroke="black" d="M2275.31,-900.12C2266.02,-909.2 2253.46,-920.46 2241.77,-930.26"/>
+<polygon fill="black" stroke="black" points="2239.36,-927.71 2233.86,-936.76 2243.81,-933.12 2239.36,-927.71"/>
+</g>
+<!-- eventIdObservationsGET&#45;&gt;eventIdObservationsGET -->
+<g id="edge27" class="edge">
+<title>eventIdObservationsGET&#45;&gt;eventIdObservationsGET</title>
+<path fill="none" stroke="black" d="M2375,-895.45C2408.35,-896.04 2436.08,-891.56 2436.08,-882 2436.08,-873.45 2413.89,-868.96 2385.34,-868.53"/>
+<polygon fill="black" stroke="black" points="2384.99,-865.03 2375,-868.55 2385.01,-872.03 2384.99,-865.03"/>
+</g>
+<!-- eventIdLocationsGET&#45;&gt;eventIdGET -->
+<g id="edge32" class="edge">
+<title>eventIdLocationsGET&#45;&gt;eventIdGET</title>
+<path fill="none" stroke="black" d="M2539.61,-897.78C2464.43,-910.86 2353.73,-929.69 2281.64,-941.63"/>
+<polygon fill="black" stroke="black" points="2281.02,-938.18 2271.73,-943.27 2282.17,-945.09 2281.02,-938.18"/>
+</g>
+<!-- eventIdLocationsGET&#45;&gt;eventIdLocationsGET -->
+<g id="edge33" class="edge">
+<title>eventIdLocationsGET&#45;&gt;eventIdLocationsGET</title>
+<path fill="none" stroke="black" d="M2731.83,-895.48C2772.48,-895.84 2805.77,-891.35 2805.77,-882 2805.77,-873.45 2777.95,-868.96 2742.13,-868.53"/>
+<polygon fill="black" stroke="black" points="2741.84,-865.03 2731.83,-868.52 2741.83,-872.03 2741.84,-865.03"/>
+</g>
+</g>
+</svg>

+ 1 - 0
src/main/java/cz/senslog/telemetry/server/HttpVertxServer.java

@@ -53,6 +53,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     OpenAPIHandler apiHandler = OpenAPIHandler.create(repo);
 
                     openAPIRouterBuilder.operation("infoGET").handler(apiHandler::info);
+
                     openAPIRouterBuilder.operation("campaignsGET").handler(apiHandler::campaignsGET);
                     openAPIRouterBuilder.operation("campaignIdGET").handler(apiHandler::campaignIdGET);
                     openAPIRouterBuilder.operation("campaignIdUnitsGET").handler(apiHandler::campaignIdUnitsGET);

+ 2 - 2
src/main/resources/openAPISpec.yaml

@@ -2554,12 +2554,12 @@ components:
           type: string
           format: uri
           x-graph-properties:
-            linkTo: driverIdUnitIdActionIdEventIdObservationsGET
+            linkTo: eventIdObservationsGET
         Locations@NavigationLink:
           type: string
           format: uri
           x-graph-properties:
-            linkTo: driverIdUnitIdActionIdEventIdLocationsGET
+            linkTo: eventIdLocationsGET
       properties:
         self@NavigationLink:
           $ref: '#/components/schemas/EventDetailInfo/x-NavigationLinks/self@NavigationLink'