docs: Add to devlog

This commit is contained in:
2024-06-05 22:52:22 +02:00
parent 9c499d72e0
commit 7f300556cf
12 changed files with 151 additions and 136 deletions

View File

@@ -4,7 +4,7 @@ description:
authors: wessel
categories: school, development, c#, robotica
created: 2024-04-15T18:50:55
updated: 2024-06-04T15:06:23+0100
updated: 2024-06-05T22:49:28+0100
version: 3.1.0
@end
@@ -104,17 +104,20 @@ version: 3.1.0
Om het maken van verschillende endpoints simpel te maken heb ik er uiteindelijk
voor gekozen om een aparte *Router* class te maken, deze class zal alle
requests apart verdelen over een opgegeven `Dictionairy<string, IRoute>`.
** IRoute interface
Om het routen mogelijk te maken, wordt er gebruik gemaakt van een interface.
Dit interface bevat alle mogelijk methodes (GET, POST, PUT, PATCH, etc.) die
een HTTP/1.1 request kan maken. Hierdoor kan een class die gebaseerd is op
dit interface afgehandeld worden door de *Router*.
** Router parsing
Om fouten te voorkomen zal alles wat de Router gebruikt alvast geparsed
worden door `HttpRequest`. Vervolgens zal de Router gebruik maken van de
geparsde routes en methodes (in de vorm van een *enum*). Dit zorgt er voor
dat als er een probleem met het parsen is, deze allemaal centraal verbeterd
kunnen worden.
* [VIII 15-03-2024] Data serialisatie
Er is voor gekozen om JSON te gebruiken om data over de API te versturen.
Daarom heb ik een JSON serialisatie library geschreven die data van en naar
@@ -166,12 +169,15 @@ version: 3.1.0
UML over de duur van het project moet groeien en veranderen. Aangezien ik al
een deel van de API server heb gemaakt, moest ik onthouden wat ik een
terug had gebruikt.
* [XI 01-06-2024] Databse intergratie afgerond
Vandaag heb ik de routes vastgelegd die de *Server API* zal gebruiken.
Ik heb de volgende routes gemaakt:
** GET /api/v1/database/metadata
Deze route laat de metadata van het database zien, hier kwamen geen problemen
naar voren aangezien de code ook maar 3 lijnen lang is.
** GET /api/v1/database
Deze route wordt gebruikt om regels uit het database te vragen.
- In eerste instantie lukte het niet om met een *UUID* een entry te zoeken,
@@ -193,6 +199,7 @@ version: 3.1.0
een valide JSON-object. Uiteindelijk heb ik er voor gekozen om nog een
struct te maken die alle velden van een row bevat, waar vervolgens weer een
array van wordt gemaakt om met `LibParse` om te zetten naar een JSON string.
** POST /api/v1/database
Deze route wordt gebruikt om data in het database in te voeren.
- Deze route was vrij simpel om te implementeren vergeleken met de `GET`
@@ -202,9 +209,11 @@ version: 3.1.0
te genereren, dit heb ik later echter vervangen door de Csharp functie
`Guid.NewGuid()` zodat deze UUID ook weer teruggegeven kan worden aan de
gebruiker na aanmaak van de row.
* [XII 03-06-2024] Database delete route implementeren
Vorige keer was ik vergeten om de `DELETE` route te implementeren, daarom
dat ik er vandaag nog voor heb gekozen om deze te schrijven.
** DELETE /api/v1/database
Deze route verwijdert een entry uit de database.
-- Het eerste gedeelte van deze functie gebruikt het zelfde als de `GET`
@@ -214,12 +223,14 @@ version: 3.1.0
Ook heb ik alle database calls herschreven om gebruik te maken van de
`Prepare()` en `Bind()` statements. Dit voorkomt enige SQL injectie die kan
gebeuren met het gebruik van hard-coded user-input in SQL (CQL) queries.
* [XIII 04-06-2024] Verbinding met de server op de robot
Om te vermijden dat beide robots publiekelijk aanroepbaar moeten zijn,
ben ik ook begonnen om een paar routes te implementeren die de gebruiker
via de server een connectie met de robot geeft (commando's versturen).
Op deze manier hoeft alleen de server exposed te worden naar het internet om
de robot te laten draaien.
** POST /api/v1/control
Via deze endpoint wordt er bepaald door middel van de meegeleverde body wat
er naar de robot wordt gestuurd, de volgende opties zijn mogelijk:
@@ -227,6 +238,7 @@ version: 3.1.0
- `task: start|stop` bepaald wat de robot moet gaan doen
-- `start` Geeft aan dat de robot moet starten met mappen
-- `stop` Geeft aan dat de robot direct moet stoppen met mappen
** Gevonden bug
Tijdens het maken van deze endpoint is er een bug gevonden:
> Als er een extra slash aan het einde van de URL is, wordt hij niet correct
@@ -235,7 +247,62 @@ version: 3.1.0
Dit was een vrij simpele bug, door bij de router aan te geven met een regex
dat de laatste slashes altijd verwijdert mag worden, maar wel handig dat hij
aangepakt is omdat dit best vaak voorkomt.
* [XIV 06-06-2024] WebUI gemaakt in React
Voor het UI gedeelte van de communicatie heb ik er voor gekozen om React te
gebruiken. Dit omdat JavaScript niet puur OOP is, wel OOP geschreven kan worden.
gebruiken. Dit omdat JavaScript niet puur OOP is, maar wel grotendeels OOP
geschreven kan worden.
Het was wel weer even inkomen aangezien ik al ruim een jaar geen React meer
heb gebruikt, maar voor de rest liep het redelijk voortvluchtig. Er waren geen
grote problemen, anders dan degene hieronder vermeld in de server broncode.
** HTML canvas punten tekenen
Een HTML canvas heeft op zichzelf geen functie om een enkel punt te tekenen.
Daarom heb ik uiteindelijk besloten om een `arc` te maken met
de zelfde X en Y-coordinaat als start en eindpunt.
** Het gebruik van querystrings in plaats van bodies
Voor *GET* requests is het gewoontelijk om een querystring (? na de URL)
te gebruiken voor enige zoekparamters in plaats van een megeleverde body.
Hiervoor is de `HttpRequest` class aangepast om tijdens het parsen ook een
`Dictionairy<String, String>` aan te maken met alle desbetreffende
querystrings. Ook is `Route` aangepast om de eventuele querystring te
verwijderen.
** CORS policies
Bij het versturen van requests vanuit de webUI naar de backend kwam er in
eerste instantie een CORS error naar voren. Dit is uiteindelijk gefixt door
een aantal headers toe te voegen die de server naar de client meestuurt.
Ook is de *OPTIONS* endpoint geimplementeert voor endpoints die *POST*
endpoints implementeert, om een *200 OK* status te sturen zodra er een
*POST* request binnenkomt.
@code Csharp
// file: LibServer/LibServer.cs
private void WriteBaseApiHeaders(HttpResponse response) {
...
++response.SetHeader("Access-Control-Allow-Origin", "*");
++response.SetHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
@end
** Bug bij het gaan naar de root (/)
Tijdens het ontwikkelen van het WebUI kwam ik er achter dat als de root URL
wordt gevraagd met een base endpoint dit niet werkt in verband met de extra
hardcoded slash. Dit is gefixt met een simpele ternary statement.
@code Csharp
// file: LibServer/Router/Router.cs
-- if (routePath == Regex.Replace(request.Route, @"\/+$", "")) {
++ var routePath = route.Key.Length > 0 ? $"/{baseURI}/{route.Key}" : $"/{baseURI}";
++ if (routePath == Regex.Replace(request.Route, @"\/+$", "")) {
@end
** Het gebruik van Next.js
Na het ontwikkelen van de UI kwam ik er achter dat `create-react-app`
eigenlijk vervangen is door `create-next-app`, maar in verband met de
nodigheid om de code te herschrijven al wil ik het in Next.js doen heb ik
besloten om voor dit project
* [XIV 06-06-2024] UML diagrammen bijgewerkt
Nu de broncode van de Server en WebUI compleet zijn heb ik de UML diagrammen
bijgewerkt om overeen te komen met de broncode.

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="RD-233.15026.31">
<component name="dataSourceStorageLocal" created-in="RD-241.15989.179">
<data-source name="roommapper@localhost" uuid="469f6bec-f113-4467-9d39-7ac38558045a">
<database-info product="Cassandra" version="3.0.8" jdbc-version="4.2" driver-name="Cassandra JDBC Driver" driver-version="1.4" dbms="CASSANDRA" exact-version="3.0.8" exact-driver-version="1.4">
<identifier-quote-string>&quot;</identifier-quote-string>

View File

@@ -8,86 +8,13 @@
</component>
<component name="ChangeListManager">
<list default="true" id="79f184c3-e88e-45be-9116-5fa813562754" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/../../media/Server/.class-diagram-v1.vpp.lck" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/101.002 y2s2 devlog.norg" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/class-diagram-v1.vpp.bak_001d" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/class-diagram-v1.vpp.bak_002d" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/class-diagram-v1.vpp.bak_003d" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.editorconfig" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.gitattributes" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/CODEOWNERS" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/CODE_OF_CONDUCT.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/COMMIT_CONVENTION.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/CONTRIBUTING.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/FUNDING.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/ISSUE_TEMPLATE/bug_report.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/ISSUE_TEMPLATE/config.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/ISSUE_TEMPLATE/feature_request.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/PULL_REQUEST_TEMPLATE.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/auto_assign.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.github/labels.yml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/LICENSE" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/LICENSES/.gitkeep" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/README.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/src/main.tex" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/src/references.bib" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../media/Server/tex-boilerplate/src/sections/1 introduction.tex" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources.local.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources/469f6bec-f113-4467-9d39-7ac38558045a.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources/469f6bec-f113-4467-9d39-7ac38558045a/storage_v2/_src_/schema/system.L3Icyw.meta" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources/469f6bec-f113-4467-9d39-7ac38558045a/storage_v2/_src_/schema/system_schema.sb0HgQ.meta" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/sqldialects.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/workspace-Helix-3.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Console/JsonClasses/Database.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Console/JsonClasses/RobotControl.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Console/Routes/RouteControl.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/nunit_random_seed.tmp" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/README.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/package.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/pnpm-lock.yaml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/components/controlField.jsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/components/layout.jsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/components/mapCanvas.jsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/constants.jsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/index.jsx" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../Web/src/scss/index.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../../media/Server/class-diagram-v1.vpp" beforeDir="false" afterPath="$PROJECT_DIR$/../../media/Server/class-diagram-v1.vpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources.local.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/dataSources.local.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.REST API/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/Program.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Console/Program.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/Routes/RouteDatabase.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Console/Routes/RouteDatabase.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.exe" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.exe" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibParse.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibParse.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibParse.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibParse.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibServer.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibServer.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibServer.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Console/bin/Debug/net8.0/LibServer.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibParse/bin/Debug/net8.0/LibParse.dll" beforeDir="false" afterPath="$PROJECT_DIR$/LibParse/bin/Debug/net8.0/LibParse.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibParse/bin/Debug/net8.0/LibParse.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/LibParse/bin/Debug/net8.0/LibParse.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibServer/Http/Request.cs" beforeDir="false" afterPath="$PROJECT_DIR$/LibServer/Http/Request.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibServer/LibServer.cs" beforeDir="false" afterPath="$PROJECT_DIR$/LibServer/LibServer.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibServer/Router/Router.cs" beforeDir="false" afterPath="$PROJECT_DIR$/LibServer/Router/Router.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibServer/bin/Debug/net8.0/LibServer.dll" beforeDir="false" afterPath="$PROJECT_DIR$/LibServer/bin/Debug/net8.0/LibServer.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/LibServer/bin/Debug/net8.0/LibServer.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/LibServer/bin/Debug/net8.0/LibServer.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/Controller.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/Route.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/RoutePlanner.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/RoutePlanner.sln" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/Routepoint.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/RoutePlanner/Routing.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/CoverletSourceRootsMapping_Tests" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/CoverletSourceRootsMapping_Tests" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibHttp.dll" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibHttp.pdb" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibParse.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibParse.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibParse.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibParse.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibServer.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibServer.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibServer.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/LibServer.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.deps.json" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.deps.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.dll" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.dll" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.pdb" beforeDir="false" afterPath="$PROJECT_DIR$/Tests/bin/Debug/net8.0/Tests.pdb" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../Web/public/favicon.ico" beforeDir="false" afterPath="$PROJECT_DIR$/../Web/public/favicon.ico" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../Web/public/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/../Web/public/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../Web/src/components/controlField.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/../Web/src/components/controlField.jsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../Web/src/components/layout.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/../Web/src/components/layout.jsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../Web/src/components/mapCanvas.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/../Web/src/components/mapCanvas.jsx" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -101,8 +28,11 @@
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../.." />
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/DecompilerCache/decompiler/badd9f1ae21b4aca8bf508afe8082ef610ea00/6f/44cb9529/Metadata.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Console/Program.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/LibCassandra/Class1.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/LibServer/LibServer.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/LibServer/Router/Route.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/LibServer/Router/Router.cs" root0="FORCE_HIGHLIGHTING" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 4
@@ -112,34 +42,34 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;.NET Project.Console.executor&quot;: &quot;Run&quot;,
&quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;d452b4e4-aa15-4fa9-847f-33d4d7fab23d.executor&quot;: &quot;Run&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;,
&quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;HotReloadSettingsPage&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Project.Console.executor": "Run",
"ASKED_ADD_EXTERNAL_FILES": "true",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"d452b4e4-aa15-4fa9-847f-33d4d7fab23d.executor": "Run",
"git-widget-placeholder": "master",
"ignore.virus.scanning.warn.message": "true",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "HotReloadSettingsPage",
"vue.rearranger.settings.migration": "true"
},
&quot;keyToStringList&quot;: {
&quot;DatabaseDriversLRU&quot;: [
&quot;cassandra&quot;
"keyToStringList": {
"DatabaseDriversLRU": [
"cassandra"
],
&quot;rider.external.source.directories&quot;: [
&quot;C:\\Users\\Wessel\\AppData\\Roaming\\JetBrains\\Rider2023.3\\resharper-host\\DecompilerCache&quot;,
&quot;C:\\Users\\Wessel\\AppData\\Roaming\\JetBrains\\Rider2023.3\\resharper-host\\SourcesCache&quot;,
&quot;C:\\Users\\Wessel\\AppData\\Local\\Symbols\\src&quot;
"rider.external.source.directories": [
"/home/wessel/.config/JetBrains/Rider2024.1/resharper-host/DecompilerCache",
"/home/wessel/.config/JetBrains/Rider2024.1/resharper-host/SourcesCache",
"/home/wessel/.local/share/Symbols/src"
]
}
}</component>
}]]></component>
<component name="RunManager">
<configuration name="Console" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/Console/bin/Debug/net8.0/Console.exe" />
@@ -187,6 +117,7 @@
<workItem from="1716929117644" duration="174000" />
<workItem from="1717492595765" duration="6218000" />
<workItem from="1717584416884" duration="5757000" />
<workItem from="1717602912720" duration="1420000" />
</task>
<servers />
</component>

View File

@@ -10,8 +10,7 @@ namespace Console.Routes;
public class RouteControl: IRoute {
Dictionary<string, Dictionary<string, string>> _routes = new() {
{
"roomba",
new() {
"roomba", new() {
{
"start", "127.0.0.1:5000/api/v1/database/metadata"
},
@@ -31,7 +30,7 @@ public class RouteControl: IRoute {
switch (data.task) {
case "start":
SendHttpRequest(_routes["roomba"]["start"], "yeyeyeyeyeyeyeyyeeye", "POST", "/tt");
SendHttpRequest(_routes["roomba"]["start"], "", "POST", "/start");
return new HttpResponse("{\"message\": \"roomba started\"}");
case "stop":
SendHttpRequest(_routes["roomba"]["stop"], "", "POST", "/stop");
@@ -50,16 +49,19 @@ public class RouteControl: IRoute {
return response;
}
public void SendHttpRequest(string Host, string body, string method, string route)
{
using (TcpClient client = new TcpClient())
{
// split _host into address:port
public HttpResponse Options(HttpRequest request) {
var response = new HttpResponse("{\"message\": \"options\"}");
response.Headers.Add("Allow", "GET, POST, OPTIONS");
return response;
}
// @todo(wessel): Rewrite, move to other class
public void SendHttpRequest(string Host, string body, string method, string route) {
using (TcpClient client = new TcpClient()) {
string[] host = Host.Split(":");
client.Connect(host[0], int.Parse(host[1].Split("/")[0]));
using (NetworkStream stream = client.GetStream())
{
using (NetworkStream stream = client.GetStream()) {
string httpRequestMessage = $"{method} {route} HTTP/1.1\r\n" +
$"Host: {Host}\r\n" +
$"Content-Length: {body.Length}\r\n" +
@@ -72,13 +74,6 @@ public class RouteControl: IRoute {
stream.Flush();
}
}
System.Console.WriteLine("Request sent");
}
public HttpResponse Options(HttpRequest request) {
var response = new HttpResponse("{\"message\": \"options\"}");
response.Headers.Add("Allow", "GET, POST, OPTIONS");
return response;
}
}

View File

@@ -1,4 +1,4 @@
namespace LibServer.Http;
namespace LibServer.Http;
public class HttpRequest {
private const string LogPrefix = "\u001b[47m[ WWW ]\u001b[0m";

View File

@@ -1,4 +1,4 @@
namespace LibServer.Router;
namespace LibServer.Router;
using Http;
using System.Text.RegularExpressions;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -24,7 +24,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
<title>Roommapper</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>

View File

@@ -37,7 +37,8 @@ export default class ControlField extends React.Component {
body: JSON.stringify({ task: task })
})
.then(response => response.json())
.then(data => this.setState({ result: JSON.stringify(data) }))
.then(data => this.setState({
result: data.message ? data.message : JSON.stringify(data) }))
.catch(this.handleError);
}
@@ -45,9 +46,24 @@ export default class ControlField extends React.Component {
return (
<div className='control'>
<div className='control-buttons'>
<Button type='primary' onClick={() => this.handleClick(tasks.START)}>Start</Button>
<Button type='primary' onClick={() => this.handleClick(tasks.MAP)}>Map</Button>
<Button type='primary' danger onClick={() => this.handleClick(tasks.STOP)}>Stop</Button>
<Button
type='primary'
onClick={() => this.handleClick(tasks.START)}
>
Start
</Button>
<Button
type='primary'
onClick={() => this.handleClick(tasks.MAP)}
>
Map
</Button>
<Button
type='primary' danger
onClick={() => this.handleClick(tasks.STOP)}
>
Stop
</Button>
</div>
<Card
className='output-field'

View File

@@ -34,11 +34,16 @@ const App = () => {
}}
theme='dark'
>
<Menu theme="dark" mode="inline" defaultSelectedKeys={['map']} items={menuItems} />
<Menu
theme="dark"
mode="inline"
defaultSelectedKeys={['map']}
items={menuItems}
/>
</Sider>
<Layout
theme='dark'
style={{ marginLeft: 200 }}
theme='dark'
style={{ marginLeft: 200 }}
>
<Content
style={{ margin: '24px 16px 0', overflow: 'initial' }}

View File

@@ -33,7 +33,7 @@ export default class MapCanvas extends React.Component {
this.draw();
}
async getLinePoints(search = 'id', field = '8a97354d-d4ac-43c6-8b32-528cc24e3ede') {
async getLinePoints() {
try {
const { searchOption, inputValue } = this.state;
const url = `${API_ENDPOINT}/database?${searchOption}=${inputValue}`;

View File

@@ -16,7 +16,8 @@
}
.map-canvas {
border: 1px solid red;
border: 2px solid #008080;
border-radius: 4px;
}
.map-choice {