ソースを参照

Added API 'unitIdDriversGET'

Lukas Cerny 1 年間 前
コミット
1bd699e924

+ 314 - 296
doc/openAPI_NavigationLinks.svg

@@ -4,694 +4,712 @@
 <!-- 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)">
+<svg width="2959pt" height="908pt"
+ viewBox="0.00 0.00 2959.21 908.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 904)">
 <title>regexp</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-976 2809.77,-976 2809.77,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-904 2955.21,-904 2955.21,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>
+<ellipse fill="none" stroke="black" cx="787.18" cy="-882" rx="27.9" ry="18"/>
+<text text-anchor="middle" x="787.18" y="-878.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>
+<ellipse fill="none" stroke="black" cx="889.18" cy="-882" rx="55.79" ry="18"/>
+<text text-anchor="middle" x="889.18" y="-878.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>
+<ellipse fill="none" stroke="black" cx="889.18" cy="-810" rx="110.48" ry="18"/>
+<text text-anchor="middle" x="889.18" y="-806.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"/>
+<path fill="none" stroke="black" d="M889.18,-863.7C889.18,-855.98 889.18,-846.71 889.18,-838.11"/>
+<polygon fill="black" stroke="black" points="892.68,-838.1 889.18,-828.1 885.68,-838.1 892.68,-838.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"/>
+<path fill="none" stroke="black" d="M963.12,-823.42C992.78,-824.18 1017.67,-819.7 1017.67,-810 1017.67,-801.43 998.27,-796.94 973.32,-796.53"/>
+<polygon fill="black" stroke="black" points="973.1,-793.03 963.12,-796.58 973.14,-800.03 973.1,-793.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>
+<ellipse fill="none" stroke="black" cx="1482.18" cy="-738" rx="131.88" ry="18"/>
+<text text-anchor="middle" x="1482.18" y="-734.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"/>
+<path fill="none" stroke="black" d="M976.26,-798.87C1067.29,-788.27 1214.27,-771.09 1341.18,-756 1352.75,-754.62 1364.86,-753.18 1376.9,-751.73"/>
+<polygon fill="black" stroke="black" points="1377.49,-755.19 1387,-750.52 1376.65,-748.24 1377.49,-755.19"/>
 </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>
+<ellipse fill="none" stroke="black" cx="668.18" cy="-738" rx="184.67" ry="18"/>
+<text text-anchor="middle" x="668.18" y="-734.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"/>
+<path fill="none" stroke="black" d="M836.67,-794.15C802.86,-783.85 759.02,-770.02 724.49,-758.78"/>
+<polygon fill="black" stroke="black" points="725.15,-755.32 714.56,-755.54 722.98,-761.97 725.15,-755.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>
+<ellipse fill="none" stroke="black" cx="1110.18" cy="-738" rx="221.76" ry="18"/>
+<text text-anchor="middle" x="1110.18" y="-734.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"/>
+<path fill="none" stroke="black" d="M932.77,-793.38C964.11,-783.06 1006.89,-769.47 1042.62,-758.46"/>
+<polygon fill="black" stroke="black" points="1043.96,-761.71 1052.49,-755.43 1041.91,-755.02 1043.96,-761.71"/>
 </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>
+<ellipse fill="none" stroke="black" cx="773.18" cy="-666" rx="161.67" ry="18"/>
+<text text-anchor="middle" x="773.18" y="-662.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"/>
+<path fill="none" stroke="black" d="M1388.17,-725.31C1372.49,-723.46 1356.38,-721.63 1341.18,-720 1192.89,-704.15 1022.53,-688.6 907.37,-678.49"/>
+<polygon fill="black" stroke="black" points="907.36,-674.98 897.09,-677.59 906.75,-681.95 907.36,-674.98"/>
 </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>
+<ellipse fill="none" stroke="black" cx="1512.18" cy="-594" rx="61.99" ry="18"/>
+<text text-anchor="middle" x="1512.18" y="-590.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"/>
+<path fill="none" stroke="black" d="M1485.8,-719.87C1490.93,-695.56 1500.38,-650.82 1506.47,-622.01"/>
+<polygon fill="black" stroke="black" points="1509.9,-622.7 1508.55,-612.19 1503.05,-621.25 1509.9,-622.7"/>
 </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"/>
+<path fill="none" stroke="black" d="M725.06,-755.18C759.26,-765.64 802.44,-779.29 835.96,-790.22"/>
+<polygon fill="black" stroke="black" points="834.99,-793.59 845.59,-793.38 837.17,-786.94 834.99,-793.59"/>
 </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"/>
+<path fill="none" stroke="black" d="M790.56,-751.49C834.72,-751.79 870.76,-747.3 870.76,-738 870.76,-729.43 840.13,-724.94 800.75,-724.53"/>
+<polygon fill="black" stroke="black" points="800.57,-721.03 790.56,-724.51 800.56,-728.03 800.57,-721.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"/>
+<path fill="none" stroke="black" d="M1063.42,-755.66C1030.81,-766.36 987.03,-780.24 951.48,-791.16"/>
+<polygon fill="black" stroke="black" points="950.22,-787.88 941.68,-794.15 952.27,-794.58 950.22,-787.88"/>
 </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"/>
+<path fill="none" stroke="black" d="M615.31,-670.08C519.21,-677.58 423.8,-698.78 474.18,-756 494.01,-778.53 661.27,-794.06 777.29,-802.24"/>
+<polygon fill="black" stroke="black" points="777.08,-805.73 787.3,-802.94 777.57,-798.75 777.08,-805.73"/>
 </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"/>
+<path fill="none" stroke="black" d="M880.71,-679.48C920.41,-679.88 953.01,-675.39 953.01,-666 953.01,-657.42 925.77,-652.93 890.77,-652.53"/>
+<polygon fill="black" stroke="black" points="890.71,-649.03 880.71,-652.52 890.7,-656.03 890.71,-649.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>
+<ellipse fill="none" stroke="black" cx="1200.18" cy="-594" rx="214.46" ry="18"/>
+<text text-anchor="middle" x="1200.18" y="-590.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"/>
+<path fill="none" stroke="black" d="M856.06,-650.5C923.43,-639.21 1018.94,-623.54 1092.27,-611.73"/>
+<polygon fill="black" stroke="black" points="1093.15,-615.13 1102.46,-610.09 1092.03,-608.22 1093.15,-615.13"/>
 </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>
