From a86775f17ad25cb4d565376c79726bebba41190f Mon Sep 17 00:00:00 2001 From: Andryss Date: Wed, 22 May 2024 16:54:20 +0300 Subject: [PATCH] Add extended architecture --- doc/SWAGGER.md | 99 +++++++++++++----- doc/arch_ext.png | Bin 0 -> 26061 bytes .../kotlin/org/vivlaniv/nexohub/Scenario.kt | 3 + 3 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 doc/arch_ext.png diff --git a/doc/SWAGGER.md b/doc/SWAGGER.md index 6cf517b..7b8f849 100644 --- a/doc/SWAGGER.md +++ b/doc/SWAGGER.md @@ -2,70 +2,67 @@ [ConnectionTask](../common/src/main/kotlin/org/vivlaniv/nexohub/ConnectionTask.kt) -## $user/fetch/devices +## $user/signin -### /in FetchSavedDevicesTask +### /in AuthUserTask ```json lines { - "id": String + "id": String, + "username": String, + "password": String } ``` -### /out FetchSavedDevicesTaskResult +### /out AuthUserTaskResult ```json lines { - "tid": String, + "id": String, "code": Int, "errorMessage": String?, - "devices": List? + "token": String } ``` -## $user/property +## $user/signup -### /in PutDevicePropertyTask +### /in RegisterUserTask ```json lines { "id": String, - "device": String, - "property": String, - "value": Int + "username": String, + "password": String } ``` -### /out PutDevicePropertyTaskResult +### /out RegisterUserTaskResult ```json lines { - "tid": String, + "id": String, "code": Int, - "errorMessage": String?, - "device": String, + "errorMessage": String? } ``` -## $user/fetch/props +## $user/search -### /in FetchDevicesPropertiesTask +### /in SearchDevicesTask ```json lines { - "id": String, - "include": List?, + "id": String } ``` -### /out FetchDevicesPropertiesTaskResult +### /out SearchDevicesTaskResult ```json lines { "tid": String, - "code": Int, - "errorMessage": String?, - "properties": Map>? + "devices": List } ``` @@ -92,9 +89,9 @@ } ``` -## $user/search +## $user/fetch/devices -### /in SearchDevicesTask +### /in FetchSavedDevicesTask ```json lines { @@ -102,11 +99,59 @@ } ``` -### /out SearchDevicesTaskResult +### /out FetchSavedDevicesTaskResult ```json lines { "tid": String, - "devices": List + "code": Int, + "errorMessage": String?, + "devices": List? +} +``` + +## $user/fetch/props + +### /in FetchDevicesPropertiesTask + +```json lines +{ + "id": String, + "include": List?, +} +``` + +### /out FetchDevicesPropertiesTaskResult + +```json lines +{ + "tid": String, + "code": Int, + "errorMessage": String?, + "properties": Map>? +} +``` + +## $user/property + +### /in PutDevicePropertyTask + +```json lines +{ + "id": String, + "device": String, + "property": String, + "value": Int +} +``` + +### /out PutDevicePropertyTaskResult + +```json lines +{ + "tid": String, + "code": Int, + "errorMessage": String?, + "device": String, } ``` diff --git a/doc/arch_ext.png b/doc/arch_ext.png new file mode 100644 index 0000000000000000000000000000000000000000..358fb72a1d1b2687b5a4e48ffaa7560409467d88 GIT binary patch literal 26061 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