From 564d3ee9d2d48e0010efb15e5a179ae824d66a9e Mon Sep 17 00:00:00 2001 From: ARNik Date: Wed, 2 Oct 2024 10:53:03 +0300 Subject: [PATCH] Initial commit --- ...Access Production.postman_environment.json | 21 + Smart Lift Access.postman_collection.json | 943 ++++++++++++++++++ WebSocket-ClientMessages.md | 31 + WebSocket-ControllerMessages.md | 129 +++ WebSocket.md | 55 + 5 files changed, 1179 insertions(+) create mode 100644 Smart Lift Access Production.postman_environment.json create mode 100644 Smart Lift Access.postman_collection.json create mode 100644 WebSocket-ClientMessages.md create mode 100644 WebSocket-ControllerMessages.md create mode 100644 WebSocket.md diff --git a/Smart Lift Access Production.postman_environment.json b/Smart Lift Access Production.postman_environment.json new file mode 100644 index 0000000..37ee6e9 --- /dev/null +++ b/Smart Lift Access Production.postman_environment.json @@ -0,0 +1,21 @@ +{ + "id": "6aa0ecde-17c7-4621-94f8-bfb1561431af", + "name": "Smart Lift Access Production", + "values": [ + { + "key": "base_url", + "value": "https://api.smartelevator.ru", + "type": "default", + "enabled": true + }, + { + "key": "base_api_url", + "value": "https://api.smartelevator.ru/api/v1", + "type": "default", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2024-10-02T07:25:49.949Z", + "_postman_exported_using": "Postman/11.15.0" +} \ No newline at end of file diff --git a/Smart Lift Access.postman_collection.json b/Smart Lift Access.postman_collection.json new file mode 100644 index 0000000..f37172c --- /dev/null +++ b/Smart Lift Access.postman_collection.json @@ -0,0 +1,943 @@ +{ + "info": { + "_postman_id": "24ed5c75-9fbc-4910-9c07-4b9d55e26d5f", + "name": "Smart Lift Access", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "2286120" + }, + "item": [ + { + "name": "Controller", + "item": [ + { + "name": "Read Config", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{controller_api_key}}" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me/groups", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups" + ] + }, + "description": "Чтение текущей конфигурации группы лифтов" + }, + "response": [] + }, + { + "name": "Upload Config", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{controller_api_key}}" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Accept-Encoding", + "value": "gzip" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"lifts\": [\n {\n \"allowed\": [\n -5,\n -4,\n -3,\n -2,\n -1,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22\n ],\n \"tech\": [\n 10,\n 20\n ],\n \"id\": \"QW123450\",\n \"vip\": [\n 23\n ],\n \"type\": \"CARGO\",\n \"name\": \"Большой грузовой лифт\",\n \"lobby\": [\n 0\n ]\n },\n {\n \"allowed\": [\n -5,\n -4,\n -3,\n -2,\n -1,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22\n ],\n \"tech\": [\n 10,\n 20\n ],\n \"id\": \"QW123451\",\n \"vip\": [\n 23\n ],\n \"type\": \"CARGO\",\n \"name\": \"Большой грузовой лифт\",\n \"lobby\": [\n 0\n ]\n },\n {\n \"allowed\": [\n -5,\n -4,\n -3,\n -2,\n -1,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22\n ],\n \"tech\": [\n 10,\n 20\n ],\n \"id\": \"QW123452\",\n \"vip\": [\n 23\n ],\n \"type\": \"CARGO\",\n \"name\": \"Большой грузовой лифт\",\n \"lobby\": [\n 0\n ]\n },\n {\n \"allowed\": [\n -5,\n -4,\n -3,\n -2,\n -1,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22\n ],\n \"tech\": [\n 10,\n 20\n ],\n \"id\": \"QW123453\",\n \"vip\": [\n 23\n ],\n \"type\": \"CARGO\",\n \"name\": \"Большой грузовой лифт\",\n \"lobby\": [\n 0\n ]\n }\n ],\n \"readers\": [\n {\n \"id\": \"reader1\",\n \"name\": \"Считыватель в кабине большого грузового лифта\",\n \"location\": \"CABIN\",\n \"lift_id\": \"QW123450\"\n },\n {\n \"id\": \"reader2\",\n \"name\": \"Считыватель в холе\",\n \"location\": \"LOBBY\"\n },\n {\n \"id\": \"reader3\",\n \"name\": \"Считыватель на парковке\",\n \"location\": \"PARKING\"\n }\n ]\n}" + }, + "url": { + "raw": "{{base_url}}/controller/config", + "host": [ + "{{base_url}}" + ], + "path": [ + "controller", + "config" + ] + }, + "description": "Загружает кофигурацию группы лифтов на сервер. Конфигурация перезаписывается." + }, + "response": [] + } + ] + }, + { + "name": "Objects", + "item": [ + { + "name": "Images", + "item": [ + { + "name": "Upload Image", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "multipart/form-data" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "image", + "type": "file", + "src": [] + } + ] + }, + "url": { + "raw": "{{base_api_url}}/objects/36DCD807-43CE-467B-869D-1EBA9502B3A8/image", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects", + "36DCD807-43CE-467B-869D-1EBA9502B3A8", + "image" + ] + }, + "description": "Загрузка изображения для объекта. \nMultipart\nОбязательный параметр image\nContent-Type: image/jpeg\nМаксимальный размер изображения 1Мб\nПоддерживается только jpg" + }, + "response": [] + }, + { + "name": "Get Image", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/objects/7C733991-1E73-4532-A444-30217E8EFD16/image?width=300", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects", + "7C733991-1E73-4532-A444-30217E8EFD16", + "image" + ], + "query": [ + { + "key": "width", + "value": "300", + "description": "Изменяет размер изображения, учитывая соотношение сторон" + } + ] + }, + "description": "Картинка объекта\nПоддерживается изменения размера. Для именения размера оригинального размера необходимо указать параметр width" + }, + "response": [] + } + ] + }, + { + "name": "Object List", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/objects", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects" + ] + }, + "description": "Возвращает список всех объектов, зарегистрированных в системе, с групами и лифтами.\nЕсли текущий пользователь является администратором, то для каждой группы возвращается список считывателей\nПример ответа:\n`\n[\n {\n \"id\": \"6AED41C9-A355-46A5-9C1B-41079E25176E\",\n \"name\": \"Тестовый объект 1\"\n \"address\": \"Адрес тестового объекта 1\",\n // Список групп лифтов на объекте\n \"groups\": [\n {\n \"id\": \"BC3DD872-54B5-4090-8735-1FC729C3E43E\",\n \"name\": \"Подъезд №7\",\n // Список лифтов в группе\n \"lifts\": [\n {\n \"id\": \"XO-CRG-1\",\n \"name\": \"3\",\n // Тип лифта. Возможные значения:\n // - UNIVERSAL\n // - PASSENGER\n // - CARGO\n \"type\": \"CARGO\",\n \"allowed\": [ 1, 2, 3, 4, 6],\n \"lobby\": [ 1, -1, -2 ],\n \"tech\": [ 5 ],\n \"vip\": []\n },\n // Список считывателей. Возвращается только если текущий пользователь является авминистратором\n \"readers\": [\n {\n \"name\": \"В холле\",\n \"id\": \"r1\",\n \"floor\": 1,\n // Место установки считывателя. Возможные значения:\n // Возмжные значения:\n // - ENTRANCE\n // - PARKING\n // - LOBBY\n // - CABIN\n // Если указан тип CABIN поле lift_id должно быть не null\n \"location\": \"LOBBY\"\n },\n {\n \"id\": \"r4\",\n \"name\": \"Лифт 1\",\n \"location\": \"CABIN\",\n // Обязательное поле, если location == CABIN\n \"lift_id\": \"XO-UNI-1\"\n }\n ]\n }\n ]\n }\n]\n`" + }, + "response": [] + }, + { + "name": "Get Object By Id", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/objects/6AED41C9-A355-46A5-9C1B-41079E25176E", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects", + "6AED41C9-A355-46A5-9C1B-41079E25176E" + ] + }, + "description": "Возвращает список всех объектов, зарегистрированных в системе." + }, + "response": [] + }, + { + "name": "Create Object", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"\\u0422\\u0435\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043e\\u0431\\u044a\\u0435\\u043a\\u0442 98\",\"address\":\"\\u0410\\u0434\\u0440\\u0435\\u0441\\u0441 \\u0442\\u0435\\u0441\\u0442\\u043e\\u0432\\u043e\\u0433\\u043e \\u043e\\u0431\\u044a\\u0435\\u043a\\u0442\\u0430 98\"}" + }, + "url": { + "raw": "{{base_api_url}}/objects", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects" + ] + }, + "description": "Создание объекта" + }, + "response": [] + }, + { + "name": "Modify Object", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"\\u0422\\u0435\\u0441\\u0442\\u043e\\u0432\\u044b\\u0439 \\u043e\\u0431\\u044a\\u0435\\u043a\\u0442 99\",\"address\":\"\\u0410\\u0434\\u0440\\u0435\\u0441\\u0441 \\u0442\\u0435\\u0441\\u0442\\u043e\\u0432\\u043e\\u0433\\u043e \\u043e\\u0431\\u044a\\u0435\\u043a\\u0442\\u0430 99\"}" + }, + "url": { + "raw": "{{base_api_url}}/objects/6AED41C9-A355-46A5-9C1B-41079E25176E", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "objects", + "6AED41C9-A355-46A5-9C1B-41079E25176E" + ] + }, + "description": "Редактрование объекта" + }, + "response": [] + } + ] + }, + { + "name": "Auth", + "item": [ + { + "name": "Send Code", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\"phone\":\"+79037602666\"}" + }, + "url": { + "raw": "{{base_url}}/auth/v1/code", + "host": [ + "{{base_url}}" + ], + "path": [ + "auth", + "v1", + "code" + ] + }, + "description": "Отправляет СМС с одноразовым паролем на указанный номер телефона. В ответе возвращается время, до которого пароль действует. \nЕсли время действия предыдущего пароля еще не закончилось, то новый пароль не отправляется и в ответе возвращается время действия текущего пароля. \nНомер телефона должен быть в международном формате (начинаться с +)" + }, + "response": [] + }, + { + "name": "Login", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"phone\": \"+79037602666\",\n \"code\": \"184163\"\n}" + }, + "url": { + "raw": "{{base_url}}/auth/v1/token", + "host": [ + "{{base_url}}" + ], + "path": [ + "auth", + "v1", + "token" + ] + }, + "description": "Вход в систему по номеру телефона и одноразовому паролю.\nВ ответе возвращает:\n- access_token: Токен используется для авторизации запросов к API путем передачи заголовкa\n\"Authorization: Bearer access_token\". \n- expires_at: Время до которого действителен access_token \n- refresh_token: Токен для обновления access_token после того как истечет его время действия" + }, + "response": [] + }, + { + "name": "Refresh Token", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\"refresh_token\":\"Yl4qV8/q7NVEcxh9bxnaF8wygw5f7tOXFBhDDHEdlqQ=\"}" + }, + "url": { + "raw": "{{base_url}}/auth/v1/token/refresh", + "host": [ + "{{base_url}}" + ], + "path": [ + "auth", + "v1", + "token", + "refresh" + ] + }, + "description": "Обновление токенов. В запросе надо передать refresh_token, если токен валиден то возвращается новые access и refresh токены. Если токен был отозван то вернется 401 ошибка.\nВ ответе возвращает:\n- access_token: Токен используется для авторизации запросов к API путем передачи заголовкa\n\"Authorization: Bearer access_token\". \n- expires_at: Время до которого действителен access_token \n- refresh_token: Токен для обновления access_token после того как истечет его время действия" + }, + "response": [] + } + ] + }, + { + "name": "Users", + "item": [ + { + "name": "Group Access", + "item": [ + { + "name": "Group Access List", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me/groups", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups" + ] + }, + "description": "Возвращает список групп к которым у пользователя есть доступ. Если текщий пользователь является администратором, то он может делать запрос для любого пользователя" + }, + "response": [] + }, + { + "name": "Grant Group Access", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"group_id\":\"BC3DD872-54B5-4090-8735-1FC729C3E43E\",\"preferred_lift_id\":\"QW12345\",\"preferred_floor\":0,\"lobby_floor\":0}" + }, + "url": { + "raw": "{{base_api_url}}/users/me/groups", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups" + ] + }, + "description": "Привязать группу к пользователяю.\nАдминистратор может привязывать группы для любого пользователя.\n" + }, + "response": [] + }, + { + "name": "Modify Group Access", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"preferred_lift_id\": \"qwer\",\n \"preferred_floor\": 123,\n \"lobby_floor\": 999\n}" + }, + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17" + ] + }, + "description": "Изменение параметров доступа к группе" + }, + "response": [] + }, + { + "name": "Send Command", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"cmd\":\"call\",\"data\":{\"floor\":\"1\"}}" + }, + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17/command", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "command" + ] + }, + "description": "Отправить команду группе лифтов.\n```\n{\n \"cmd\": \"call\",\n \"data\": {\n \"floor\": 1\n }\n}\n\n```" + }, + "response": [] + }, + { + "name": "Delete Group Access", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me/groups/BC3DD872-54B5-4090-8735-1FC729C3E43E", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "BC3DD872-54B5-4090-8735-1FC729C3E43E" + ] + }, + "description": "Отозвать доступ пользователя к группе\nАмининистратор может отзывать доступ у любого пользователя" + }, + "response": [] + } + ] + }, + { + "name": "Presets", + "item": [ + { + "name": "Get Group Floor Presets List", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17/presets", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "presets" + ] + }, + "description": "Возвращает список предустановленных этажей для группы. Возвращаются как общие этажи так и пользовательские" + }, + "response": [] + }, + { + "name": "Delete Floor Preset", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17/presets/988CA5E3-7982-4F9B-9A96-1F54FB61B8C4", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "presets", + "988CA5E3-7982-4F9B-9A96-1F54FB61B8C4" + ] + }, + "description": "Возвращает список групп к которым у пользователя есть доступ. Если текщий пользователь является администратором, то он может делать запрос для любого пользователя" + }, + "response": [] + }, + { + "name": "Create Floor Preset", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"\\u0411\\u0430\\u0441\\u0441\\u0435\\u0439\\u043d \\u043d\\u0430 \\u043a\\u0440\\u044b\\u0448\\u0435\",\"floor\":100}" + }, + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17/presets", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "presets" + ] + }, + "description": "Возвращает список групп к которым у пользователя есть доступ. Если текщий пользователь является администратором, то он может делать запрос для любого пользователя" + }, + "response": [] + }, + { + "name": "Modify Floor Preset", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"\\u0411\\u0430\\u0441\\u0441\\u0435\\u0439\\u043d \\u043d\\u0430 \\u043a\\u0440\\u044b\\u0448\\u0435\",\"floor\":100}" + }, + "url": { + "raw": "{{base_api_url}}/users/me/groups/893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17/presets", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me", + "groups", + "893995CF-6DAC-4A6E-83CE-3DDC2FC1EB17", + "presets" + ] + }, + "description": "Возвращает список групп к которым у пользователя есть доступ. Если текщий пользователь является администратором, то он может делать запрос для любого пользователя" + }, + "response": [] + } + ] + }, + { + "name": "Create User", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"Имя Пользователя\",\"phone\":\"+79037602667\",\"is_phone_confirmed\":false,\"is_active\":false,\"is_admin\":true}" + }, + "url": { + "raw": "{{base_api_url}}/users", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users" + ] + }, + "description": "Создание пользователя. Нужны права администратора." + }, + "response": [] + }, + { + "name": "Modify User", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\"name\":\"\\u0418\\u043c\\u044f \\u041f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}" + }, + "url": { + "raw": "{{base_api_url}}/users/me", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me" + ] + }, + "description": "Изменения данных пользователя. Нужны права администратора, кроме случая когда указан user_id текущего пользователя" + }, + "response": [] + }, + { + "name": "User List", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users?page=1&per=10", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users" + ], + "query": [ + { + "key": "page", + "value": "1", + "description": "Страница которую надо вернуть. Первая страница 1" + }, + { + "key": "per", + "value": "10", + "description": "Кол-во записей на странице" + } + ] + }, + "description": "Список пользователей с пагинацией. Нужны права администратора" + }, + "response": [] + }, + { + "name": "Get User", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me" + ] + }, + "description": "Пользователь" + }, + "response": [] + }, + { + "name": "Get Сurrent User", + "protocolProfileBehavior": { + "followRedirects": false, + "followOriginalHttpMethod": false, + "followAuthorizationHeader": false + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{access_token}}" + } + ], + "url": { + "raw": "{{base_api_url}}/users/me", + "host": [ + "{{base_api_url}}" + ], + "path": [ + "users", + "me" + ] + }, + "description": "Пользователь" + }, + "response": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/WebSocket-ClientMessages.md b/WebSocket-ClientMessages.md new file mode 100644 index 0000000..7287917 --- /dev/null +++ b/WebSocket-ClientMessages.md @@ -0,0 +1,31 @@ +# Сообщения клиента + +## Исходящие (сервер->клиент) + +### state + +- **type** - `state` + +- **data** - Не *null + + ```javascript + { + // Идентификатор лифта + "lift_id": "XO-CRG-3", + // Состояние кабины лифта + // Возможные варианты: + // * STOPPED - лифт стоит + // * MOVE_UP - лифт поднимается + // * MOVE_DOWN - лифт опускается + "car_state": "MOVE_UP", + // Состояние дверей лифта + // Возможные варианты: + // * DOOR_OPENING + // * DOOR_OPENED + // * DOOR_CLOSING + // * DOOR_CLOSED + "door_state": "DOOR_CLOSED", + // Этаж на котором находится лифт + "floor": -1 + } + ``` diff --git a/WebSocket-ControllerMessages.md b/WebSocket-ControllerMessages.md new file mode 100644 index 0000000..88da8af --- /dev/null +++ b/WebSocket-ControllerMessages.md @@ -0,0 +1,129 @@ +# Сообщения контролера + +## Входящие (контроллер->сервер) + +### config + ++ **type** - ```config``` + ++ **data** - Не *null* + + ```javascript + { + // Список лифтов + "lifts": + [ + { + "id": "QW12345", + "name": "Большой грузовой лифт", + // Тип лифта. Может быть одним из следующих значений + // - UNIVERSAL + // - PASSENGER + // - CARGO + "type": "CARGO", + // Этажи, на которорых лифт может останавливаться + "allowed": + [ + -5,-4,-3,-2,-1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10,11,12,13,14,15,16,17,18,19, + 20,21,22 + ], + "vip": [23], + "lobby": [0], + "tech": [10, 20] + } + ], + // Список считывателей установленных в группе + "readers": + [ + { + // Идентификатор считывателя (уникальный для группы) + "id": "reader1", + // Название + "name": "Считыватель в кабине большого грузового лифта", + // Расположение считывателя + // Возмжные значения: + // - ENTRANCE + // - PARKING + // - LOBBY + // - CABIN + // Если указан тип CABIN поле lift_id должно быть не null + "location": "CABIN", + // Идентификатор лифта, в котором установлен считыватель + // Значение должно соответствовать одному из значений в списке лифтов + "lift_id": "QW12345" + }, + { + "id": "reader2", + "name": "Считыватель в холе", + "location": "HALL" + }, + { + "id": "reader3", + "name": "Считыватель на парковке", + "location": "PARKING" + } + ] + } + ``` + +## Исходяшие (сервер->контроллер) + +### cmd + +- **type** - `cmd` + +- **data** - Не *null* + + ```javascript + { + // Команда + // В данный момент call единственная поддерживаемая команда + // Вызывает лифт на указанный этаж + "cmd": "call", + // String, Обязательный параметр + // Идентификатор предпочитаемого лифта + "lift_id": "" + // Int, Обязательный параметр + // Этаж на который необходимо вызвать лифт + "floor": 1, + // UUID, Обязательный параметр + // Идентификатор пользователя вызывающего лифт + "user_id": "" + } + ``` + +### users + +Сервер присылает сообщение сразу после подключения, а так же каждый раз при измении списка пользователей, имееющих доступ к данной группе лифтов + +- **type** - `cmd` + +- **data** - Не *null*. Cписок пользователей, имеющих доступ к данной группе лифтов + + ```javascript + [ + { + // Идентификатор пользователя, + // используется для идентификации пользователя считывателем + // UUID, обязательный параметр + "user_id": "", + // Идентификатор предпочитаемого лифта + // String, не обязательный параметр + "favorite_lift": "QW12345", + // Домашний этаж пользователя + // Int, не обязательный параметр + "home_floor": 1, + // Предпочитаемый этаж лобби + // Int, не обязательный параметр + "lobby_floor": 0 + }, + { + "user_id": "" + "favorite_lift": "QW12345", + "home_floor": 4, + "lobby_floor": 0, + } + ] + ``` diff --git a/WebSocket.md b/WebSocket.md new file mode 100644 index 0000000..4f3d1b6 --- /dev/null +++ b/WebSocket.md @@ -0,0 +1,55 @@ +# WebSocket + +## Подключение + +Сервер предоставляет 2 url для подключения к WebSocket: + ++ Для контроллера группы лифтов + ```wss://{base_url}/ws/v1/controller``` ++ Для клиентских приложений + ```wss://{base_url}/ws/v1/client``` + +## Передача данных + +Передача данных происходит путем отправки бинарных сообщений. Сообщение представляет из себя *json* следующей структуры: + +```javascript +{ + // Идентификатор типа сообщения + "type": "auth", + // Данные соответствующие типу сообщения + // !!!Формат данных различен для сообщений с одинаковым типом на разных url + "data": "token" +} +``` + +:boom: Внимание!!! +Формат данных различен для сообщений с одинаковым типом на разных [url](#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5), кроме сообщения [auth](#%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F) + +* [Описание сообщений контроллера](./WebSocket-ControllerMessages.md) +* [Описание сообщений клиента](./WebSocket-ClientMessages.md) + +## Авторизация + +Авторизация происходит путем отправки сообщения [auth](#auth) сразу после установки соединения. Если сервер не получает сообщение в течении **10** сек после подключения, то соединение закрывается. Так же соединение закрывается, если первое сообщение после соединения не соответствует формату сообщения [auth](#auth). Все последующие отправки данного сообщения игнорируются. + +```javascript +{ + // Тип сообщения + "type": "auth", + // Для контроллера *api_key*, созданный при добавлении группы в БД + // Для клиента *access_token*, полученный после авторизации. + "data": "" +} +``` + +При успешной авторизации сервер присылает сообщение: + +```javascript +{ + "type": "auth", + "data": true +} +``` + +При неуспешной авторизации соединение закрывается c кодом закрытия **1008**