+<ellipse fill="none" stroke="black" cx="252.18" cy="-594" rx="252.36" ry="18"/>
+<text text-anchor="middle" x="252.18" y="-590.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"/>
+<path fill="none" stroke="black" d="M671.01,-652C584.7,-640.62 461.07,-624.03 370.48,-611.68"/>
+<polygon fill="black" stroke="black" points="370.82,-608.19 360.44,-610.31 369.87,-615.13 370.82,-608.19"/>
 </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>
+<ellipse fill="none" stroke="black" cx="773.18" cy="-594" rx="194.97" ry="18"/>
+<text text-anchor="middle" x="773.18" y="-590.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"/>
+<path fill="none" stroke="black" d="M773.18,-647.7C773.18,-639.98 773.18,-630.71 773.18,-622.11"/>
+<polygon fill="black" stroke="black" points="776.68,-622.1 773.18,-612.1 769.68,-622.1 776.68,-622.1"/>
 </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"/>
+<path fill="none" stroke="black" d="M924.86,-659.7C1060.77,-653.36 1265.23,-639.87 1441.18,-612 1446.65,-611.13 1452.33,-610.06 1457.98,-608.89"/>
+<polygon fill="black" stroke="black" points="1459.06,-612.24 1468.08,-606.68 1457.56,-605.4 1459.06,-612.24"/>
 </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"/>
+<path fill="none" stroke="black" d="M1111.63,-610.45C1042.36,-622.03 946.05,-637.82 873.85,-649.43"/>
+<polygon fill="black" stroke="black" points="873.14,-646 863.83,-651.04 874.25,-652.91 873.14,-646"/>
 </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"/>
+<path fill="none" stroke="black" d="M1342.34,-607.49C1392.23,-607.69 1432.66,-603.19 1432.66,-594 1432.66,-585.44 1397.57,-580.95 1352.43,-580.53"/>
+<polygon fill="black" stroke="black" points="1352.35,-577.03 1342.34,-580.51 1352.33,-584.03 1352.35,-577.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"/>
+<path fill="none" stroke="black" d="M267.43,-612.04C299.01,-646.06 375.48,-722.04 457.18,-756 513.25,-779.31 669.21,-794.24 777.52,-802.13"/>
+<polygon fill="black" stroke="black" points="777.3,-805.62 787.52,-802.84 777.8,-798.64 777.3,-805.62"/>
 </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"/>
+<path fill="none" stroke="black" d="M369.45,-610C458.91,-621.82 581.02,-638.23 667.48,-650.04"/>
+<polygon fill="black" stroke="black" points="667.19,-653.53 677.58,-651.42 668.14,-646.6 667.19,-653.53"/>
 </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"/>
+<path fill="none" stroke="black" d="M419.06,-607.5C476.26,-607.6 522.36,-603.11 522.36,-594 522.36,-585.45 481.68,-580.96 429.32,-580.53"/>
+<polygon fill="black" stroke="black" points="429.07,-577.03 419.06,-580.5 429.04,-584.03 429.07,-577.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>
+<ellipse fill="none" stroke="black" cx="722.18" cy="-522" rx="237.46" ry="18"/>
+<text text-anchor="middle" x="722.18" y="-518.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"/>
+<path fill="none" stroke="black" d="M760.57,-575.7C754.58,-567.47 747.3,-557.48 740.7,-548.42"/>
+<polygon fill="black" stroke="black" points="743.36,-546.13 734.64,-540.1 737.7,-550.25 743.36,-546.13"/>
 </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"/>
+<path fill="none" stroke="black" d="M644.66,-539.03C594.08,-553.13 542.06,-576.94 569.18,-612 582,-628.58 624.21,-640.94 666.93,-649.53"/>
+<polygon fill="black" stroke="black" points="666.43,-653 676.91,-651.47 667.76,-646.12 666.43,-653"/>
 </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"/>
+<path fill="none" stroke="black" d="M879.2,-535.5C933.53,-535.64 977.41,-531.14 977.41,-522 977.41,-513.43 938.84,-508.94 889.25,-508.53"/>
+<polygon fill="black" stroke="black" points="889.21,-505.03 879.2,-508.5 889.19,-512.03 889.21,-505.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>
+<ellipse fill="none" stroke="black" cx="524.18" cy="-450" rx="289.75" ry="18"/>
+<text text-anchor="middle" x="524.18" y="-446.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"/>
+<path fill="none" stroke="black" d="M669.41,-504.41C640.28,-494.49 604.32,-481.82 575.43,-471.31"/>
+<polygon fill="black" stroke="black" points="576.52,-467.98 565.93,-467.83 574.12,-474.56 576.52,-467.98"/>
 </g>
 <!-- sensorIdGET -->
-<g id="node18" class="node">
+<g id="node19" 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>
+<ellipse fill="none" stroke="black" cx="1136.18" cy="-450" rx="86.38" ry="18"/>
+<text text-anchor="middle" x="1136.18" y="-446.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"/>
+<path fill="none" stroke="black" d="M815.23,-505.43C877.95,-494.91 962.55,-480.69 1037.18,-468 1045.12,-466.65 1053.42,-465.23 1061.7,-463.82"/>
+<polygon fill="black" stroke="black" points="1062.48,-467.23 1071.75,-462.1 1061.3,-460.33 1062.48,-467.23"/>
 </g>
 <!-- phenomenonIdGET -->
-<g id="node21" class="node">
+<g id="node22" 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>
+<ellipse fill="none" stroke="black" cx="860.18" cy="-378" rx="137.58" ry="18"/>
+<text text-anchor="middle" x="860.18" y="-374.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"/>
+<path fill="none" stroke="black" d="M787.2,-504.66C807.15,-496.66 827.44,-484.96 841.18,-468 855.21,-450.68 859.55,-425.42 860.61,-406.23"/>
+<polygon fill="black" stroke="black" points="864.12,-406.11 860.91,-396.01 857.12,-405.9 864.12,-406.11"/>
 </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"/>
+<path fill="none" stroke="black" d="M577.42,-467.75C606.54,-477.67 642.38,-490.3 671.15,-500.77"/>
+<polygon fill="black" stroke="black" points="670.02,-504.09 680.61,-504.23 672.42,-497.51 670.02,-504.09"/>
 </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"/>
+<path fill="none" stroke="black" d="M716.22,-463.5C780.54,-463.52 832.05,-459.02 832.05,-450 832.05,-441.46 785.83,-436.97 726.29,-436.53"/>
+<polygon fill="black" stroke="black" points="726.24,-433.03 716.22,-436.5 726.21,-440.03 726.24,-433.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>
+<ellipse fill="none" stroke="black" cx="1542.18" cy="-666" rx="31.7" ry="18"/>
+<text text-anchor="middle" x="1542.18" y="-662.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"/>
+<path fill="none" stroke="black" d="M1535.07,-648.41C1531.61,-640.34 1527.36,-630.43 1523.47,-621.35"/>
+<polygon fill="black" stroke="black" points="1526.6,-619.77 1519.44,-611.96 1520.17,-622.53 1526.6,-619.77"/>
 </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"/>
+<path fill="none" stroke="black" d="M1554.43,-607.2C1574.39,-608.74 1591.92,-604.34 1591.92,-594 1591.92,-585.44 1579.9,-580.95 1564.43,-580.53"/>
+<polygon fill="black" stroke="black" points="1564.34,-577.03 1554.43,-580.8 1564.52,-584.03 1564.34,-577.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>
+<ellipse fill="none" stroke="black" cx="1110.18" cy="-522" rx="94.78" ry="18"/>
+<text text-anchor="middle" x="1110.18" y="-518.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"/>
+<path fill="none" stroke="black" d="M1466.84,-581.59C1458.34,-579.61 1449.51,-577.66 1441.18,-576 1340.99,-556.09 1315.03,-556.24 1214.18,-540 1206.22,-538.72 1197.91,-537.37 1189.62,-536.03"/>
+<polygon fill="black" stroke="black" points="1189.97,-532.54 1179.54,-534.38 1188.85,-539.45 1189.97,-532.54"/>
 </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>
+<ellipse fill="none" stroke="black" cx="1772.18" cy="-522" rx="107.48" ry="18"/>
+<text text-anchor="middle" x="1772.18" y="-518.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"/>
+<path fill="none" stroke="black" d="M1555.99,-581.2C1597.6,-570 1660.66,-553.02 1707.96,-540.29"/>
+<polygon fill="black" stroke="black" points="1709.05,-543.62 1717.79,-537.64 1707.23,-536.86 1709.05,-543.62"/>
 </g>
-<!-- unitIdSensorsGET&#45;&gt;sensorIdGET -->
+<!-- unitIdDriversGET -->
+<g id="node17" class="node">
+<title>unitIdDriversGET</title>
+<ellipse fill="none" stroke="black" cx="1458.18" cy="-522" rx="90.98" ry="18"/>
+<text text-anchor="middle" x="1458.18" y="-518.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/units/{unitId}/drivers</text>
+</g>
+<!-- unitIdGET&#45;&gt;unitIdDriversGET -->
 <g id="edge38" class="edge">
+<title>unitIdGET&#45;&gt;unitIdDriversGET</title>
+<path fill="none" stroke="black" d="M1499.11,-576.05C1492.7,-567.75 1484.86,-557.58 1477.75,-548.38"/>
+<polygon fill="black" stroke="black" points="1480.38,-546.06 1471.5,-540.28 1474.84,-550.33 1480.38,-546.06"/>
+</g>
+<!-- unitIdSensorsGET&#45;&gt;sensorIdGET -->
+<g id="edge39" 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"/>
+<path fill="none" stroke="black" d="M1116.6,-503.7C1119.53,-495.81 1123.06,-486.3 1126.32,-477.55"/>
+<polygon fill="black" stroke="black" points="1129.62,-478.7 1129.82,-468.1 1123.06,-476.26 1129.62,-478.7"/>
 </g>
 <!-- unitIdCampaignsGET&#45;&gt;campaignIdGET -->
-<g id="edge39" class="edge">
+<g id="edge40" 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"/>
+<path fill="none" stroke="black" d="M1767.18,-540.08C1753.07,-584.78 1708.38,-705.28 1623.18,-756 1571.75,-786.62 1202.3,-800.81 1007.98,-806.22"/>
+<polygon fill="black" stroke="black" points="1007.62,-802.73 997.72,-806.5 1007.81,-809.72 1007.62,-802.73"/>
+</g>
+<!-- driverIdGET -->
+<g id="node25" class="node">
+<title>driverIdGET</title>
+<ellipse fill="none" stroke="black" cx="1762.18" cy="-450" rx="77.19" ry="18"/>
+<text text-anchor="middle" x="1762.18" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers/{driverId}</text>
+</g>
+<!-- unitIdDriversGET&#45;&gt;driverIdGET -->
+<g id="edge41" class="edge">
+<title>unitIdDriversGET&#45;&gt;driverIdGET</title>
+<path fill="none" stroke="black" d="M1515,-507.92C1567.42,-495.85 1645.11,-477.96 1699.35,-465.47"/>
+<polygon fill="black" stroke="black" points="1700.24,-468.85 1709.2,-463.2 1698.66,-462.03 1700.24,-468.85"/>
 </g>
 <!-- sensorsGET -->
-<g id="node17" class="node">
+<g id="node18" 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>
+<ellipse fill="none" stroke="black" cx="1267.18" cy="-522" rx="44.39" ry="18"/>
+<text text-anchor="middle" x="1267.18" y="-518.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/sensors</text>
 </g>
 <!-- sensorsGET&#45;&gt;sensorIdGET -->
-<g id="edge45" class="edge">
+<g id="edge47" 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"/>
+<path fill="none" stroke="black" d="M1241.3,-507.17C1222.38,-497.06 1196.39,-483.17 1174.99,-471.74"/>
+<polygon fill="black" stroke="black" points="1176.6,-468.63 1166.13,-467.01 1173.3,-474.81 1176.6,-468.63"/>
 </g>
 <!-- sensorIdGET&#45;&gt;sensorIdGET -->
-<g id="edge46" class="edge">
+<g id="edge48" 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"/>
+<path fill="none" stroke="black" d="M1194.44,-463.35C1219.35,-464.4 1240.62,-459.95 1240.62,-450 1240.62,-441.45 1224.91,-436.96 1204.68,-436.53"/>
+<polygon fill="black" stroke="black" points="1204.4,-433.04 1194.44,-436.65 1204.48,-440.04 1204.4,-433.04"/>
 </g>
 <!-- sensorIdUnitsGET -->
-<g id="node19" class="node">
+<g id="node20" 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>
+<ellipse fill="none" stroke="black" cx="1141.18" cy="-378" rx="107.48" ry="18"/>
+<text text-anchor="middle" x="1141.18" y="-374.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">
+<g id="edge49" 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"/>
+<path fill="none" stroke="black" d="M1137.41,-431.7C1137.96,-423.98 1138.63,-414.71 1139.24,-406.11"/>
+<polygon fill="black" stroke="black" points="1142.73,-406.33 1139.96,-396.1 1135.75,-405.83 1142.73,-406.33"/>
 </g>
 <!-- sensorIdGET&#45;&gt;phenomenonIdGET -->
-<g id="edge48" class="edge">
+<g id="edge50" 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"/>
+<path fill="none" stroke="black" d="M1083.61,-435.67C1040.1,-424.63 977.9,-408.86 930.18,-396.75"/>
+<polygon fill="black" stroke="black" points="930.78,-393.29 920.22,-394.23 929.05,-400.08 930.78,-393.29"/>
 </g>
 <!-- phenomenonsGET -->
-<g id="node20" class="node">
+<g id="node21" 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>
+<ellipse fill="none" stroke="black" cx="958.18" cy="-450" rx="69.59" ry="18"/>
+<text text-anchor="middle" x="958.18" y="-446.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/phenomenons</text>
 </g>
 <!-- phenomenonsGET&#45;&gt;phenomenonIdGET -->
-<g id="edge49" class="edge">
+<g id="edge51" 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"/>
+<path fill="none" stroke="black" d="M935.45,-432.76C922.62,-423.6 906.38,-412 892.27,-401.92"/>
+<polygon fill="black" stroke="black" points="893.98,-398.84 883.81,-395.88 889.91,-404.54 893.98,-398.84"/>
 </g>
 <!-- phenomenonIdGET&#45;&gt;phenomenonIdGET -->
-<g id="edge50" class="edge">
+<g id="edge52" 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"/>
+<path fill="none" stroke="black" d="M951.78,-391.45C986.87,-392.01 1015.97,-387.53 1015.97,-378 1015.97,-369.4 992.27,-364.91 961.86,-364.53"/>
+<polygon fill="black" stroke="black" points="961.77,-361.03 951.78,-364.55 961.78,-368.03 961.77,-361.03"/>
 </g>
 <!-- phenomenonIdSensorsGET -->
-<g id="node22" class="node">
+<g id="node23" 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>
+<ellipse fill="none" stroke="black" cx="860.18" cy="-306" rx="170.87" ry="18"/>
+<text text-anchor="middle" x="860.18" y="-302.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">
+<g id="edge53" 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"/>
+<path fill="none" stroke="black" d="M854.26,-359.7C853.47,-351.98 853.24,-342.71 853.58,-334.11"/>
+<polygon fill="black" stroke="black" points="857.08,-334.32 854.28,-324.1 850.09,-333.84 857.08,-334.32"/>
 </g>
 <!-- phenomenonIdSensorsGET&#45;&gt;sensorIdGET -->
-<g id="edge53" class="edge">
+<g id="edge55" 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"/>
+<path fill="none" stroke="black" d="M998.63,-316.6C1106.21,-325.51 1239.97,-340.35 1257.18,-360 1267.72,-372.04 1265.93,-382.61 1257.18,-396 1245.53,-413.82 1226.42,-425.68 1206.8,-433.57"/>
+<polygon fill="black" stroke="black" points="1205.32,-430.38 1197.15,-437.13 1207.75,-436.95 1205.32,-430.38"/>
 </g>
 <!-- phenomenonIdSensorsGET&#45;&gt;phenomenonIdGET -->
-<g id="edge52" class="edge">
+<g id="edge54" 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"/>
+<path fill="none" stroke="black" d="M866.07,-324.1C866.88,-331.79 867.11,-341.05 866.78,-349.67"/>
+<polygon fill="black" stroke="black" points="863.29,-349.48 866.09,-359.7 870.27,-349.96 863.29,-349.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>
+<title>driversGET</title>
+<ellipse fill="none" stroke="black" cx="1607.18" cy="-522" rx="39.79" ry="18"/>
+<text text-anchor="middle" x="1607.18" y="-518.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/drivers</text>
 </g>
 <!-- driversGET&#45;&gt;driverIdGET -->
-<g id="edge54" class="edge">
+<g id="edge56" 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"/>
+<path fill="none" stroke="black" d="M1634.18,-508.81C1657.61,-498.22 1691.95,-482.72 1719.16,-470.43"/>
+<polygon fill="black" stroke="black" points="1720.79,-473.53 1728.46,-466.23 1717.91,-467.15 1720.79,-473.53"/>
 </g>
 <!-- driverIdGET&#45;&gt;driverIdGET -->
-<g id="edge55" class="edge">
+<g id="edge57" 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"/>
+<path fill="none" stroke="black" d="M1814.64,-463.31C1837.69,-464.49 1857.52,-460.05 1857.52,-450 1857.52,-441.48 1843.27,-436.99 1824.89,-436.54"/>
+<polygon fill="black" stroke="black" points="1824.59,-433.04 1814.64,-436.69 1824.69,-440.04 1824.59,-433.04"/>
 </g>
 <!-- driverIdUnitsGET -->
-<g id="node25" class="node">
+<g id="node26" 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>
+<ellipse fill="none" stroke="black" cx="1762.18" cy="-378" rx="98.58" ry="18"/>
+<text text-anchor="middle" x="1762.18" y="-374.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">
+<g id="edge58" 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"/>
+<path fill="none" stroke="black" d="M1762.18,-431.7C1762.18,-423.98 1762.18,-414.71 1762.18,-406.11"/>
+<polygon fill="black" stroke="black" points="1765.68,-406.1 1762.18,-396.1 1758.68,-406.1 1765.68,-406.1"/>
 </g>
 <!-- driverIdActionsGET -->
-<g id="node28" class="node">
+<g id="node29" 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>
+<ellipse fill="none" stroke="black" cx="1537.18" cy="-378" rx="107.78" ry="18"/>
+<text text-anchor="middle" x="1537.18" y="-374.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">
+<g id="edge59" 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"/>
+<path fill="none" stroke="black" d="M1717.72,-435.17C1682.81,-424.31 1633.88,-409.09 1595.77,-397.23"/>
+<polygon fill="black" stroke="black" points="1596.42,-393.76 1585.83,-394.14 1594.34,-400.45 1596.42,-393.76"/>
 </g>
 <!-- driverIdUnitsGET&#45;&gt;driverIdUnitsGET -->
-<g id="edge58" class="edge">
+<g id="edge60" 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"/>
+<path fill="none" stroke="black" d="M1828.51,-391.39C1855.85,-392.27 1878.97,-387.81 1878.97,-378 1878.97,-369.42 1861.27,-364.93 1838.53,-364.53"/>
+<polygon fill="black" stroke="black" points="1838.48,-361.03 1828.51,-364.61 1838.53,-368.03 1838.48,-361.03"/>
 </g>
 <!-- driverIdUnitIdGET -->
-<g id="node26" class="node">
+<g id="node27" 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>
+<ellipse fill="none" stroke="black" cx="2102.18" cy="-666" rx="128.88" ry="18"/>
+<text text-anchor="middle" x="2102.18" y="-662.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">
+<g id="edge62" 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"/>
+<path fill="none" stroke="black" d="M2007.38,-653.75C1887.28,-639.5 1683.33,-615.31 1578.6,-602.88"/>
+<polygon fill="black" stroke="black" points="1578.81,-599.38 1568.47,-601.68 1577.99,-606.33 1578.81,-599.38"/>
 </g>
 <!-- driverIdUnitIdGET&#45;&gt;driverIdUnitIdGET -->
-<g id="edge59" class="edge">
+<g id="edge61" 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"/>
+<path fill="none" stroke="black" d="M2188.06,-679.45C2221.27,-680.04 2248.87,-675.56 2248.87,-666 2248.87,-657.45 2226.78,-652.96 2198.35,-652.53"/>
+<polygon fill="black" stroke="black" points="2198.05,-649.03 2188.06,-652.55 2198.07,-656.03 2198.05,-649.03"/>
 </g>
 <!-- driverIdUnitIdActionsGET -->
-<g id="node27" class="node">
+<g id="node28" 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>
+<ellipse fill="none" stroke="black" cx="2230.18" cy="-594" rx="159.47" ry="18"/>
+<text text-anchor="middle" x="2230.18" y="-590.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">
+<g id="edge63" 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"/>
+<path fill="none" stroke="black" d="M2132.51,-648.41C2149.92,-638.89 2171.97,-626.83 2190.72,-616.58"/>
+<polygon fill="black" stroke="black" points="2192.52,-619.58 2199.62,-611.71 2189.16,-613.44 2192.52,-619.58"/>
 </g>
 <!-- driverIdUnitIdActionIdGET -->
-<g id="node32" class="node">
+<g id="node33" 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>
+<ellipse fill="none" stroke="black" cx="2171.18" cy="-522" rx="198.47" ry="18"/>
+<text text-anchor="middle" x="2171.18" y="-518.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">
+<g id="edge65" 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"/>
+<path fill="none" stroke="black" d="M2215.9,-576.05C2208.83,-567.67 2200.15,-557.38 2192.33,-548.1"/>
+<polygon fill="black" stroke="black" points="2194.86,-545.67 2185.74,-540.28 2189.51,-550.18 2194.86,-545.67"/>
 </g>
 <!-- driverIdActionIdGET -->
-<g id="node29" class="node">
+<g id="node30" 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>
+<ellipse fill="none" stroke="black" cx="1907.18" cy="-306" rx="147.57" ry="18"/>
+<text text-anchor="middle" x="1907.18" y="-302.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">
+<g id="edge64" 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"/>
+<path fill="none" stroke="black" d="M1605.9,-364C1666.63,-352.51 1755.47,-335.7 1820.95,-323.31"/>
+<polygon fill="black" stroke="black" points="1821.67,-326.74 1830.84,-321.44 1820.37,-319.86 1821.67,-326.74"/>
 </g>
 <!-- driverIdActionIdGET&#45;&gt;driverIdGET -->
-<g id="edge65" class="edge">
+<g id="edge67" 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"/>
+<path fill="none" stroke="black" d="M1907.99,-324.07C1908,-343.61 1905.1,-375.55 1888.18,-396 1873.02,-414.31 1850.43,-426.41 1828.55,-434.35"/>
+<polygon fill="black" stroke="black" points="1827.26,-431.09 1818.9,-437.61 1829.5,-437.72 1827.26,-431.09"/>
 </g>
 <!-- driverIdActionIdGET&#45;&gt;driverIdActionIdGET -->
-<g id="edge64" class="edge">
+<g id="edge66" 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"/>
+<path fill="none" stroke="black" d="M2005.33,-319.47C2042.25,-319.95 2072.71,-315.46 2072.71,-306 2072.71,-297.43 2047.7,-292.94 2015.53,-292.53"/>
+<polygon fill="black" stroke="black" points="2015.33,-289.03 2005.33,-292.53 2015.34,-296.03 2015.33,-289.03"/>
 </g>
 <!-- driverIdActionIdUnitsGET -->
-<g id="node30" class="node">
+<g id="node31" 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>
+<ellipse fill="none" stroke="black" cx="1941.18" cy="-234" rx="168.17" ry="18"/>
+<text text-anchor="middle" x="1941.18" y="-230.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">
+<g id="edge68" 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"/>
+<path fill="none" stroke="black" d="M1915.58,-287.7C1919.45,-279.73 1924.13,-270.1 1928.42,-261.26"/>
+<polygon fill="black" stroke="black" points="1931.65,-262.63 1932.87,-252.1 1925.35,-259.57 1931.65,-262.63"/>
 </g>
 <!-- driverIdActionIdUnitIdGET -->
-<g id="node31" class="node">
+<g id="node32" 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>
+<ellipse fill="none" stroke="black" cx="1843.18" cy="-162" rx="198.47" ry="18"/>
+<text text-anchor="middle" x="1843.18" y="-158.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">
+<g id="edge42" 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"/>
+<path fill="none" stroke="black" d="M1917.45,-216.05C1904.79,-207.01 1889.02,-195.74 1875.27,-185.93"/>
+<polygon fill="black" stroke="black" points="1877.19,-183 1867.02,-180.03 1873.12,-188.69 1877.19,-183"/>
 </g>
 <!-- driverIdActionIdUnitIdGET&#45;&gt;unitIdGET -->
-<g id="edge44" class="edge">
+<g id="edge46" 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"/>
+<path fill="none" stroke="black" d="M1704.12,-174.88C1554.94,-191.57 1339.18,-228.87 1339.18,-305 1339.18,-451 1339.18,-451 1339.18,-451 1339.18,-491.45 1331.36,-509.72 1358.18,-540 1371.43,-554.96 1417.01,-569.56 1455.17,-579.64"/>
+<polygon fill="black" stroke="black" points="1454.63,-583.11 1465.19,-582.23 1456.38,-576.34 1454.63,-583.11"/>
 </g>
 <!-- driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdGET -->
-<g id="edge42" class="edge">
+<g id="edge44" 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"/>
+<path fill="none" stroke="black" d="M1803.33,-179.64C1788.23,-188.15 1772.65,-200.12 1764.18,-216 1756.65,-230.12 1755.04,-238.87 1764.18,-252 1775.63,-268.45 1792.81,-279.81 1811.34,-287.65"/>
+<polygon fill="black" stroke="black" points="1810.23,-290.97 1820.82,-291.32 1812.76,-284.45 1810.23,-290.97"/>
 </g>
 <!-- driverIdActionIdUnitIdGET&#45;&gt;driverIdActionIdUnitIdGET -->
-<g id="edge41" class="edge">
+<g id="edge43" 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"/>
+<path fill="none" stroke="black" d="M1974.61,-175.49C2021.37,-175.74 2059.41,-171.25 2059.41,-162 2059.41,-153.44 2026.81,-148.95 1984.86,-148.53"/>
+<polygon fill="black" stroke="black" points="1984.62,-145.03 1974.61,-148.51 1984.6,-152.03 1984.62,-145.03"/>
 </g>
 <!-- driverIdUnitIdActionIdEventsGET -->
-<g id="node33" class="node">
+<g id="node34" 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>
+<ellipse fill="none" stroke="black" cx="2171.18" cy="-90" rx="226.66" ry="18"/>
+<text text-anchor="middle" x="2171.18" y="-86.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">
+<g id="edge45" 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"/>
+<path fill="none" stroke="black" d="M1917.2,-145.2C1967.34,-134.5 2033.74,-120.33 2086.07,-109.16"/>
+<polygon fill="black" stroke="black" points="2086.96,-112.55 2096.01,-107.04 2085.5,-105.71 2086.96,-112.55"/>
 </g>
 <!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdGET -->
-<g id="edge68" class="edge">
+<g id="edge70" 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"/>
+<path fill="none" stroke="black" d="M2082.68,-505.85C2007.68,-493.02 1901.58,-474.86 1832.33,-463.01"/>
+<polygon fill="black" stroke="black" points="1832.84,-459.54 1822.39,-461.31 1831.66,-466.44 1832.84,-459.54"/>
 </g>
 <!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdGET -->
-<g id="edge69" class="edge">
+<g id="edge71" 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"/>
+<path fill="none" stroke="black" d="M2109.22,-539.16C2090.9,-547.14 2072.89,-558.88 2062.18,-576 2049.4,-596.42 2063.16,-621.62 2077.92,-639.99"/>
+<polygon fill="black" stroke="black" points="2075.53,-642.57 2084.68,-647.9 2080.85,-638.03 2075.53,-642.57"/>
 </g>
 <!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdGET -->
-<g id="edge67" class="edge">
+<g id="edge69" 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"/>
+<path fill="none" stroke="black" d="M2302.61,-535.49C2349.37,-535.74 2387.41,-531.25 2387.41,-522 2387.41,-513.44 2354.81,-508.95 2312.86,-508.53"/>
+<polygon fill="black" stroke="black" points="2312.62,-505.03 2302.61,-508.51 2312.6,-512.03 2312.62,-505.03"/>
 </g>
 <!-- driverIdUnitIdActionIdGET&#45;&gt;driverIdUnitIdActionIdEventsGET -->
-<g id="edge70" class="edge">
+<g id="edge72" 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"/>
+<path fill="none" stroke="black" d="M2171.18,-503.95C2171.18,-477.29 2171.18,-424.11 2171.18,-379 2171.18,-379 2171.18,-379 2171.18,-233 2171.18,-193 2171.18,-146.65 2171.18,-118.08"/>
+<polygon fill="black" stroke="black" points="2174.68,-118.05 2171.18,-108.05 2167.68,-118.05 2174.68,-118.05"/>
 </g>
 <!-- driverIdUnitIdActionIdEventIdGET -->
-<g id="node37" class="node">
+<g id="node38" 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>
+<ellipse fill="none" stroke="black" cx="2371.18" cy="-18" rx="142.97" ry="18"/>
+<text text-anchor="middle" x="2371.18" y="-14.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">driverIdUnitIdActionIdEventIdGET</text>
 </g>
 <!-- driverIdUnitIdActionIdEventsGET&#45;&gt;driverIdUnitIdActionIdEventIdGET -->
-<g id="edge71" class="edge">
+<g id="edge73" 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"/>
+<path fill="none" stroke="black" d="M2218.83,-72.32C2247.92,-62.14 2285.23,-49.08 2315.65,-38.43"/>
+<polygon fill="black" stroke="black" points="2316.99,-41.68 2325.27,-35.07 2314.67,-35.07 2316.99,-41.68"/>
 </g>
 <!-- eventIdGET -->
-<g id="node34" class="node">
+<g id="node35" 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>
+<ellipse fill="none" stroke="black" cx="2396.18" cy="-738" rx="76.89" ry="18"/>
+<text text-anchor="middle" x="2396.18" y="-734.3" font-family="Helvetica,Arial,sans-serif" font-size="14.00">/events/{eventId}</text>
 </g>
 <!-- eventIdGET&#45;&gt;driverIdGET -->
-<g id="edge73" class="edge">
+<g id="edge75" 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"/>
+<path fill="none" stroke="black" d="M2322.22,-733.18C2198.41,-726.12 1959.84,-709.39 1931.18,-684 1869.61,-629.46 1941.39,-566.72 1888.18,-504 1872.73,-485.79 1849.96,-473.71 1828.02,-465.75"/>
+<polygon fill="black" stroke="black" points="1828.95,-462.37 1818.35,-462.48 1826.7,-469 1828.95,-462.37"/>
 </g>
 <!-- eventIdGET&#45;&gt;driverIdUnitIdGET -->
-<g id="edge74" class="edge">
+<g id="edge76" 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"/>
+<path fill="none" stroke="black" d="M2344.29,-724.65C2297.06,-713.4 2226.86,-696.69 2174.2,-684.15"/>
+<polygon fill="black" stroke="black" points="2174.79,-680.69 2164.25,-681.78 2173.17,-687.5 2174.79,-680.69"/>
 </g>
 <!-- eventIdGET&#45;&gt;driverIdActionIdGET -->
-<g id="edge75" class="edge">
+<g id="edge77" 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"/>
+<path fill="none" stroke="black" d="M2319.2,-737.91C2209.15,-737.53 2014.55,-730.11 1964.18,-684 1934.34,-656.69 1945.18,-635.45 1945.18,-595 1945.18,-595 1945.18,-595 1945.18,-449 1945.18,-407.63 1929.94,-361.72 1918.77,-333.61"/>
+<polygon fill="black" stroke="black" points="1921.9,-332.02 1914.87,-324.09 1915.42,-334.67 1921.9,-332.02"/>
 </g>
 <!-- eventIdObservationsGET -->
-<g id="node35" class="node">
+<g id="node36" 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>
+<ellipse fill="none" stroke="black" cx="2396.18" cy="-666" rx="129.18" ry="18"/>
+<text text-anchor="middle" x="2396.18" y="-662.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">
+<g id="edge78" 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"/>
+<path fill="none" stroke="black" d="M2390.26,-719.7C2389.47,-711.98 2389.24,-702.71 2389.58,-694.11"/>
+<polygon fill="black" stroke="black" points="2393.08,-694.32 2390.28,-684.1 2386.09,-693.84 2393.08,-694.32"/>
 </g>
 <!-- eventIdLocationsGET -->
-<g id="node36" class="node">
+<g id="node37" 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>
+<ellipse fill="none" stroke="black" cx="2766.18" cy="-666" rx="167.07" ry="18"/>
+<text text-anchor="middle" x="2766.18" y="-662.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">
+<g id="edge79" 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"/>
+<path fill="none" stroke="black" d="M2451.71,-725.52C2510.22,-714.1 2603.25,-696.45 2673.01,-683.52"/>
+<polygon fill="black" stroke="black" points="2673.93,-686.91 2683.13,-681.65 2672.66,-680.03 2673.93,-686.91"/>
 </g>
 <!-- eventIdGET&#45;&gt;driverIdUnitIdActionIdEventIdGET -->
-<g id="edge72" class="edge">
+<g id="edge74" 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"/>
+<path fill="none" stroke="black" d="M2463.75,-729.39C2494.85,-722.45 2529.75,-709.22 2552.18,-684 2579.05,-653.77 2571.18,-635.45 2571.18,-595 2571.18,-595 2571.18,-595 2571.18,-161 2571.18,-95.69 2499.39,-57.66 2441.83,-37.67"/>
+<polygon fill="black" stroke="black" points="2442.59,-34.24 2432,-34.38 2440.37,-40.88 2442.59,-34.24"/>
 </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"/>
+<path fill="none" stroke="black" d="M2402.07,-684.1C2402.88,-691.79 2403.11,-701.05 2402.78,-709.67"/>
+<polygon fill="black" stroke="black" points="2399.29,-709.48 2402.09,-719.7 2406.27,-709.96 2399.29,-709.48"/>
 </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"/>
+<path fill="none" stroke="black" d="M2482.44,-679.45C2515.79,-680.04 2543.52,-675.56 2543.52,-666 2543.52,-657.45 2521.33,-652.96 2492.78,-652.53"/>
+<polygon fill="black" stroke="black" points="2492.43,-649.03 2482.44,-652.55 2492.45,-656.03 2492.43,-649.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"/>
+<path fill="none" stroke="black" d="M2691.89,-682.13C2626.07,-694.88 2530.74,-712.89 2466.22,-724.75"/>
+<polygon fill="black" stroke="black" points="2465.34,-721.35 2456.14,-726.6 2466.61,-728.23 2465.34,-721.35"/>
 </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"/>
+<path fill="none" stroke="black" d="M2877.27,-679.48C2917.92,-679.84 2951.21,-675.35 2951.21,-666 2951.21,-657.45 2923.39,-652.96 2887.57,-652.53"/>
+<polygon fill="black" stroke="black" points="2887.28,-649.03 2877.27,-652.52 2887.27,-656.03 2887.28,-649.03"/>
 </g>
 </g>
 </svg>

+ 14 - 0
src/main/java/cz/senslog/telemetry/database/repository/MapLogRepository.java

@@ -335,6 +335,20 @@ public class MapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<List<Driver>> findDriversByUnitId(long unitId) {
+        return client.preparedQuery("SELECT d.id, d.name FROM maplog.driver AS d " +
+                        "JOIN maplog.driver_to_action AS dta ON dta.driver_id = d.id " +
+                        "WHERE dta.unit_id = $1")
+                .execute(Tuple.of(unitId))
+                .map(rs -> StreamSupport.stream(rs.spliterator(), false)
+                        .map(row -> Driver.of(
+                                row.getInteger("id"),
+                                row.getString("name")
+                        )).collect(toList())
+                );
+    }
+
+    @Override
     public Future<List<Action>> findActionsByDriverIdAndUnitId(int driverId, long unitId) {
         return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
                 "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +

+ 5 - 0
src/main/java/cz/senslog/telemetry/database/repository/MockMapLogRepository.java

@@ -196,6 +196,11 @@ public class MockMapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<List<Driver>> findDriversByUnitId(long unitId) {
+        return Future.succeededFuture(Collections.emptyList());
+    }
+
+    @Override
     public Future<List<Action>> findActionsByDriverIdAndUnitId(int driverId, long unitId) {
         return Future.succeededFuture(Collections.emptyList());
     }

+ 1 - 1
src/main/java/cz/senslog/telemetry/database/repository/SensLogRepository.java

@@ -50,7 +50,7 @@ public interface SensLogRepository {
 
     Future<List<Driver>> allDrivers();
     Future<Driver> findDriverById(int driverId);
-
+    Future<List<Driver>> findDriversByUnitId(long unitId);
 
     Future<List<Action>> findActionsByDriverIdAndUnitId(int driverId, long unitId);
     Future<List<Action>> findActionsByDriverId(int driverId);

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

@@ -8,7 +8,9 @@ import io.vertx.core.AbstractVerticle;
 import io.vertx.core.Promise;
 import io.vertx.core.http.HttpMethod;
 import io.vertx.core.json.JsonObject;
+import io.vertx.ext.auth.authentication.AuthenticationProvider;
 import io.vertx.ext.web.Router;
+import io.vertx.ext.web.handler.APIKeyHandler;
 import io.vertx.ext.web.handler.CorsHandler;
 import io.vertx.ext.web.handler.LoggerFormat;
 import io.vertx.ext.web.handler.LoggerHandler;
@@ -45,6 +47,9 @@ public final class HttpVertxServer extends AbstractVerticle {
                             .allowedHeader("Accept")
                     );
 
+//                    openAPIRouterBuilder.securityHandler("ApiKeyAuth")
+//                            .bind(config -> APIKeyHandler.create(authProvider).header(config.getString("name")));
+
                     PgPool pgPool = ConnectionPool.createWithVertx(vertx, config());
 
                     pgPool.query("SELECT version()").execute().map(RowSet::iterator)
@@ -73,6 +78,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("unitIdGET").handler(apiHandler::unitIdGET);
                     openAPIRouterBuilder.operation("unitIdSensorsGET").handler(apiHandler::unitIdSensorsGET);
                     openAPIRouterBuilder.operation("unitIdCampaignsGET").handler(apiHandler::unitIdCampaignsGET);
+                    openAPIRouterBuilder.operation("unitIdDriversGET").handler(apiHandler::unitIdDriversGET);
 
                     openAPIRouterBuilder.operation("sensorsGET").handler(apiHandler::sensorsGET);
                     openAPIRouterBuilder.operation("sensorIdGET").handler(apiHandler::sensorIdGET);

+ 22 - 2
src/main/java/cz/senslog/telemetry/server/OpenAPIHandler.java

@@ -442,7 +442,8 @@ public class OpenAPIHandler {
                 .onSuccess(u -> rc.response().end((navigationLinks ? JsonObject.of(
                                 "self@NavigationLink", String.format("%s/units/%d", host, u.getUnitId()),
                                 "Sensors@NavigationLink", String.format("%s/units/%d/sensors", host, u.getUnitId()),
-                                "Campaigns@NavigationLink", String.format("%s/units/%d/campaigns", host, u.getUnitId())
+                                "Campaigns@NavigationLink", String.format("%s/units/%d/campaigns", host, u.getUnitId()),
+                                "Drivers@NavigationLink", String.format("%s/units/%d/drivers", host, u.getUnitId())
                         ) : JsonObject.of()).mergeIn(JsonObject.of(
                                 "unitId", u.getUnitId(),
                                 "name", u.getName(),
@@ -801,7 +802,7 @@ public class OpenAPIHandler {
         repo.allDrivers()
                 .onSuccess(data -> rc.response().end(new JsonArray(
                         data.stream().map(d -> (navigationLinks ? JsonObject.of(
-                                "Campaign@NavigationLink", String.format("%s/drivers/%d", host, d.getId())
+                                "Driver@NavigationLink", String.format("%s/drivers/%d", host, d.getId())
                         ) : JsonObject.of()).mergeIn(JsonObject.of(
                                 "id", d.getId(),
                                 "name", d.getName()
@@ -1212,4 +1213,23 @@ public class OpenAPIHandler {
                                 )).collect(toList())))).encode()))
                 .onFailure(rc::fail);
     }
+
+    public void unitIdDriversGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        long unitId = Long.parseLong(rc.pathParam("unitId"));
+
+        List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
+        boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
+
+        repo.findDriversByUnitId(unitId)
+                .onSuccess(data -> rc.response().end(new JsonArray(
+                        data.stream().map(d -> (navigationLinks ? JsonObject.of(
+                                "Driver@NavigationLink", String.format("%s/drivers/%d", host, d.getId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "id", d.getId(),
+                                "name", d.getName()
+                        ))).collect(toList())).encode()))
+                .onFailure(rc::fail);
+    }
 }

+ 62 - 0
src/main/resources/openAPISpec.yaml

@@ -386,6 +386,29 @@ paths:
               schema:
                 $ref: '#/components/schemas/Error'
 
+  /units/{unitId}/drivers:
+    get: # done
+      operationId: unitIdDriversGET
+      summary: Publish basic info about drivers who performed actions upon the unit
+      parameters:
+        - $ref: '#/components/parameters/unitIdParam'
+        - $ref: '#/components/parameters/navigationLinksParam'
+      responses:
+        200:
+          description: JSON Array of drivers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/UnitDriverBasicInfo'
+        default:
+          description: unexpected error
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Error'
+
   /sensors:
     get: # done
       operationId: sensorsGET
@@ -848,6 +871,13 @@ paths:
                 $ref: '#/components/schemas/Error'
 
 components:
+
+#  securitySchemes:
+#    ApiKeyAuth:
+#      type: apiKey
+#      in: header
+#      name: Authorization
+
   parameters:
     campaignIdParam:
       in: path
@@ -1832,6 +1862,11 @@ components:
           format: uri
           x-graph-properties:
             linkTo: unitIdCampaignsGET
+        Drivers@NavigationLink:
+          type: string
+          format: uri
+          x-graph-properties:
+            linkTo: unitIdDriversGET
       properties:
         self@NavigationLink:
           $ref: '#/components/schemas/UnitDetailInfo/x-NavigationLinks/self@NavigationLink'
@@ -1839,6 +1874,8 @@ components:
           $ref: '#/components/schemas/UnitDetailInfo/x-NavigationLinks/Sensors@NavigationLink'
         Campaigns@NavigationLink:
           $ref: '#/components/schemas/UnitDetailInfo/x-NavigationLinks/Campaigns@NavigationLink'
+        Drivers@NavigationLink:
+          $ref: '#/components/schemas/UnitDetailInfo/x-NavigationLinks/Drivers@NavigationLink'
         unitId:
           description: Identifier of the unit
           type: integer
@@ -1853,6 +1890,7 @@ components:
         self@NavigationLink: "<domain>/units/25"
         Sensors@NavigationLink: "<domain>/units/25/sensors"
         Campaigns@NavigationLink: "<domain>/units/25/campaigns"
+        Drivers@NavigationLink: "<domain>/units/25/drivers"
         unitId: 25
         name: "Mobile Unit"
         description: "Mobile Unit 25"
@@ -1923,6 +1961,30 @@ components:
         fromTime: "2023-01-25 15:35:32Z"
         toTime: "2023-03-20 10:35:32Z"
 
+    UnitDriverBasicInfo:
+      type: object
+      required:
+        - id
+        - name
+      x-NavigationLinks:
+        Driver@NavigationLink:
+          type: string
+          format: uri
+          x-graph-properties:
+            linkTo: driverIdGET
+      properties:
+        Driver@NavigationLink:
+          $ref: '#/components/schemas/UnitDriverBasicInfo/x-NavigationLinks/Driver@NavigationLink'
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+      example:
+        Driver@NavigationLink: "<domain>/drivers/42"
+        id: 42
+        name: "Steve Smith"
+
     DriverActionUnitBasicInfo:
       type: object
       required: