From 013ee2800381927123c21def62c253e2beb8f30c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 25 Nov 2021 16:55:26 +0800 Subject: [PATCH 001/117] updated README --- myems-aggregation/README.md | 68 ++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/myems-aggregation/README.md b/myems-aggregation/README.md index e0e3a1aa..ad548087 100644 --- a/myems-aggregation/README.md +++ b/myems-aggregation/README.md @@ -52,34 +52,74 @@ docker run -d --restart always --name myems-aggregation myems/myems-aggregation --name Assign a name to the container -### Option 2: Install myems-aggregation on Ubuntu Server (bare-metal or virtual machine) -In this section, you will install myems-aggregation on Ubuntu Server. +### Option 2: Online install myems-aggregation on Ubuntu Server with internet access -Download and install MySQL Connector: +In this section, you will install myems-aggregation on Ubuntu Server with internet access. + +```bash +cd ~ +git clone https://github.com/MyEMS/myems.git +cd myems +git checkout master (or the latest release tag) +cd myems-aggregation +pip install -r requirements.txt +cp -r ~/myems/myems-aggregation /myems-aggregation +``` +Copy exmaple.env file to .env and modify the .env file: +```bash +cp /myems-aggregation/example.env /myems-aggregation/.env +nano /myems-aggregation/.env +``` +Setup systemd service: +```bash +cp myems-aggregation.service /lib/systemd/system/ +``` +Enable the service: +```bash +systemctl enable myems-aggregation.service +``` +Start the service: +```bash +systemctl start myems-aggregation.service +``` +Monitor the service: +```bash +systemctl status myems-aggregation.service +``` +View the log: +```bash +cat /myems-aggregation.log +``` + +### Option 3: Offline install myems-aggregation on Ubuntu Server without internet access + +In this section, you will install myems-aggregation on Ubuntu Server without internet access. + +Download on any server with internet access: ```bash cd ~/tools wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz +git clone https://github.com/henriquebastos/python-decouple.git +cd ~ +git clone https://github.com/MyEMS/myems.git +``` + +Copy files to the server without internet access and install prerequisites: +```bash +cd ~/tools tar xzf mysql-connector-python-8.0.23.tar.gz cd ~/tools/mysql-connector-python-8.0.23 python3 setup.py install -``` - -Download and install Python Decouple -```bash -cd ~/tools -git clone https://github.com/henriquebastos/python-decouple.git cd ~/tools/python-decouple python3 setup.py install ``` Install myems-aggregation service: ```bash -cd ~ -git clone https://github.com/MyEMS/myems.git -cd myems +cd ~/myems git checkout master (or the latest release tag) -cp -R ~/myems/myems-aggregation /myems-aggregation +cp -r ~/myems/myems-aggregation /myems-aggregation ``` Copy exmaple.env file to .env and modify the .env file: ```bash @@ -112,3 +152,5 @@ cat /myems-aggregation.log [1]. https://myems.io [2]. https://dev.mysql.com/doc/connector-python/en/ + +[3]. https://github.com/henriquebastos/python-decouple/ From 27f9bb862927075e60a3150d23e7f6fe3ce7c239 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 26 Nov 2021 19:17:09 +0800 Subject: [PATCH 002/117] updated postman collection and README of myems-api --- myems-api/MyEMS.postman_collection.json | 112 ++++++++++-- myems-api/README.md | 233 ++++++++++++++---------- 2 files changed, 227 insertions(+), 118 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 4a108d31..14620963 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "188bbc28-1018-45ae-bdc8-c0b465102f5f", + "_postman_id": "edda43bf-7618-4cef-a9dc-b5eb90fde85a", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -1844,7 +1844,20 @@ "name": "POST Create an Energy Category", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"柴油\",\"unit_of_measure\":\"L\", \"kgce\":0.1229 , \"kgco2e\":0.8825}}" @@ -1865,19 +1878,32 @@ "name": "PUT Update an Energy Category", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"汽油\",\"unit_of_measure\":\"L\", \"kgce\":0.1229 , \"kgco2e\":0.8825}}" }, "url": { - "raw": "{{base_url}}/energycategories/9", + "raw": "{{base_url}}/energycategories/12", "host": [ "{{base_url}}" ], "path": [ "energycategories", - "9" + "12" ] } }, @@ -1887,15 +1913,28 @@ "name": "DELETE an Energy Category", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/energycategories/9", + "raw": "{{base_url}}/energycategories/12", "host": [ "{{base_url}}" ], "path": [ "energycategories", - "9" + "12" ] } }, @@ -3274,7 +3313,20 @@ "name": "POST Create New Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"PM20\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":1, \"description\":\"空调用电\"}}" @@ -3295,19 +3347,32 @@ "name": "PUT Update a Meter", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"PM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":7, \"description\":\"空调用电\"}}" + "raw": "{\"data\":{\"name\":\"PM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"master_meter_id\":1, \"description\":\"空调用电\"}}" }, "url": { - "raw": "{{base_url}}/meters/28", + "raw": "{{base_url}}/meters/4", "host": [ "{{base_url}}" ], "path": [ "meters", - "28" + "4" ] } }, @@ -3317,15 +3382,28 @@ "name": "DELETE Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/meters/2", + "raw": "{{base_url}}/meters/4", "host": [ "{{base_url}}" ], "path": [ "meters", - "2" + "4" ] } }, @@ -3357,7 +3435,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"point_id\":\"1\"}}" + "raw": "{\"data\":{\"point_id\":\"3\"}}" }, "url": { "raw": "{{base_url}}/meters/1/points", diff --git a/myems-api/README.md b/myems-api/README.md index bd2b19a5..7a6dd830 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -33,7 +33,7 @@ python-decouple ```bash cd myems/myems-api -pip install -r requirements.txt +pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com cp example.env .env chmod +x run.sh ./run.sh @@ -41,7 +41,7 @@ chmod +x run.sh ## Installation -### Option 1: Install myems-api on Docker +### Installation Option 1: Install myems-api on Docker In this section, you will install myems-api on Docker. @@ -69,107 +69,18 @@ docker run -d -p 8000:8000 --restart always --name myems-api myems/myems-api --name Assign a name to the container -### Option 2: Install myems-api on Ubuntu Server (bare-metal or virtual machine) +### Option 2: Online install myems-api on Ubuntu Server with internet access -In this section, you will install myems-api on Ubuntu Server. - -* Install anytree +In this section, you will online install myems-api on Ubuntu Server with internet access. +* Copy source code to a production Ubuntu Server and then install tools ```bash -cd ~/tools -git clone https://github.com/c0fec0de/anytree.git -cd anytree -python3 setup.py install +cd ~/myems/myems-api +pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com ``` -* Install simplejson +* Install myems-api service: ```bash -cd ~/tools -git clone https://github.com/simplejson/simplejson.git -cd simplejson -python3 setup.py install -``` - -* Install MySQL Connector -```bash - cd ~/tools - wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz - tar xzf mysql-connector-python-8.0.23.tar.gz - cd ~/tools/mysql-connector-python-8.0.23 - python3 setup.py install -``` - -* Install Falcon, - - if you are behind proxy, use --proxy parameter - - Refer to - - https://falconframework.org/ - - https://github.com/lwcolton/falcon-cors - - https://github.com/yohanboniface/falcon-multipart -```bash - mkdir ~/tools/falcon && cd ~/tools/falcon - pip3 download cython falcon falcon-cors falcon-multipart - export LC_ALL="en_US.UTF-8" - export LC_CTYPE="en_US.UTF-8" - dpkg-reconfigure locales - pip3 install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart -``` - -* Install gunicorn, refer to http://gunicorn.org -```bash - mkdir ~/tools/gunicorn && cd ~/tools/gunicorn - pip3 download gunicorn - pip3 install --no-index --find-links ~/tools/gunicorn gunicorn -``` - -* Install openpyxl, refer to https://foss.heptapod.net/openpyxl/openpyxl -Get the latest version of et_xmlfile from https://foss.heptapod.net/openpyxl/et_xmlfile/ -```bash -cd ~/tools -wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz -tar xzf et_xmlfile-1.1.tar.gz -``` -Get jdcal -```bash -cd ~/tools -git clone https://github.com/phn/jdcal.git -``` -Get Pillow -``` -mkdir ~/tools/pillow && cd ~/tools/pillow -pip3 download Pillow -``` -Get the latest version of openpyxl from https://foss.heptapod.net/openpyxl/openpyxl -```bash -cd ~/tools -wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz -tar xzf openpyxl-3.0.7.tar.gz -``` - -```bash -cd ~/tools/et_xmlfile-1.1 -python3 setup.py install -cd ~/tools/jdcal -python3 setup.py install -pip3 install --no-index --find-links ~/tools/pillow Pillow -cd ~/tools/openpyxl-3.0.7 -python3 setup.py install -``` - -Download and install Python Decouple -```bash -cd ~/tools -git clone https://github.com/henriquebastos/python-decouple.git -cd ~/tools/python-decouple -python3 setup.py install -``` - -* Install gunicorn service for myems-api: -```bash -cp -R myems/myems-api /myems-api +cp -r ~/myems/myems-api /myems-api ``` Create .env file based on example.env and edit the .env file if needed: ```bash @@ -180,7 +91,105 @@ Check or change the listening port (default is 8000) in myems-api.service and my ```bash nano /myems-api/myems-api.service ``` -``` +```bash +ExecStart=/usr/local/bin/gunicorn -b 0.0.0.0:8000 --pid /run/myems-api/pid --timeout 600 --workers=4 app:api +``` +```bash +nano /myems-api/myems-api.socket +``` +```bash +ListenStream=0.0.0.0:8000 +``` +Add port to firewall: +```bash +ufw allow 8000 +``` +Setup systemd configure files: +```bash +cp /myems-api/myems-api.service /lib/systemd/system/ +cp /myems-api/myems-api.socket /lib/systemd/system/ +cp /myems-api/myems-api.conf /usr/lib/tmpfiles.d/ +``` +Next enable the services so that they autostart at boot: +```bash + systemctl enable myems-api.socket + systemctl enable myems-api.service +``` +Start the services : +```bash +systemctl start myems-api.socket +systemctl start myems-api.service +``` + +### Option 3: Offline install myems-api on Ubuntu Server without internet access + +In this section, you will offline install myems-api on Ubuntu Server without internet access. +* Download tools +```bash +mkdir ~tools && cd ~/tools +git clone https://github.com/c0fec0de/anytree.git +git clone https://github.com/simplejson/simplejson.git +wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz +mkdir ~/tools/falcon && cd ~/tools/falcon +pip download cython falcon falcon-cors falcon-multipart +cd ~/tools +mkdir ~/tools/gunicorn && cd ~/tools/gunicorn +pip download gunicorn +cd ~/tools +wget https://foss.heptapod.net/openpyxl/et_xmlfile/-/archive/1.1/et_xmlfile-1.1.tar.gz +cd ~/tools +git clone https://github.com/phn/jdcal.git +mkdir ~/tools/pillow && cd ~/tools/pillow +pip download Pillow +cd ~/tools +wget https://foss.heptapod.net/openpyxl/openpyxl/-/archive/3.0.7/openpyxl-3.0.7.tar.gz +cd ~/tools +git clone https://github.com/henriquebastos/python-decouple.git +``` +* Copy source code and tools to the production Ubuntu Server and then run: +```bash +cd ~/tools/anytree +python setup.py install +cd ~/tools/simplejson +python setup.py install +cd ~/tools +tar xzf mysql-connector-python-8.0.23.tar.gz +cd ~/tools/mysql-connector-python-8.0.23 +python setup.py install +export LC_ALL="en_US.UTF-8" +export LC_CTYPE="en_US.UTF-8" +dpkg-reconfigure locales +pip install --upgrade --no-index --find-links ~/tools/falcon cython falcon falcon-cors falcon-multipart +pip install --no-index --find-links ~/tools/gunicorn gunicorn +cd ~/tools +tar xzf et_xmlfile-1.1.tar.gz +cd ~/tools/et_xmlfile-1.1 +python setup.py install +cd ~/tools/jdcal +python setup.py install +cd ~/tools +pip install --no-index --find-links ~/tools/pillow Pillow +tar xzf openpyxl-3.0.7.tar.gz +cd ~/tools/openpyxl-3.0.7 +python setup.py install +cd ~/tools/python-decouple +python setup.py install +``` + +* Install myems-api service: +```bash +cp -r ~/myems/myems-api /myems-api +``` +Create .env file based on example.env and edit the .env file if needed: +```bash +cp /myems-api/example.env /myems-api/.env +nano /myems-api/.env +``` +Check or change the listening port (default is 8000) in myems-api.service and myems-api.socket: +```bash +nano /myems-api/myems-api.service +``` +```bash ExecStart=/usr/local/bin/gunicorn -b 0.0.0.0:8000 --pid /run/myems-api/pid --timeout 600 --workers=4 app:api ``` ```bash @@ -210,7 +219,7 @@ systemctl start myems-api.socket systemctl start myems-api.service ``` -### Option 3: Install myems-api on macOS +### Installation Option 4: Install myems-api on macOS Please refer to [Installation on macOS (Chinese)](./installation_macos_zh.md) @@ -219,7 +228,6 @@ Please refer to [Installation on macOS (Chinese)](./installation_macos_zh.md) View in Postman: import the file MyEMS.postman_collection.json with Postman - [Energy Category](#Energy-Category) | [Energy Item](#Energy-Item) [Data Source](#Data-Source) | [Point](#Point) @@ -2390,3 +2398,26 @@ curl -i -X GET {{base_url}}/reports/virtualmeterenergy?virtualmeterid=1&periodty ```bash curl -i -X GET {{base_url}}/reports/virtualmetercost?virtualmeterid=1&periodtype=daily&baseperiodstartdatetime=2020-08-01T00:00:00&baseperiodenddatetime=2020-09-01T00:00:00&reportingperiodstartdatetime=2020-09-01T00:00:00&reportingperiodenddatetime=2020-10-01T00:00:00 ``` + +## References + +[1]. http://myems.io + +[2]. https://falconframework.org/ + +[3]. https://github.com/lwcolton/falcon-cors + +[4]. https://github.com/yohanboniface/falcon-multipart + +[5]. http://gunicorn.org + +[6]. https://github.com/henriquebastos/python-decouple/ + +[7]. https://foss.heptapod.net/openpyxl/openpyxl + +[8]. https://foss.heptapod.net/openpyxl/et_xmlfile/ + + + + + From d937acd1bb31ae0102b160274b7051c003c21608 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 26 Nov 2021 20:05:01 +0800 Subject: [PATCH 003/117] fixed issue of EnergyCategory in admin and updated README of admin --- admin/README.md | 18 +++++++++++++++--- .../category/energycategory.controller.js | 11 ++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/admin/README.md b/admin/README.md index e3e92fc9..6653e273 100644 --- a/admin/README.md +++ b/admin/README.md @@ -14,6 +14,16 @@ nginx-1.18.0 or later In this section, you will install myems-admin on Docker. +* replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api +```bash +cd myems/admin +nano nginx.conf +``` + +```bash + proxy_pass http://127.0.0.1:8000/; +``` + * Build a Docker image ```bash cd myems/admin @@ -141,6 +151,8 @@ sudo nano /var/www/html/admin/app/api.js ## References -1. https://myems.io -2. https://dev.mysql.com/doc/connector-python/en/ -3. https://nginx.org/ \ No newline at end of file +[1]. https://myems.io + +[2]. https://dev.mysql.com/doc/connector-python/en/ + +[3]. https://nginx.org/ \ No newline at end of file diff --git a/admin/app/controllers/settings/category/energycategory.controller.js b/admin/app/controllers/settings/category/energycategory.controller.js index fcc0db00..def966a5 100644 --- a/admin/app/controllers/settings/category/energycategory.controller.js +++ b/admin/app/controllers/settings/category/energycategory.controller.js @@ -1,7 +1,13 @@ 'use strict'; -app.controller('EnergyCategoryController', function($scope, $translate,$uibModal, CategoryService,toaster,SweetAlert) { - +app.controller('EnergyCategoryController', function($scope, + $window, + $translate, + $uibModal, + CategoryService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -10,7 +16,6 @@ app.controller('EnergyCategoryController', function($scope, $translate,$uibModal $scope.categories = []; } }); - }; $scope.addCategory = function() { From 3b0d4a13f5dc5023a53ec56c9c0afbc8ca2a8bc1 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 27 Nov 2021 21:15:43 +0800 Subject: [PATCH 004/117] added access control to meter in api and admin --- .../combinedequipmentparameter.controller.js | 19 ++++++++++-- .../datasource/datasource.controller.js | 3 +- .../settings/datasource/point.controller.js | 3 +- .../distributioncircuitpoint.controller.js | 19 ++++++++++-- .../equipmentparameter.controller.js | 17 +++++++++-- .../settings/meter/meter.controller.js | 13 ++++++-- .../settings/meter/meterpoint.controller.js | 29 +++++++++++------- .../settings/sensor/sensorpoint.controller.js | 19 ++++++++++-- .../shopfloor/shopfloorpoint.controller.js | 18 +++++++++-- .../settings/space/spacepoint.controller.js | 18 +++++++++-- .../settings/store/storepoint.controller.js | 18 +++++++++-- .../settings/tenant/tenantpoint.controller.js | 18 +++++++++-- .../settings/datasource/datasource.service.js | 2 +- .../settings/meter/meterpoint.service.js | 10 +++---- myems-api/MyEMS.postman_collection.json | 30 +++++++++++++++++-- myems-api/README.md | 14 ++++----- myems-api/core/meter.py | 3 ++ 17 files changed, 201 insertions(+), 52 deletions(-) diff --git a/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js b/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js index c52bef8f..5455780a 100644 --- a/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js +++ b/admin/app/controllers/settings/combinedequipment/combinedequipmentparameter.controller.js @@ -1,6 +1,19 @@ 'use strict'; -app.controller('CombinedEquipmentParameterController', function ($scope, $uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, CombinedEquipmentParameterService, CombinedEquipmentService, PointService, toaster, SweetAlert) { +app.controller('CombinedEquipmentParameterController', function ( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + CombinedEquipmentParameterService, + CombinedEquipmentService, + PointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentCombinedEquipment = { selected: undefined }; $scope.is_show_add_parameter = false; $scope.combinedequipments = []; @@ -36,7 +49,6 @@ app.controller('CombinedEquipmentParameterController', function ($scope, $uibMod }; $scope.addCombinedEquipmentParameter = function () { - var modalInstance = $uibModal.open({ templateUrl: 'views/settings/combinedequipment/combinedequipmentparameter.model.html', controller: 'ModalAddCombinedEquipmentParameterCtrl', @@ -250,7 +262,8 @@ app.controller('CombinedEquipmentParameterController', function ($scope, $uibMod }; $scope.getAllPoints = function () { - PointService.getAllPoints(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getAllPoints(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/datasource/datasource.controller.js b/admin/app/controllers/settings/datasource/datasource.controller.js index 45e5df29..bb26dec2 100644 --- a/admin/app/controllers/settings/datasource/datasource.controller.js +++ b/admin/app/controllers/settings/datasource/datasource.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('DataSourceController', function($scope, +app.controller('DataSourceController', function( + $scope, $window, $uibModal, $translate, diff --git a/admin/app/controllers/settings/datasource/point.controller.js b/admin/app/controllers/settings/datasource/point.controller.js index 83ec5913..e426df06 100644 --- a/admin/app/controllers/settings/datasource/point.controller.js +++ b/admin/app/controllers/settings/datasource/point.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('PointController', function($scope, +app.controller('PointController', function( + $scope, $window, $uibModal, $translate, diff --git a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js index 8b5f8aaf..b7a63720 100644 --- a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js @@ -1,9 +1,21 @@ 'use strict'; -app.controller('DistributionCircuitPointController', function ($scope, $timeout, $translate, DistributionCircuitService, DataSourceService, PointService, DistributionCircuitPointService, toaster, SweetAlert) { +app.controller('DistributionCircuitPointController', function ( + $scope, + $window, + $timeout, + $translate, + DistributionCircuitService, + DataSourceService, + PointService, + DistributionCircuitPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentDistributionCircuit = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +29,8 @@ app.controller('DistributionCircuitPointController', function ($scope, $timeout, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/equipment/equipmentparameter.controller.js b/admin/app/controllers/settings/equipment/equipmentparameter.controller.js index 17ae48d8..09a9a133 100644 --- a/admin/app/controllers/settings/equipment/equipmentparameter.controller.js +++ b/admin/app/controllers/settings/equipment/equipmentparameter.controller.js @@ -1,6 +1,18 @@ 'use strict'; -app.controller('EquipmentParameterController', function($scope, $uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, EquipmentParameterService, EquipmentService, PointService, toaster,SweetAlert) { +app.controller('EquipmentParameterController', function( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + EquipmentParameterService, + EquipmentService, + PointService, + toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentEquipment = {selected:undefined}; $scope.is_show_add_parameter = false; $scope.equipments = []; @@ -251,7 +263,8 @@ app.controller('EquipmentParameterController', function($scope, $uibModal, $tran }; $scope.getAllPoints = function() { - PointService.getAllPoints(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getAllPoints(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/meter/meter.controller.js b/admin/app/controllers/settings/meter/meter.controller.js index 747c3bbe..9f43df25 100644 --- a/admin/app/controllers/settings/meter/meter.controller.js +++ b/admin/app/controllers/settings/meter/meter.controller.js @@ -1,7 +1,16 @@ 'use strict'; -app.controller('MeterController', function($scope, $translate, $uibModal, MeterService, CategoryService, CostCenterService, EnergyItemService,toaster, SweetAlert) { - +app.controller('MeterController', function($scope, + $window, + $translate, + $uibModal, + MeterService, + CategoryService, + CostCenterService, + EnergyItemService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCostCenters = function() { CostCenterService.getAllCostCenters(function (response) { if (angular.isDefined(response.status) && response.status === 200) { diff --git a/admin/app/controllers/settings/meter/meterpoint.controller.js b/admin/app/controllers/settings/meter/meterpoint.controller.js index fa0f697b..44e6fb38 100644 --- a/admin/app/controllers/settings/meter/meterpoint.controller.js +++ b/admin/app/controllers/settings/meter/meterpoint.controller.js @@ -1,14 +1,20 @@ 'use strict'; -app.controller('MeterPointController', function ($scope, $timeout, $translate, - MeterService, - DataSourceService, - PointService, - MeterPointService, - toaster) { +app.controller('MeterPointController', function ( + $scope, + $window, + $timeout, + $translate, + MeterService, + DataSourceService, + PointService, + MeterPointService, + toaster) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentMeter = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -22,7 +28,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { @@ -69,7 +76,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, $scope.pairPoint = function (dragEl, dropEl) { var pointid = angular.element('#' + dragEl).scope().point.id; var meterid = $scope.currentMeter.id; - MeterPointService.addPair(meterid, pointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MeterPointService.addPair(meterid, pointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -95,7 +103,8 @@ app.controller('MeterPointController', function ($scope, $timeout, $translate, } var meterpointid = angular.element('#' + dragEl).scope().meterpoint.id; var meterid = $scope.currentMeter.id; - MeterPointService.deletePair(meterid, meterpointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MeterPointService.deletePair(meterid, meterpointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/sensor/sensorpoint.controller.js b/admin/app/controllers/settings/sensor/sensorpoint.controller.js index 3ba13fd3..c2b6839c 100644 --- a/admin/app/controllers/settings/sensor/sensorpoint.controller.js +++ b/admin/app/controllers/settings/sensor/sensorpoint.controller.js @@ -1,9 +1,21 @@ 'use strict'; -app.controller('SensorPointController', function ($scope, $timeout, $translate, SensorService, DataSourceService, PointService, SensorPointService, toaster, SweetAlert) { +app.controller('SensorPointController', function ( + $scope, + $window, + $timeout, + $translate, + SensorService, + DataSourceService, + PointService, + SensorPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentSensor = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -18,7 +30,8 @@ app.controller('SensorPointController', function ($scope, $timeout, $translate, }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js b/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js index a88ea9f1..09eb88a0 100644 --- a/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js +++ b/admin/app/controllers/settings/shopfloor/shopfloorpoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('ShopfloorPointController', function ($scope, $translate, ShopfloorService, DataSourceService, PointService, ShopfloorPointService, toaster, SweetAlert) { +app.controller('ShopfloorPointController', function ( + $scope, + $window, + $translate, + ShopfloorService, + DataSourceService, + PointService, + ShopfloorPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentShopfloor = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('ShopfloorPointController', function ($scope, $translate, Shopflo }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/space/spacepoint.controller.js b/admin/app/controllers/settings/space/spacepoint.controller.js index cec6de57..c1b50d52 100644 --- a/admin/app/controllers/settings/space/spacepoint.controller.js +++ b/admin/app/controllers/settings/space/spacepoint.controller.js @@ -1,6 +1,16 @@ 'use strict'; -app.controller('SpacePointController', function ($scope, $translate, SpaceService, DataSourceService, PointService, SpacePointService, toaster, SweetAlert) { +app.controller('SpacePointController', function ( + $scope, + $window, + $translate, + SpaceService, + DataSourceService, + PointService, + SpacePointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.spaces = []; $scope.currentSpaceID = 1; $scope.spacepoints = []; @@ -42,7 +52,8 @@ app.controller('SpacePointController', function ($scope, $translate, SpaceServic }; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -56,7 +67,8 @@ app.controller('SpacePointController', function ($scope, $translate, SpaceServic }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/store/storepoint.controller.js b/admin/app/controllers/settings/store/storepoint.controller.js index 17cc3c0e..d239d6c5 100644 --- a/admin/app/controllers/settings/store/storepoint.controller.js +++ b/admin/app/controllers/settings/store/storepoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('StorePointController', function ($scope, $translate, StoreService, DataSourceService, PointService, StorePointService, toaster, SweetAlert) { +app.controller('StorePointController', function ( + $window, + $scope, + $translate, + StoreService, + DataSourceService, + PointService, + StorePointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentStore = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('StorePointController', function ($scope, $translate, StoreServic }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/controllers/settings/tenant/tenantpoint.controller.js b/admin/app/controllers/settings/tenant/tenantpoint.controller.js index b29505ee..d8c687e2 100644 --- a/admin/app/controllers/settings/tenant/tenantpoint.controller.js +++ b/admin/app/controllers/settings/tenant/tenantpoint.controller.js @@ -1,9 +1,20 @@ 'use strict'; -app.controller('TenantPointController', function ($scope, $translate, TenantService, DataSourceService, PointService, TenantPointService, toaster, SweetAlert) { +app.controller('TenantPointController', function ( + $scope, + $window, + $translate, + TenantService, + DataSourceService, + PointService, + TenantPointService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.currentTenant = {selected:undefined}; $scope.getAllDataSources = function () { - DataSourceService.getAllDataSources(function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DataSourceService.getAllDataSources(headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.datasources = response.data; if ($scope.datasources.length > 0) { @@ -17,7 +28,8 @@ app.controller('TenantPointController', function ($scope, $translate, TenantServ }; $scope.getPointsByDataSourceID = function (id) { - PointService.getPointsByDataSourceID(id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PointService.getPointsByDataSourceID(id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.points = response.data; } else { diff --git a/admin/app/services/settings/datasource/datasource.service.js b/admin/app/services/settings/datasource/datasource.service.js index f33486c0..b3e88a92 100644 --- a/admin/app/services/settings/datasource/datasource.service.js +++ b/admin/app/services/settings/datasource/datasource.service.js @@ -2,7 +2,7 @@ app.factory('DataSourceService', function($http) { return { getAllDataSources:function(headers, callback){ - $http.get(getAPI()+'datasources', {headers}) + $http.get(getAPI() + 'datasources', {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/meter/meterpoint.service.js b/admin/app/services/settings/meter/meterpoint.service.js index e9184851..3c1ebf28 100644 --- a/admin/app/services/settings/meter/meterpoint.service.js +++ b/admin/app/services/settings/meter/meterpoint.service.js @@ -1,8 +1,8 @@ 'use strict'; app.factory('MeterPointService', function($http) { return { - addPair: function(meterID,pointID,callback) { - $http.post(getAPI()+'meters/'+meterID+'/points',{data:{'point_id':pointID}}) + addPair: function(meterID, pointID, headers, callback) { + $http.post(getAPI() + 'meters/' + meterID + '/points', {data:{'point_id':pointID}}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -10,8 +10,8 @@ app.factory('MeterPointService', function($http) { }); }, - deletePair: function(meterID,pointID, callback) { - $http.delete(getAPI()+'meters/'+meterID+'/points/'+pointID) + deletePair: function(meterID,pointID, headers, callback) { + $http.delete(getAPI() + 'meters/' + meterID + '/points/' + pointID, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -19,7 +19,7 @@ app.factory('MeterPointService', function($http) { }); }, getPointsByMeterID: function(id, callback) { - $http.get(getAPI()+'meters/'+id+'/points') + $http.get(getAPI() + 'meters/' + id + '/points') .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 14620963..af45e87a 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -3432,7 +3432,20 @@ "name": "POST Meter Point Relation", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "ee46c3c7ca148dcb76af23fd2431fd925d20d570c363dc8d478a3afa74a9c8743886cdaf8d37b94faa49210d9003a916313790c7818c2ab7e87647489aaabfb7", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"point_id\":\"3\"}}" @@ -3474,7 +3487,20 @@ "name": "DELETE Meter Point Relation", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "ee46c3c7ca148dcb76af23fd2431fd925d20d570c363dc8d478a3afa74a9c8743886cdaf8d37b94faa49210d9003a916313790c7818c2ab7e87647489aaabfb7", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/meters/1/points/3", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 7a6dd830..b8c163dc 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -574,15 +574,15 @@ curl -i -X GET {{base_url}}/energycategories ``` * DELETE an Energy Category by ID ```bash -curl -i -X DELETE {{base_url}}/energycategories/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energycategories/{id} ``` * POST Create an Energy Category ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1229 , "kgco2e":0.8825}}' {{base_url}}/energycategories ``` * PUT Update an Energy Category ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"电","unit_of_measure":"kWh", "kgce":0.1329 , "kgco2e":0.9825}}' {{base_url}}/energycategories/{id} ``` ### Energy Flow Diagram @@ -1053,11 +1053,11 @@ curl -i -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` * GET All Submeters of Meter by ID ```bash @@ -1069,11 +1069,11 @@ curl -i -X GET {{base_url}}/meters/{id}/points ``` * POST Meter Point Relation ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` * DELETE Meter Point Relation ```bash -curl -i -X DELETE {{base_url}}/meters/{id}/points/{pid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` ### Notification diff --git a/myems-api/core/meter.py b/myems-api/core/meter.py index 5a5dd1a2..11812ea3 100644 --- a/myems-api/core/meter.py +++ b/myems-api/core/meter.py @@ -900,6 +900,7 @@ class MeterPointCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -967,6 +968,8 @@ class MeterPointItem: @staticmethod @user_logger def on_delete(req, resp, id_, pid): + """Handles DELETE requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_METER_ID') From ccf7b9d43533bee1fc54b56149296af2d03c063b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 28 Nov 2021 20:46:46 +0800 Subject: [PATCH 005/117] updated requirements of myems-api --- myems-api/requirements.txt | 2 +- web/README.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/myems-api/requirements.txt b/myems-api/requirements.txt index b2db7617..430b7cc9 100644 --- a/myems-api/requirements.txt +++ b/myems-api/requirements.txt @@ -1,7 +1,7 @@ anytree simplejson mysql-connector-python -falcon +falcon==3.0.1 falcon_cors falcon-multipart gunicorn diff --git a/web/README.md b/web/README.md index 01e763f6..4ea41edb 100644 --- a/web/README.md +++ b/web/README.md @@ -57,6 +57,13 @@ In this section, you will install myems-web on Docker. cd myems/web sudo nano src/config.js ``` + +* replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api +```bash +cd myems/web +nano nginx.conf +``` + * Download all the necessary dependencies into the node_modules directory. ```bash sudo npm i --unsafe-perm=true --allow-root --legacy-peer-deps From 7a2d2a3f1de92bbafa63664d4388921e01c1511d Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 16:07:31 +0800 Subject: [PATCH 006/117] menu of access_control --- .../settings/menu/menu.controller.js | 7 +-- .../services/settings/menu/menu.service.js | 4 +- myems-api/MyEMS.postman_collection.json | 43 +++++++++++++++++-- myems-api/core/menu.py | 3 +- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/admin/app/controllers/settings/menu/menu.controller.js b/admin/app/controllers/settings/menu/menu.controller.js index 13ada957..31689cdd 100644 --- a/admin/app/controllers/settings/menu/menu.controller.js +++ b/admin/app/controllers/settings/menu/menu.controller.js @@ -1,10 +1,10 @@ 'use strict'; -app.controller('MenuController', function ($scope, $uibModal, MenuService, toaster, $translate) { +app.controller('MenuController', function ($scope, $window, $uibModal, MenuService, toaster, $translate) { $scope.menus = []; $scope.currentMenu = {}; $scope.currentMenuChildren = []; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllMenus = function () { MenuService.getAllMenus(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -104,7 +104,8 @@ app.controller('MenuController', function ($scope, $uibModal, MenuService, toast }); modalInstance.result.then(function (modifiedMenu) { - MenuService.editMenu(modifiedMenu, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + MenuService.editMenu(modifiedMenu, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/menu/menu.service.js b/admin/app/services/settings/menu/menu.service.js index fc0c6505..7d2080bb 100644 --- a/admin/app/services/settings/menu/menu.service.js +++ b/admin/app/services/settings/menu/menu.service.js @@ -17,8 +17,8 @@ app.factory('MenuService', function($http) { callback(response); }); }, - editMenu: function(menu, callback) { - $http.put(getAPI()+'menus/'+menu.id,{data:menu}) + editMenu: function(menu, headers, callback) { + $http.put(getAPI()+'menus/'+menu.id, {data:menu}, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index af45e87a..623bddec 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "edda43bf-7618-4cef-a9dc-b5eb90fde85a", + "_postman_id": "27f47263-6e8e-4d74-93a9-0ee9b56eccfc", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -3214,7 +3214,18 @@ "name": "PUT Update a Menu", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", + "type": "text" + }, + { + "key": "Token", + "value": "fc037979da169499d2c84d9ff838ae2599f1934b2e43872a8dc9da033f4d5811a0ca711595a576dcd6b340ffc3d8a8824630cf04b4e67331a6a82e8ec2dfd155", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"is_hidden\":true}}" @@ -7414,7 +7425,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" + "raw": "{\"data\":{\"email\":\"admin1130@kwh-w.com\", \"password\":\"c2c77a39ab28\"}}" }, "url": { "raw": "{{base_url}}/users/login", @@ -10631,5 +10642,31 @@ }, "response": [] } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "base_url", + "value": "127.0.0.1:8000" + } ] } \ No newline at end of file diff --git a/myems-api/core/menu.py b/myems-api/core/menu.py index 2f620d75..8845ca6b 100644 --- a/myems-api/core/menu.py +++ b/myems-api/core/menu.py @@ -2,7 +2,7 @@ import falcon import simplejson as json import mysql.connector import config -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class MenuCollection: @@ -83,6 +83,7 @@ class MenuItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From d5ad69b7b986aeab8377546fd975fe50b4325bce Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 17:02:06 +0800 Subject: [PATCH 007/117] menu of access_control2 --- myems-api/MyEMS.postman_collection.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 623bddec..51ba6bc6 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7425,7 +7425,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\"data\":{\"email\":\"admin1130@kwh-w.com\", \"password\":\"c2c77a39ab28\"}}" + "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" }, "url": { "raw": "{{base_url}}/users/login", @@ -10662,11 +10662,5 @@ ] } } - ], - "variable": [ - { - "key": "base_url", - "value": "127.0.0.1:8000" - } ] } \ No newline at end of file From dfec9a8fc0c6221ffa8f1ac1df8cc128b36f2376 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Mon, 29 Nov 2021 17:46:14 +0800 Subject: [PATCH 008/117] added access_control to menu in api and admin --- .../settings/menu/menu.controller.js | 8 ++++- myems-api/MyEMS.postman_collection.json | 16 ++++++---- myems-api/README.md | 32 +++++++++---------- web/README.md | 10 +++--- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/admin/app/controllers/settings/menu/menu.controller.js b/admin/app/controllers/settings/menu/menu.controller.js index 31689cdd..03400cfd 100644 --- a/admin/app/controllers/settings/menu/menu.controller.js +++ b/admin/app/controllers/settings/menu/menu.controller.js @@ -1,6 +1,12 @@ 'use strict'; -app.controller('MenuController', function ($scope, $window, $uibModal, MenuService, toaster, $translate) { +app.controller('MenuController', function ( + $scope, + $window, + $uibModal, + MenuService, + toaster, + $translate) { $scope.menus = []; $scope.currentMenu = {}; $scope.currentMenuChildren = []; diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 51ba6bc6..df8ee26b 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "27f47263-6e8e-4d74-93a9-0ee9b56eccfc", + "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -3217,13 +3217,15 @@ "header": [ { "key": "User-UUID", - "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", - "type": "text" + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", - "value": "fc037979da169499d2c84d9ff838ae2599f1934b2e43872a8dc9da033f4d5811a0ca711595a576dcd6b340ffc3d8a8824630cf04b4e67331a6a82e8ec2dfd155", - "type": "text" + "value": "9217343d83a59d87cd7d28949d039cbea8b05c219a40ef1d71fe8db6ceebedf5bb7eadf34792c31bc6dccda27e9d5d932ae6e4da444dddbfe1e1fad14a1f5384", + "type": "text", + "description": "Login to get a valid token" } ], "body": { @@ -3231,13 +3233,13 @@ "raw": "{\"data\":{\"is_hidden\":true}}" }, "url": { - "raw": "{{base_url}}/menus/1", + "raw": "{{base_url}}/menus/100", "host": [ "{{base_url}}" ], "path": [ "menus", - "1" + "100" ] } }, diff --git a/myems-api/README.md b/myems-api/README.md index b8c163dc..afea25e8 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -352,7 +352,7 @@ curl -i -X DELETE {{base_url}}/costfiles/{id} * POST Upload a Cost File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles ``` * GET Restore a Cost File by ID from database to disk ```bash @@ -982,7 +982,7 @@ curl -i -X DELETE {{base_url}}/knowledgefiles/{id} * POST Upload a Knowledge File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/knowledgefiles ``` * GET Restore a Knowledge File by id from database to disk ```bash @@ -1010,7 +1010,7 @@ curl -i -X GET {{base_url}}/menus ``` * PUT Update a Menu ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} ``` * Get All Menus for Web UI ```bash @@ -1053,11 +1053,11 @@ curl -i -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` * GET All Submeters of Meter by ID ```bash @@ -1069,11 +1069,11 @@ curl -i -X GET {{base_url}}/meters/{id}/points ``` * POST Meter Point Relation ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` * DELETE Meter Point Relation ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d9658cbf3811fe6c93" -X DELETE {{base_url}}/meters/{id}/points/{pid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` ### Notification @@ -1097,19 +1097,19 @@ Result * GET All Notifications ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/notifications?startdatetime={startdatetime}&enddatetime={enddatetime}&status={status} ``` * DELETE Notification by ID ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/notifications/{id} ``` * PUT Update a Notification ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"status":"read"}}' {{base_url}}/notifications/{id} ``` * DELETE Notification ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -X DELETE {{base_url}}/notifications/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/notifications/{id} ``` ### Offline Meter @@ -1178,7 +1178,7 @@ curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} * POST Upload an Offline Meter File (call users login API to get 'User-UUID' and 'Token') ```bash -curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: 02f93023a39c98e1d1bc9f5197a83dfc5ddc0d48" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinemeterfiles ``` * GET Restore an Offline Meter File by ID from database to disk ```bash @@ -1604,7 +1604,7 @@ curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} ``` * GET Space Tree of User ```bash -curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X GET {{base_url}}/spaces/tree +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/spaces/tree ``` ### Store @@ -2009,15 +2009,15 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"email":"johnson ``` * PUT User Logout ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT {{base_url}}/users/logout +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT {{base_url}}/users/logout ``` * PUT User change password ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword ``` * PUT User reset other user's password by administrator ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: a6e52af82e5b4168ae03b1c5fd8fa31b2ab3a338" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword +curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` ### Virtual Meter diff --git a/web/README.md b/web/README.md index 4ea41edb..dab37692 100644 --- a/web/README.md +++ b/web/README.md @@ -55,7 +55,7 @@ In this section, you will install myems-web on Docker. * Check and change the config file if necessary: ```bash cd myems/web -sudo nano src/config.js +nano src/config.js ``` * replace ~~127.0.0.1:8000~~ in nginx.conf with actual **HOST** ip and port of myems-api @@ -66,11 +66,11 @@ nano nginx.conf * Download all the necessary dependencies into the node_modules directory. ```bash -sudo npm i --unsafe-perm=true --allow-root --legacy-peer-deps +npm i --unsafe-perm=true --allow-root --legacy-peer-deps ``` * Build for production with NPM ```bash -sudo npm run build +npm run build ``` * Build a Docker image ```bash @@ -91,14 +91,14 @@ docker run -d -p 80:80 --restart always --name myems-web myems/myems-web --name Assign a name to the container -### Option 2: Install myems-web on NGINX Server +### Option 2: Install myems-web on Server with NGINX * Install NGINX Server refer to http://nginx.org/en/docs/install.html * Configure NGINX ```bash -sudo nano /etc/nginx/nginx.conf +nano /etc/nginx/nginx.conf ``` In the 'http' section, add some directives: ``` From 9304225419495c1ce034c52f71104098ed699afd Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 29 Nov 2021 18:48:29 +0800 Subject: [PATCH 009/117] contact of access_control --- .../settings/contact/contact.controller.js | 13 +++-- .../settings/contact/contact.service.js | 12 ++--- myems-api/MyEMS.postman_collection.json | 47 +++++++++++++++++-- myems-api/README.md | 10 ++-- myems-api/core/contact.py | 5 +- 5 files changed, 66 insertions(+), 21 deletions(-) diff --git a/admin/app/controllers/settings/contact/contact.controller.js b/admin/app/controllers/settings/contact/contact.controller.js index 02aa61ac..89d5a05a 100644 --- a/admin/app/controllers/settings/contact/contact.controller.js +++ b/admin/app/controllers/settings/contact/contact.controller.js @@ -1,8 +1,8 @@ 'use strict'; -app.controller('ContactController', function($scope, $translate,$uibModal, ContactService,toaster,SweetAlert) { - +app.controller('ContactController', function($scope, $window, $translate,$uibModal, ContactService,toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllContacts = function() { ContactService.getAllContacts(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -28,7 +28,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta } }); modalInstance.result.then(function(contact) { - ContactService.addContact(contact, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.addContact(contact, headers, function(response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -67,7 +68,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta }); modalInstance.result.then(function (modifiedContact) { - ContactService.editContact(modifiedContact, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.editContact(modifiedContact, headers, function (response) { if(angular.isDefined(response.status) && response.status === 200){ toaster.pop({ type: "success", @@ -103,7 +105,8 @@ app.controller('ContactController', function($scope, $translate,$uibModal, Conta closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - ContactService.deleteContact(contact, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + ContactService.deleteContact(contact, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/contact/contact.service.js b/admin/app/services/settings/contact/contact.service.js index 19b47c98..437540e0 100644 --- a/admin/app/services/settings/contact/contact.service.js +++ b/admin/app/services/settings/contact/contact.service.js @@ -17,24 +17,24 @@ app.factory('ContactService', function($http) { callback(response); }); }, - addContact: function(contact, callback) { - $http.post(getAPI()+'contacts',{data:contact}) + addContact: function(contact, headers, callback) { + $http.post(getAPI()+'contacts',{data:contact}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editContact: function(contact, callback) { - $http.put(getAPI()+'contacts/'+contact.id,{data:contact}) + editContact: function(contact, headers, callback) { + $http.put(getAPI()+'contacts/'+contact.id,{data:contact}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteContact: function(contact, callback) { - $http.delete(getAPI()+'contacts/'+contact.id) + deleteContact: function(contact, headers, callback) { + $http.delete(getAPI()+'contacts/'+contact.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index df8ee26b..4192a101 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", + "_postman_id": "92712647-82fc-4cf2-acae-25fb13badd9e", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -634,7 +634,20 @@ "name": "POST Create New Contact", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888888\", \"description\":\"contact description\"}}" @@ -655,7 +668,20 @@ "name": "PUT Update a Contact", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888899\", \"description\":\"contact description\"}}" @@ -677,7 +703,20 @@ "name": "DELETE a Contact by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/contacts/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index afea25e8..2d2a2374 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -269,15 +269,15 @@ curl -i -X GET {{base_url}}/contacts ``` * DELETE Contact by ID ```bash -curl -i -X DELETE {{base_url}}/contacts/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/contacts/{id} ``` * POST Create a New Contact ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888888", "description":"contact description"}}' {{base_url}}/contacts ``` * PUT Update a Contact ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"albert", "email":"albert@myems.io", "phone":"+8613888888899", "description":"contact description"}}' {{base_url}}/contacts/{id} ``` ### Cost Center @@ -2402,9 +2402,9 @@ curl -i -X GET {{base_url}}/reports/virtualmetercost?virtualmeterid=1&periodtype ## References [1]. http://myems.io - + [2]. https://falconframework.org/ - + [3]. https://github.com/lwcolton/falcon-cors [4]. https://github.com/yohanboniface/falcon-multipart diff --git a/myems-api/core/contact.py b/myems-api/core/contact.py index 5a10a0d3..ef5dfd90 100644 --- a/myems-api/core/contact.py +++ b/myems-api/core/contact.py @@ -4,7 +4,7 @@ import mysql.connector import config import uuid import re -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class ContactCollection: @@ -48,6 +48,7 @@ class ContactCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -160,6 +161,7 @@ class ContactItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_CONTACT_ID') @@ -236,6 +238,7 @@ class ContactItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From 16c7e858fbeb331cc7f17d4495f6a32c92c6ad16 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:00:38 +0800 Subject: [PATCH 010/117] added access control to EnergyItem --- .../settings/category/energyitem.controller.js | 10 +++++++--- .../services/settings/category/energyitem.service.js | 12 ++++++------ myems-api/MyEMS.postman_collection.json | 2 +- myems-api/README.md | 6 +++--- myems-api/core/energyitem.py | 5 ++++- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/admin/app/controllers/settings/category/energyitem.controller.js b/admin/app/controllers/settings/category/energyitem.controller.js index e6abad0b..03261570 100644 --- a/admin/app/controllers/settings/category/energyitem.controller.js +++ b/admin/app/controllers/settings/category/energyitem.controller.js @@ -1,6 +1,7 @@ 'use strict'; app.controller('EnergyItemController', function($scope, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -38,7 +39,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca } }); modalInstance.result.then(function(energyItem) { - EnergyItemService.addEnergyItem(energyItem, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.addEnergyItem(energyItem, headers, function(response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -78,7 +80,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca }); modalInstance.result.then(function (modifiedEnergyItem) { - EnergyItemService.editEnergyItem(modifiedEnergyItem, function (response){ + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.editEnergyItem(modifiedEnergyItem, headers, function (response){ if(angular.isDefined(response.status) && response.status === 200){ toaster.pop({ type: "success", @@ -114,7 +117,8 @@ app.controller('EnergyItemController', function($scope, $translate,$uibModal, Ca closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - EnergyItemService.deleteEnergyItem(energyItem, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyItemService.deleteEnergyItem(energyItem, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/category/energyitem.service.js b/admin/app/services/settings/category/energyitem.service.js index 503a8542..ee0fff62 100644 --- a/admin/app/services/settings/category/energyitem.service.js +++ b/admin/app/services/settings/category/energyitem.service.js @@ -17,24 +17,24 @@ app.factory('EnergyItemService', function($http) { callback(response); }); }, - addEnergyItem: function(energyItem, callback) { - $http.post(getAPI()+'energyitems',{data:energyItem}) + addEnergyItem: function(energyItem, headers, callback) { + $http.post(getAPI()+'energyitems',{data:energyItem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyItem: function(energyItem, callback) { - $http.put(getAPI()+'energyitems/'+energyItem.id,{data:energyItem}) + editEnergyItem: function(energyItem, headers, callback) { + $http.put(getAPI()+'energyitems/'+energyItem.id,{data:energyItem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteEnergyItem: function(energyItem, callback) { - $http.delete(getAPI()+'energyitems/'+energyItem.id) + deleteEnergyItem: function(energyItem, headers, callback) { + $http.delete(getAPI()+'energyitems/'+energyItem.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index df8ee26b..7f2c217c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "1a6c20d8-4d7a-49a1-a5e9-3d4261ba0505", + "_postman_id": "36fe4322-48fb-414c-8328-665d2872c2b7", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, diff --git a/myems-api/README.md b/myems-api/README.md index afea25e8..74f2d05b 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -669,15 +669,15 @@ curl -i -X GET {{base_url}}/energyitems ``` * DELETE an Energy Item by ID ```bash -curl -i -X DELETE {{base_url}}/energyitems/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyitems/{id} ``` * POST Create an Energy Item ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"空调用电","energy_category_id":1}}' {{base_url}}/energyitems ``` * PUT Update an Energy Item ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"动力用电","energy_category_id":1}}' {{base_url}}/energyitems/{id} ``` ### Equipment diff --git a/myems-api/core/energyitem.py b/myems-api/core/energyitem.py index f2edffcb..b22b06a2 100644 --- a/myems-api/core/energyitem.py +++ b/myems-api/core/energyitem.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class EnergyItemCollection: @@ -55,6 +55,7 @@ class EnergyItemCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -165,6 +166,7 @@ class EnergyItemItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_ITEM_ID') @@ -225,6 +227,7 @@ class EnergyItemItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From 6e5344943998ed6469ff2e5d1250284ef9038cb7 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:07:12 +0800 Subject: [PATCH 011/117] added access control to EnergyItem --- .../app/controllers/settings/category/energyitem.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/app/controllers/settings/category/energyitem.controller.js b/admin/app/controllers/settings/category/energyitem.controller.js index 03261570..439e2db7 100644 --- a/admin/app/controllers/settings/category/energyitem.controller.js +++ b/admin/app/controllers/settings/category/energyitem.controller.js @@ -1,6 +1,6 @@ 'use strict'; -app.controller('EnergyItemController', function($scope, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { +app.controller('EnergyItemController', function($scope, $window, $translate,$uibModal, CategoryService, EnergyItemService, toaster,SweetAlert) { $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllCategories = function() { CategoryService.getAllCategories(function (response) { From 20db5357b28a7fe80a763017da56a7fb1f175800 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:11:04 +0800 Subject: [PATCH 012/117] modified postman_collection.json --- myems-api/MyEMS.postman_collection.json | 58 +++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 7f2c217c..5b66a321 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -2257,7 +2257,20 @@ "name": "POST Create an Energy Item", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"租户用电\",\"energy_category_id\":1}}" @@ -2278,7 +2291,20 @@ "name": "PUT Update an Energy Item", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"空调用\",\"energy_category_id\":1}}" @@ -2300,7 +2326,20 @@ "name": "DELETE an Energy Item", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/energyitems/4", "host": [ @@ -7424,7 +7463,18 @@ "name": "PUT User Login by Email", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", + "type": "text" + }, + { + "key": "Token", + "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" From 8481fa68a5836ceef569c630e3bddb9733eed0c8 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Tue, 30 Nov 2021 10:13:11 +0800 Subject: [PATCH 013/117] modified postman_collection.json --- myems-api/MyEMS.postman_collection.json | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 5b66a321..090d3d35 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7463,18 +7463,7 @@ "name": "PUT User Login by Email", "request": { "method": "PUT", - "header": [ - { - "key": "User-UUID", - "value": "816be1f0-cf59-4aa4-bf81-a0e90577d416", - "type": "text" - }, - { - "key": "Token", - "value": "89d8c1a8e6e2a4fc3b7a7eb3964c4e6fc97b5ae216591a986deb43f8a03babcd72ce5ad0c160e3ed4c9550cea29a9a548a261812484f2c7ac9aa039aa33441e2", - "type": "text" - } - ], + "header": [], "body": { "mode": "raw", "raw": "{\"data\":{\"email\":\"administrator@myems.io\", \"password\":\"!MyEMS1\"}}" From 637f8ce481abdc9726631a45268dc4344d932315 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 30 Nov 2021 22:57:51 +0800 Subject: [PATCH 014/117] added accecc_control to contact in api and admin --- .../settings/contact/contact.controller.js | 9 ++++++- myems-api/MyEMS.postman_collection.json | 25 ++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/admin/app/controllers/settings/contact/contact.controller.js b/admin/app/controllers/settings/contact/contact.controller.js index 89d5a05a..1dadf16c 100644 --- a/admin/app/controllers/settings/contact/contact.controller.js +++ b/admin/app/controllers/settings/contact/contact.controller.js @@ -1,6 +1,13 @@ 'use strict'; -app.controller('ContactController', function($scope, $window, $translate,$uibModal, ContactService,toaster,SweetAlert) { +app.controller('ContactController', function( + $scope, + $window, + $translate, + $uibModal, + ContactService, + toaster, + SweetAlert) { $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllContacts = function() { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 4192a101..d17add4c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "92712647-82fc-4cf2-acae-25fb13badd9e", + "_postman_id": "98580f5c-106c-4b86-8262-ec3c918608e1", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -625,7 +625,14 @@ "method": "GET", "header": [], "url": { - "raw": "" + "raw": "{{base_url}}/contacts/1", + "host": [ + "{{base_url}}" + ], + "path": [ + "contacts", + "1" + ] } }, "response": [] @@ -643,7 +650,7 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } @@ -677,7 +684,7 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } @@ -687,13 +694,13 @@ "raw": "{\"data\":{\"name\":\"albert\", \"email\":\"albert@myems.io\", \"phone\":\"+8613888888899\", \"description\":\"contact description\"}}" }, "url": { - "raw": "{{base_url}}/contacts/2", + "raw": "{{base_url}}/contacts/3", "host": [ "{{base_url}}" ], "path": [ "contacts", - "2" + "3" ] } }, @@ -712,19 +719,19 @@ }, { "key": "Token", - "value": "e3e753d078585ff791e8a899ad4bf3cc3673912061d5b6ab5119ed3ac713895ae1fc5f90f8d4a7942b1b139774b4db82e6702593b9a453a82982fdae47edac34", + "value": "835aa13a4bc4af4ca2f47cac03d186bc49c13a30a025e9d983cc52238027f2eb7bd323784ee53a3833109ce1234acf9c8cb6754ba602b84049bb9244e3df6aeb", "description": "Login to get a valid token", "type": "text" } ], "url": { - "raw": "{{base_url}}/contacts/2", + "raw": "{{base_url}}/contacts/3", "host": [ "{{base_url}}" ], "path": [ "contacts", - "2" + "3" ] } }, From c7fe4dea79435841ef8c7358e9ed794651986a77 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Wed, 1 Dec 2021 14:21:38 +0800 Subject: [PATCH 015/117] energyflowdiagram of access_control --- .../energyflowdiagram.controller.js | 19 ++++++-- .../energyflowdiagram.service.js | 12 ++--- myems-api/MyEMS.postman_collection.json | 47 +++++++++++++++++-- myems-api/README.md | 6 +-- myems-api/core/energyflowdiagram.py | 5 +- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js index dd8f81fe..5cf69fae 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js @@ -1,7 +1,13 @@ 'use strict'; -app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibModal, EnergyFlowDiagramService, toaster,SweetAlert) { - +app.controller('EnergyFlowDiagramController', function($scope, + $window, + $translate, + $uibModal, + EnergyFlowDiagramService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -19,7 +25,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM windowClass: "animated fadeIn", }); modalInstance.result.then(function(energyflowdiagram) { - EnergyFlowDiagramService.addEnergyFlowDiagram(energyflowdiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.addEnergyFlowDiagram(energyflowdiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -58,7 +65,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM }); modalInstance.result.then(function(modifiedEnergyFlowDiagram) { - EnergyFlowDiagramService.editEnergyFlowDiagram(modifiedEnergyFlowDiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.editEnergyFlowDiagram(modifiedEnergyFlowDiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -95,7 +103,8 @@ app.controller('EnergyFlowDiagramController', function($scope, $translate, $uibM closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - EnergyFlowDiagramService.deleteEnergyFlowDiagram(energyflowdiagram, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramService.deleteEnergyFlowDiagram(energyflowdiagram, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js index c82b3f22..6180fe60 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagram.service.js @@ -17,24 +17,24 @@ app.factory('EnergyFlowDiagramService', function($http) { callback(response); }); }, - addEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.post(getAPI()+'energyflowdiagrams',{data:energyflowdiagram}) + addEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams',{data:energyflowdiagram}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id,{data:energyflowdiagram}) + editEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id,{data:energyflowdiagram}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteEnergyFlowDiagram: function(energyflowdiagram, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id) + deleteEnergyFlowDiagram: function(energyflowdiagram, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagram.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index d17add4c..86ba0b6c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "98580f5c-106c-4b86-8262-ec3c918608e1", + "_postman_id": "ab4b1f3e-3892-4a0e-801b-4ec90d4592fe", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -2030,7 +2030,20 @@ "name": "POST Create an Energy Flow Diagram", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMS Energy Flow\"}}" @@ -2051,7 +2064,20 @@ "name": "PUT Update an Energy Flow Diagram", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMS Energy Flow Diagram\"}}" @@ -2073,7 +2099,20 @@ "name": "DELETE an Energy Flow Diagram", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "description": "Any admin users' UUID", + "type": "text" + }, + { + "key": "Token", + "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "description": "Login to get a valid token", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/energyflowdiagrams/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 2d2a2374..99bcea51 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -604,15 +604,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams ``` * DELETE an Energy Flow Diagram by ID ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id} ``` * POST Create an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"MyEMS Energy Flow"}}' {{base_url}}/energyflowdiagrams ``` * PUT Update an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"MyEMS Energy Flow Diagram"}}' {{base_url}}/energyflowdiagrams/{id} ``` * GET All Nodes of an Energy Flow Diagram by ID ```bash diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index 82c8c7d5..fa4f9304 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class EnergyFlowDiagramCollection: @@ -124,6 +124,7 @@ class EnergyFlowDiagramCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -285,6 +286,7 @@ class EnergyFlowDiagramItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -315,6 +317,7 @@ class EnergyFlowDiagramItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') From 62312e8c5477cdd369dbe6903593804d626045df Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Thu, 2 Dec 2021 09:56:13 +0800 Subject: [PATCH 016/117] energyflowdiagram of access_control2 --- .../energyflowdiagramlink.controller.js | 26 ++++++++++++++----- .../energyflowdiagramnode.controller.js | 22 +++++++++++----- .../energyflowdiagramlink.service.js | 12 ++++----- .../energyflowdiagramnode.service.js | 12 ++++----- myems-api/README.md | 12 ++++----- myems-api/core/energyflowdiagram.py | 6 +++++ 6 files changed, 60 insertions(+), 30 deletions(-) diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js index 2849bd9d..330aadfa 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js @@ -1,6 +1,18 @@ 'use strict'; -app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, EnergyFlowDiagramLinkService, EnergyFlowDiagramService, EnergyFlowDiagramNodeService, toaster,SweetAlert) { +app.controller('EnergyFlowDiagramLinkController', function( + $scope, + $window, + $uibModal, + $translate, + MeterService, + VirtualMeterService, + OfflineMeterService, + EnergyFlowDiagramLinkService, + EnergyFlowDiagramService, + EnergyFlowDiagramNodeService, + toaster, + SweetAlert) { $scope.currentEnergyFlowDiagram = {selected:undefined}; $scope.is_show_add_link = false; $scope.energyflowdiagrams = []; @@ -10,7 +22,7 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr $scope.offlinemeters = []; $scope.virtualmeters = []; $scope.mergedMeters = []; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -77,8 +89,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr if (energyflowdiagramlink.meter != null) { energyflowdiagramlink.meter_uuid = energyflowdiagramlink.meter.uuid; } - - EnergyFlowDiagramLinkService.addEnergyFlowDiagramLink(energyflowdiagramid, energyflowdiagramlink, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.addEnergyFlowDiagramLink(energyflowdiagramid, energyflowdiagramlink, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -128,7 +140,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr if (modifiedEnergyFlowDiagramLink.meter != null) { modifiedEnergyFlowDiagramLink.meter_uuid = modifiedEnergyFlowDiagramLink.meter.uuid; } - EnergyFlowDiagramLinkService.editEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramLink, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.editEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramLink, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -166,7 +179,8 @@ app.controller('EnergyFlowDiagramLinkController', function($scope,$uibModal, $tr }, function(isConfirm) { if (isConfirm) { - EnergyFlowDiagramLinkService.deleteEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, energyflowdiagramlink.id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramLinkService.deleteEnergyFlowDiagramLink($scope.currentEnergyFlowDiagram.id, energyflowdiagramlink.id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js index fae5cfe7..bae48548 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js @@ -1,10 +1,18 @@ 'use strict'; -app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $uibModal, EnergyFlowDiagramService, EnergyFlowDiagramNodeService, toaster,SweetAlert) { +app.controller('EnergyFlowDiagramNodeController', function( + $scope, + $window, + $translate, + $uibModal, + EnergyFlowDiagramService, + EnergyFlowDiagramNodeService, + toaster, + SweetAlert) { $scope.energyflowdiagrams = []; $scope.energyflowdiagramnodes = []; $scope.currentEnergyFlowDiagram = null; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllEnergyFlowDiagrams = function() { EnergyFlowDiagramService.getAllEnergyFlowDiagrams(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -48,8 +56,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }); modalInstance.result.then(function(energyflowdiagramnode) { var energyflowdiagramid = $scope.currentEnergyFlowDiagram.id; - - EnergyFlowDiagramNodeService.addEnergyFlowDiagramNode(energyflowdiagramid, energyflowdiagramnode, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.addEnergyFlowDiagramNode(energyflowdiagramid, energyflowdiagramnode, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -88,7 +96,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }); modalInstance.result.then(function(modifiedEnergyFlowDiagramNode) { - EnergyFlowDiagramNodeService.editEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramNode, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.editEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, modifiedEnergyFlowDiagramNode, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -126,7 +135,8 @@ app.controller('EnergyFlowDiagramNodeController', function($scope, $translate, $ }, function(isConfirm) { if (isConfirm) { - EnergyFlowDiagramNodeService.deleteEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, energyflowdiagramnode.id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EnergyFlowDiagramNodeService.deleteEnergyFlowDiagramNode($scope.currentEnergyFlowDiagram.id, energyflowdiagramnode.id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js index 511fb04a..0709c60b 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js @@ -10,16 +10,16 @@ app.factory('EnergyFlowDiagramLinkService', function($http) { callback(response); }); }, - addEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, callback) { - $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links',{data:energyflowdiagramlink}) + addEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links',{data:energyflowdiagramlink}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagramLink: function(energyflowdiagramID,energyflowdiagramlink,callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+energyflowdiagramlink.id,{data:energyflowdiagramlink}) + editEnergyFlowDiagramLink: function(energyflowdiagramID, energyflowdiagramlink, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+energyflowdiagramlink.id,{data:energyflowdiagramlink}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -27,8 +27,8 @@ app.factory('EnergyFlowDiagramLinkService', function($http) { }); }, - deleteEnergyFlowDiagramLink: function(energyflowdiagramID, linkID, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+linkID) + deleteEnergyFlowDiagramLink: function(energyflowdiagramID, linkID, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/links/'+linkID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js b/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js index b9d69a7f..4786ec09 100644 --- a/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js +++ b/admin/app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js @@ -9,16 +9,16 @@ app.factory('EnergyFlowDiagramNodeService', function($http) { callback(response); }); }, - addEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode,callback) { - $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes',{data:energyflowdiagramnode}) + addEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode, headers, callback) { + $http.post(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes',{data:energyflowdiagramnode}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editEnergyFlowDiagramNode: function(energyflowdiagramID,energyflowdiagramnode,callback) { - $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+energyflowdiagramnode.id,{data:energyflowdiagramnode}) + editEnergyFlowDiagramNode: function(energyflowdiagramID, energyflowdiagramnode, headers, callback) { + $http.put(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+energyflowdiagramnode.id,{data:energyflowdiagramnode}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -26,8 +26,8 @@ app.factory('EnergyFlowDiagramNodeService', function($http) { }); }, - deleteEnergyFlowDiagramNode: function(energyflowdiagramID, nodeID, callback) { - $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+nodeID) + deleteEnergyFlowDiagramNode: function(energyflowdiagramID, nodeID, headers, callback) { + $http.delete(getAPI()+'energyflowdiagrams/'+energyflowdiagramID+'/nodes/'+nodeID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/README.md b/myems-api/README.md index 1832f4d0..262bdef5 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -620,15 +620,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/nodes ``` * POST Create a Node of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"10KV#1"}}' {{base_url}}/energyflowdiagrams/{id}/nodes ``` * PUT Update a Node of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"10KV#2"}}' {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * DELETE a Node of an Energy Flow Diagram ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id}/nodes/{nid} ``` * GET All Links of an Energy Flow Diagram by ID ```bash @@ -636,15 +636,15 @@ curl -i -X GET {{base_url}}/energyflowdiagrams/{id}/links ``` * POST Create a Link of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"source_node_id":1, "target_node_id":3, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links ``` * PUT Update a Link of an Energy Flow Diagram ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"source_node_id":1, "target_node_id":4, "meter_uuid":"d806a78d-a31e-4833-b5c8-81261cfeb1f2"}}' {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` * DELETE a Link of an Energy Flow Diagram ```bash -curl -i -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/energyflowdiagrams/{id}/links/{lid} ``` ### Energy Item diff --git a/myems-api/core/energyflowdiagram.py b/myems-api/core/energyflowdiagram.py index fa4f9304..6eaa9b79 100644 --- a/myems-api/core/energyflowdiagram.py +++ b/myems-api/core/energyflowdiagram.py @@ -480,6 +480,7 @@ class EnergyFlowDiagramLinkCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -723,6 +724,7 @@ class EnergyFlowDiagramLinkItem: @staticmethod @user_logger def on_delete(req, resp, id_, lid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -771,6 +773,7 @@ class EnergyFlowDiagramLinkItem: @user_logger def on_put(req, resp, id_, lid): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -977,6 +980,7 @@ class EnergyFlowDiagramNodeCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -1072,6 +1076,7 @@ class EnergyFlowDiagramNodeItem: @staticmethod @user_logger def on_delete(req, resp, id_, nid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') @@ -1120,6 +1125,7 @@ class EnergyFlowDiagramNodeItem: @user_logger def on_put(req, resp, id_, nid): """Handles PUT requests""" + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_ENERGY_FLOW_DIAGRAM_ID') From 8dd998ed0c699e2be31dde5e9a1c79c8a4d311cd Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Thu, 2 Dec 2021 10:43:32 +0800 Subject: [PATCH 017/117] added access_control to privilege --- .../users/privilege/privilege.controller.js | 11 ++++++++--- .../services/users/privilege/privilege.service.js | 12 ++++++------ myems-api/README.md | 6 +++--- myems-api/core/privilege.py | 5 ++++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/admin/app/controllers/users/privilege/privilege.controller.js b/admin/app/controllers/users/privilege/privilege.controller.js index 80b2c094..30bfca59 100644 --- a/admin/app/controllers/users/privilege/privilege.controller.js +++ b/admin/app/controllers/users/privilege/privilege.controller.js @@ -1,11 +1,13 @@ 'use strict'; app.controller('PrivilegeController', function ($scope, + $window, $uibModal, PrivilegeService, toaster, $translate, SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllPrivileges = function () { PrivilegeService.getAllPrivileges(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -31,7 +33,8 @@ app.controller('PrivilegeController', function ($scope, } }); modalInstance.result.then(function (privilege) { - PrivilegeService.addPrivilege(privilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.addPrivilege(privilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -70,7 +73,8 @@ app.controller('PrivilegeController', function ($scope, }); modalInstance.result.then(function (modifiedPrivilege) { - PrivilegeService.editPrivilege(modifiedPrivilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.editPrivilege(modifiedPrivilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -107,7 +111,8 @@ app.controller('PrivilegeController', function ($scope, }, function (isConfirm) { if (isConfirm) { - PrivilegeService.deletePrivilege(privilege, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + PrivilegeService.deletePrivilege(privilege, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/users/privilege/privilege.service.js b/admin/app/services/users/privilege/privilege.service.js index 04402b9a..096408a4 100644 --- a/admin/app/services/users/privilege/privilege.service.js +++ b/admin/app/services/users/privilege/privilege.service.js @@ -9,24 +9,24 @@ app.factory('PrivilegeService', function($http) { callback(response); }); }, - addPrivilege: function(privilege, callback) { - $http.post(getAPI()+'privileges',{data:privilege}) + addPrivilege: function(privilege, headers, callback) { + $http.post(getAPI()+'privileges', {headers}, {data:privilege}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editPrivilege: function(privilege, callback) { - $http.put(getAPI()+'privileges/'+privilege.id,{data:privilege}) + editPrivilege: function(privilege, headers, callback) { + $http.put(getAPI()+'privileges/'+privilege.id, {headers}, {data:privilege}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deletePrivilege: function(privilege, callback) { - $http.delete(getAPI()+'privileges/'+privilege.id) + deletePrivilege: function(privilege, headers, callback) { + $http.delete(getAPI()+'privileges/'+privilege.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/README.md b/myems-api/README.md index 4c5cc047..9219b549 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1251,15 +1251,15 @@ curl -i -X GET {{base_url}}/privileges ``` * DELETE Privilege by ID ```bash -curl -i -X DELETE {{base_url}}/privileges/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/privileges/{id} ``` * POST New Privilege ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges ``` * PUT Privilege ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} +curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} ``` ### Rule diff --git a/myems-api/core/privilege.py b/myems-api/core/privilege.py index f0faa48d..302530e3 100644 --- a/myems-api/core/privilege.py +++ b/myems-api/core/privilege.py @@ -2,7 +2,7 @@ import falcon import simplejson as json import mysql.connector import config -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class PrivilegeCollection: @@ -42,6 +42,7 @@ class PrivilegeCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') new_values = json.loads(raw_json) @@ -101,6 +102,7 @@ class PrivilegeItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_PRIVILEGE_ID') @@ -142,6 +144,7 @@ class PrivilegeItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') new_values = json.loads(raw_json) From 29f3b91e56c1c0eb13d1d3dc8732332e2a4dfeea Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Thu, 2 Dec 2021 10:57:39 +0800 Subject: [PATCH 018/117] fixed the sequence of parameter --- admin/app/services/users/privilege/privilege.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/app/services/users/privilege/privilege.service.js b/admin/app/services/users/privilege/privilege.service.js index 096408a4..53ac75d5 100644 --- a/admin/app/services/users/privilege/privilege.service.js +++ b/admin/app/services/users/privilege/privilege.service.js @@ -10,7 +10,7 @@ app.factory('PrivilegeService', function($http) { }); }, addPrivilege: function(privilege, headers, callback) { - $http.post(getAPI()+'privileges', {headers}, {data:privilege}) + $http.post(getAPI()+'privileges', {data:privilege}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -18,7 +18,7 @@ app.factory('PrivilegeService', function($http) { }); }, editPrivilege: function(privilege, headers, callback) { - $http.put(getAPI()+'privileges/'+privilege.id, {headers}, {data:privilege}) + $http.put(getAPI()+'privileges/'+privilege.id, {data:privilege}, {headers}) .then(function (response) { callback(response); }, function (response) { From 8f2db8952f97535102adb8f718f8c2cb352f7a33 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Dec 2021 13:51:14 +0800 Subject: [PATCH 019/117] added access control to energyflowdiagram in api and admin --- .../energyflowdiagram.controller.js | 3 +- .../energyflowdiagramlink.controller.js | 19 ++- .../equipmentparameter.model.html | 84 ---------- myems-api/MyEMS.postman_collection.json | 150 +++++++++++++----- 4 files changed, 125 insertions(+), 131 deletions(-) delete mode 100644 admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js index 5cf69fae..f17b5639 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('EnergyFlowDiagramController', function($scope, +app.controller('EnergyFlowDiagramController', function( + $scope, $window, $translate, $uibModal, diff --git a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js index 330aadfa..2355d33f 100644 --- a/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js +++ b/admin/app/controllers/settings/energyflowdiagram/energyflowdiagramlink.controller.js @@ -279,15 +279,14 @@ app.controller('EnergyFlowDiagramLinkController', function( app.controller('ModalAddEnergyFlowDiagramLinkCtrl', function($scope, $uibModalInstance, params) { $scope.operation = "ENERGY_FLOW_DIAGRAM.ADD_LINK"; - $scope.energyflowdiagramlink = { - source_node: {id: null, name: null}, - target_node: {id: null, name: null}, - meter: {id: null, uuid: null, name: null, type: null}, - }; - $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; - $scope.mergedmeters = params.mergedmeters; + $scope.energyflowdiagramlink = { + source_node: {id: null, name: null}, + target_node: {id: null, name: null}, + meter: {id: null, uuid: null, name: null, type: null}, + }; + $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; + $scope.mergedmeters = params.mergedmeters; $scope.ok = function() { - $uibModalInstance.close($scope.energyflowdiagramlink); }; @@ -299,8 +298,8 @@ app.controller('ModalAddEnergyFlowDiagramLinkCtrl', function($scope, $uibModalIn app.controller('ModalEditEnergyFlowDiagramLinkCtrl', function($scope, $uibModalInstance, params) { $scope.operation = "ENERGY_FLOW_DIAGRAM.EDIT_LINK"; $scope.energyflowdiagramlink = params.energyflowdiagramlink; - $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; - $scope.mergedmeters = params.mergedmeters; + $scope.energyflowdiagramnodes = params.energyflowdiagramnodes; + $scope.mergedmeters = params.mergedmeters; $scope.ok = function() { $uibModalInstance.close($scope.energyflowdiagramlink); }; diff --git a/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html b/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html deleted file mode 100644 index f1bfb19c..00000000 --- a/admin/app/services/settings/energyflowdiagram/equipmentparameter.model.html +++ /dev/null @@ -1,84 +0,0 @@ -
- - - -
diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 64f782a1..e97d0f14 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "ab4b1f3e-3892-4a0e-801b-4ec90d4592fe", + "_postman_id": "275f5f12-078c-421a-a050-f054e344dc2b", "name": "MyEMS", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -2039,7 +2039,7 @@ }, { "key": "Token", - "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", "description": "Login to get a valid token", "type": "text" } @@ -2073,7 +2073,7 @@ }, { "key": "Token", - "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", "description": "Login to get a valid token", "type": "text" } @@ -2083,13 +2083,13 @@ "raw": "{\"data\":{\"name\":\"MyEMS Energy Flow Diagram\"}}" }, "url": { - "raw": "{{base_url}}/energyflowdiagrams/1", + "raw": "{{base_url}}/energyflowdiagrams/2000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1" + "2000000" ] } }, @@ -2108,19 +2108,19 @@ }, { "key": "Token", - "value": "073b43c05dadd89b833c0595b81c49cb9c1a54ca52b024b301a001720e52c5bf3b95951d5c54766de1028d20301cbd2bb6ec3fb62f9e14d7254cbf3811fe6c93", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", "description": "Login to get a valid token", "type": "text" } ], "url": { - "raw": "{{base_url}}/energyflowdiagrams/2", + "raw": "{{base_url}}/energyflowdiagrams/2000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "2" + "2000000" ] } }, @@ -2132,13 +2132,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/nodes", + "raw": "{{base_url}}/energyflowdiagrams/1000000/nodes", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "nodes" ] } @@ -2149,19 +2149,32 @@ "name": "POST Create new Node of an Energy Flow Diagram", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"10KV#3\"}}" }, "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/nodes", + "raw": "{{base_url}}/energyflowdiagrams/1000000/nodes", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "nodes" ] } @@ -2172,21 +2185,34 @@ "name": "PUT Update an Node of an Energy Flow Diagram", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"10KV Input #1\"}}" }, "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/nodes/1", + "raw": "{{base_url}}/energyflowdiagrams/1000000/nodes/3000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "nodes", - "1" + "3000000" ] } }, @@ -2196,17 +2222,30 @@ "name": "DELETE an Node of an Energy Flow Diagram", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/nodes/3", + "raw": "{{base_url}}/energyflowdiagrams/1000000/nodes/3000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "nodes", - "3" + "3000000" ] } }, @@ -2218,13 +2257,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/links", + "raw": "{{base_url}}/energyflowdiagrams/1000000/links", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "links" ] } @@ -2235,19 +2274,32 @@ "name": "POST Create new Link of an Energy Flow Diagram", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"source_node_id\":1, \"target_node_id\":2, \"meter_uuid\":\"493cd112-6295-43c6-98aa-e7f801e7b7ba\"}}" + "raw": "{\"data\":{\"source_node_id\":1000000, \"target_node_id\":1000008, \"meter_uuid\":\"eb78f7f9-f26f-463b-92fa-d9daf5b3651c\"}}" }, "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/links", + "raw": "{{base_url}}/energyflowdiagrams/1000000/links", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "links" ] } @@ -2258,21 +2310,34 @@ "name": "PUT Update a Link of an Energy Flow Diagram", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"source_node_id\":1, \"target_node_id\":4, \"meter_uuid\":\"493cd112-6295-43c6-98aa-e7f801e7b7ba\"}}" + "raw": "{\"data\":{\"source_node_id\":1000000, \"target_node_id\":1000009, \"meter_uuid\":\"eb78f7f9-f26f-463b-92fa-d9daf5b3651c\"}}" }, "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/links/1", + "raw": "{{base_url}}/energyflowdiagrams/1000000/links/3000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "links", - "1" + "3000000" ] } }, @@ -2282,17 +2347,30 @@ "name": "DELETE a Link of an Energy Flow Diagram", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/energyflowdiagrams/1/links/2", + "raw": "{{base_url}}/energyflowdiagrams/1000000/links/3000000", "host": [ "{{base_url}}" ], "path": [ "energyflowdiagrams", - "1", + "1000000", "links", - "2" + "3000000" ] } }, From fb8284ca521d21c364d5fff270842481655582ad Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Dec 2021 14:16:51 +0800 Subject: [PATCH 020/117] added access control to privilege in api and admin --- .../users/privilege/privilege.controller.js | 3 +- myems-api/MyEMS.postman_collection.json | 55 ++++++++++++++++--- myems-api/README.md | 14 ++--- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/admin/app/controllers/users/privilege/privilege.controller.js b/admin/app/controllers/users/privilege/privilege.controller.js index 30bfca59..cd2df729 100644 --- a/admin/app/controllers/users/privilege/privilege.controller.js +++ b/admin/app/controllers/users/privilege/privilege.controller.js @@ -1,6 +1,7 @@ 'use strict'; -app.controller('PrivilegeController', function ($scope, +app.controller('PrivilegeController', function ( + $scope, $window, $uibModal, PrivilegeService, diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index e97d0f14..2b93ff88 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -4345,19 +4345,32 @@ "name": "PUT Update Privilege Data", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "46a767c678fc3d1bcacda116c639ebac77dd1a8407956a0f244a7900dc9c9bf88bb0c8be668d4962bb98f0108ebfeda603a4a6cd0c2031c6a9e864d8052e279e", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"privilege 1\", \"data\":\"{\\\"spaces\\\":[1, 3]}\"}}" }, "url": { - "raw": "{{base_url}}/privileges/2", + "raw": "{{base_url}}/privileges/1", "host": [ "{{base_url}}" ], "path": [ "privileges", - "2" + "1" ] } }, @@ -4367,25 +4380,51 @@ "name": "DELETE Privilege", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "46a767c678fc3d1bcacda116c639ebac77dd1a8407956a0f244a7900dc9c9bf88bb0c8be668d4962bb98f0108ebfeda603a4a6cd0c2031c6a9e864d8052e279e", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/privileges/2", + "raw": "{{base_url}}/privileges/1", "host": [ "{{base_url}}" ], "path": [ "privileges", - "2" + "1" ] } }, "response": [] }, { - "name": "Create Privilege", + "name": "POST Create Privilege", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "46a767c678fc3d1bcacda116c639ebac77dd1a8407956a0f244a7900dc9c9bf88bb0c8be668d4962bb98f0108ebfeda603a4a6cd0c2031c6a9e864d8052e279e", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\": {\"name\": \"privilege 1\", \"data\":\"{\\\"spaces\\\":[1, 3]}\"}}" diff --git a/myems-api/README.md b/myems-api/README.md index aa28f3dc..915199ae 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1229,15 +1229,15 @@ curl -i -X GET {{base_url}}/points ``` * DELETE Point by ID ```bash -curl -i -X DELETE {{base_url}}/points/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/points/{id} ``` -* POST Point +* POST Create Point ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points ``` -* PUT Point +* PUT Update Point ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points/{id} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"ModbusPoint1", "data_source_id":1, "object_type": "ENERGY_VALUE", "units":"kWh", "low_limit":0, "high_limit":999999999, "is_trend":true, "is_virtual":false, "address":"{\"slave_id\":1, \"function_code\":3, \"offset\":1, \"number_of_registers\":2, \"data_format\":\"float\"}", "description":null}}' {{base_url}}/points/{id} ``` ### Privilege @@ -1253,11 +1253,11 @@ curl -i -X GET {{base_url}}/privileges ```bash curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/privileges/{id} ``` -* POST New Privilege +* POST Create New Privilege ```bash curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"superusers","data":"{\"spaces\":[1,2,3,5]}"}}' {{base_url}}/privileges ``` -* PUT Privilege +* PUT Update Privilege ```bash curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"superusers", "data":"{\"spaces\":[1, 3]}"}}' {{base_url}}/privileges/{id} ``` From 469c21672bad9924f7bd7c8a553a7c01cc20c20e Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Fri, 3 Dec 2021 14:58:04 +0800 Subject: [PATCH 021/117] distrbutioncircuit/distributionsystem of access_control --- .../distributioncircuit.controller.js | 21 ++++++++++++++----- .../distributioncircuitpoint.controller.js | 6 ++++-- .../distributionsystem.controller.js | 20 +++++++++++++----- .../distributioncircuit.service.js | 12 +++++------ .../distributioncircuitpoint.service.js | 8 +++---- .../distributionsystem.service.js | 12 +++++------ myems-api/core/distributioncircuit.py | 7 ++++++- myems-api/core/distributionsystem.py | 5 ++++- 8 files changed, 61 insertions(+), 30 deletions(-) diff --git a/admin/app/controllers/settings/distributionsystem/distributioncircuit.controller.js b/admin/app/controllers/settings/distributionsystem/distributioncircuit.controller.js index 7f21a276..526c5413 100644 --- a/admin/app/controllers/settings/distributionsystem/distributioncircuit.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributioncircuit.controller.js @@ -1,10 +1,18 @@ 'use strict'; -app.controller('DistributionCircuitController', function($scope, $translate, $uibModal, DistributionSystemService, DistributionCircuitService, toaster,SweetAlert) { +app.controller('DistributionCircuitController', function( + $scope, + $window, + $translate, + $uibModal, + DistributionSystemService, + DistributionCircuitService, + toaster, + SweetAlert) { $scope.distributionsystems = []; $scope.distributioncircuits = []; $scope.currentDistributionSystem = null; - + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllDistributionSystems = function() { DistributionSystemService.getAllDistributionSystems(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -48,7 +56,8 @@ app.controller('DistributionCircuitController', function($scope, $translate, $ui }); modalInstance.result.then(function(distributioncircuit) { distributioncircuit.distribution_system_id = $scope.currentDistributionSystem.id; - DistributionCircuitService.addDistributionCircuit(distributioncircuit, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionCircuitService.addDistributionCircuit(distributioncircuit, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -88,7 +97,8 @@ app.controller('DistributionCircuitController', function($scope, $translate, $ui modalInstance.result.then(function(modifiedDistributionCircuit) { modifiedDistributionCircuit.distribution_system_id = $scope.currentDistributionSystem.id; - DistributionCircuitService.editDistributionCircuit(modifiedDistributionCircuit, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionCircuitService.editDistributionCircuit(modifiedDistributionCircuit, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -126,7 +136,8 @@ app.controller('DistributionCircuitController', function($scope, $translate, $ui }, function(isConfirm) { if (isConfirm) { - DistributionCircuitService.deleteDistributionCircuit(distributioncircuit.id, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionCircuitService.deleteDistributionCircuit(distributioncircuit.id, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js index b7a63720..c97b7fd1 100644 --- a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js @@ -80,7 +80,8 @@ app.controller('DistributionCircuitPointController', function ( $scope.pairPoint = function (dragEl, dropEl) { var pointid = angular.element('#' + dragEl).scope().point.id; var distributioncircuitid = $scope.currentDistributionCircuit.id; - DistributionCircuitPointService.addPair(distributioncircuitid, pointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionCircuitPointService.addPair(distributioncircuitid, pointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -106,7 +107,8 @@ app.controller('DistributionCircuitPointController', function ( } var distributioncircuitpointid = angular.element('#' + dragEl).scope().distributioncircuitpoint.id; var distributioncircuitid = $scope.currentDistributionCircuit.id; - DistributionCircuitPointService.deletePair(distributioncircuitid, distributioncircuitpointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionCircuitPointService.deletePair(distributioncircuitid, distributioncircuitpointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/distributionsystem/distributionsystem.controller.js b/admin/app/controllers/settings/distributionsystem/distributionsystem.controller.js index 57c8f4fd..d87e8265 100644 --- a/admin/app/controllers/settings/distributionsystem/distributionsystem.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributionsystem.controller.js @@ -1,7 +1,14 @@ 'use strict'; -app.controller('DistributionSystemController', function($scope, $translate, $uibModal, DistributionSystemService, toaster,SweetAlert) { - +app.controller('DistributionSystemController', function( + $scope, + $window, + $translate, + $uibModal, + DistributionSystemService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllDistributionSystems = function() { DistributionSystemService.getAllDistributionSystems(function(response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -19,7 +26,8 @@ app.controller('DistributionSystemController', function($scope, $translate, $uib windowClass: "animated fadeIn", }); modalInstance.result.then(function(distributionsystem) { - DistributionSystemService.addDistributionSystem(distributionsystem, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionSystemService.addDistributionSystem(distributionsystem, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -58,7 +66,8 @@ app.controller('DistributionSystemController', function($scope, $translate, $uib }); modalInstance.result.then(function(modifiedDistributionSystem) { - DistributionSystemService.editDistributionSystem(modifiedDistributionSystem, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionSystemService.editDistributionSystem(modifiedDistributionSystem, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -95,7 +104,8 @@ app.controller('DistributionSystemController', function($scope, $translate, $uib closeOnCancel: true }, function (isConfirm) { if (isConfirm) { - DistributionSystemService.deleteDistributionSystem(distributionsystem, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + DistributionSystemService.deleteDistributionSystem(distributionsystem, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/distributionsystem/distributioncircuit.service.js b/admin/app/services/settings/distributionsystem/distributioncircuit.service.js index ff4be381..1c7914de 100644 --- a/admin/app/services/settings/distributionsystem/distributioncircuit.service.js +++ b/admin/app/services/settings/distributionsystem/distributioncircuit.service.js @@ -17,16 +17,16 @@ app.factory('DistributionCircuitService', function($http) { callback(response); }); }, - addDistributionCircuit: function(distributioncircuit,callback) { - $http.post(getAPI()+'/distributioncircuits',{data:distributioncircuit}) + addDistributionCircuit: function(distributioncircuit, headers, callback) { + $http.post(getAPI()+'/distributioncircuits',{data:distributioncircuit}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editDistributionCircuit: function(distributioncircuit,callback) { - $http.put(getAPI()+'/distributioncircuits/'+distributioncircuit.id,{data:distributioncircuit}) + editDistributionCircuit: function(distributioncircuit, headers, callback) { + $http.put(getAPI()+'/distributioncircuits/'+distributioncircuit.id,{data:distributioncircuit}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -34,8 +34,8 @@ app.factory('DistributionCircuitService', function($http) { }); }, - deleteDistributionCircuit: function(distributioncircuitID, callback) { - $http.delete(getAPI()+'/distributioncircuits/'+distributioncircuitID) + deleteDistributionCircuit: function(distributioncircuitID, headers, callback) { + $http.delete(getAPI()+'/distributioncircuits/'+distributioncircuitID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/distributionsystem/distributioncircuitpoint.service.js b/admin/app/services/settings/distributionsystem/distributioncircuitpoint.service.js index c2ca6420..ab56348c 100644 --- a/admin/app/services/settings/distributionsystem/distributioncircuitpoint.service.js +++ b/admin/app/services/settings/distributionsystem/distributioncircuitpoint.service.js @@ -1,8 +1,8 @@ 'use strict'; app.factory('DistributionCircuitPointService', function($http) { return { - addPair: function(distributioncircuitID,pointID,callback) { - $http.post(getAPI()+'distributioncircuits/'+distributioncircuitID+'/points',{data:{'point_id':pointID}}) + addPair: function(distributioncircuitID,pointID, headers, callback) { + $http.post(getAPI()+'distributioncircuits/'+distributioncircuitID+'/points',{data:{'point_id':pointID}}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -10,8 +10,8 @@ app.factory('DistributionCircuitPointService', function($http) { }); }, - deletePair: function(distributioncircuitID,pointID, callback) { - $http.delete(getAPI()+'distributioncircuits/'+distributioncircuitID+'/points/'+pointID) + deletePair: function(distributioncircuitID,pointID, headers, callback) { + $http.delete(getAPI()+'distributioncircuits/'+distributioncircuitID+'/points/'+pointID, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/distributionsystem/distributionsystem.service.js b/admin/app/services/settings/distributionsystem/distributionsystem.service.js index 358cf58a..19ba3b99 100644 --- a/admin/app/services/settings/distributionsystem/distributionsystem.service.js +++ b/admin/app/services/settings/distributionsystem/distributionsystem.service.js @@ -17,24 +17,24 @@ app.factory('DistributionSystemService', function($http) { callback(response); }); }, - addDistributionSystem: function(distributionsystem, callback) { - $http.post(getAPI()+'distributionsystems',{data:distributionsystem}) + addDistributionSystem: function(distributionsystem, headers, callback) { + $http.post(getAPI()+'distributionsystems',{data:distributionsystem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editDistributionSystem: function(distributionsystem, callback) { - $http.put(getAPI()+'distributionsystems/'+distributionsystem.id,{data:distributionsystem}) + editDistributionSystem: function(distributionsystem, headers, callback) { + $http.put(getAPI()+'distributionsystems/'+distributionsystem.id,{data:distributionsystem}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteDistributionSystem: function(distributionsystem, callback) { - $http.delete(getAPI()+'distributionsystems/'+distributionsystem.id) + deleteDistributionSystem: function(distributionsystem, headers, callback) { + $http.delete(getAPI()+'distributionsystems/'+distributionsystem.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/core/distributioncircuit.py b/myems-api/core/distributioncircuit.py index e4ac8d7d..d6bd8f6a 100644 --- a/myems-api/core/distributioncircuit.py +++ b/myems-api/core/distributioncircuit.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class DistributionCircuitCollection: @@ -63,6 +63,7 @@ class DistributionCircuitCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -232,6 +233,7 @@ class DistributionCircuitItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_DISTRIBUTION_CIRCUIT_ID') @@ -264,6 +266,7 @@ class DistributionCircuitItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -440,6 +443,7 @@ class DistributionCircuitPointCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -507,6 +511,7 @@ class DistributionCircuitPointItem: @staticmethod @user_logger def on_delete(req, resp, id_, pid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_DISTRIBUTION_CIRCUIT_ID') diff --git a/myems-api/core/distributionsystem.py b/myems-api/core/distributionsystem.py index d1385da8..f0dce86e 100644 --- a/myems-api/core/distributionsystem.py +++ b/myems-api/core/distributionsystem.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class DistributionSystemCollection: @@ -47,6 +47,7 @@ class DistributionSystemCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -146,6 +147,7 @@ class DistributionSystemItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_DISTRIBUTION_SYSTEM_ID') @@ -186,6 +188,7 @@ class DistributionSystemItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: From 2eaa8df6c6cc22eb727c26d3e221b700d726d7f3 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Fri, 3 Dec 2021 16:36:48 +0800 Subject: [PATCH 022/117] added access control to sensor --- .../settings/sensor/sensor.controller.js | 14 +++++++++----- .../settings/sensor/sensorpoint.controller.js | 6 ++++-- .../app/services/settings/sensor/sensor.service.js | 12 ++++++------ .../settings/sensor/sensorpoint.service.js | 4 ++-- myems-api/core/sensor.py | 7 ++++++- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/admin/app/controllers/settings/sensor/sensor.controller.js b/admin/app/controllers/settings/sensor/sensor.controller.js index ee242f3f..b4ee268a 100644 --- a/admin/app/controllers/settings/sensor/sensor.controller.js +++ b/admin/app/controllers/settings/sensor/sensor.controller.js @@ -1,7 +1,7 @@ 'use strict'; -app.controller('SensorController', function($scope, $translate, $uibModal, SensorService, toaster, SweetAlert) { - +app.controller('SensorController', function($scope, $window, $translate, $uibModal, SensorService, toaster, SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllSensors = function() { SensorService.getAllSensors(function (response) { if (angular.isDefined(response.status) && response.status === 200) { @@ -27,7 +27,9 @@ app.controller('SensorController', function($scope, $translate, $uibModal, Sens } }); modalInstance.result.then(function(sensor) { - SensorService.addSensor(sensor, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + SensorService.addSensor(sensor, {headers}, + function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -67,7 +69,8 @@ app.controller('SensorController', function($scope, $translate, $uibModal, Sens }); modalInstance.result.then(function(modifiedSensor) { - SensorService.editSensor(modifiedSensor, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + SensorService.editSensor(modifiedSensor, {headers}, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -105,7 +108,8 @@ app.controller('SensorController', function($scope, $translate, $uibModal, Sens }, function(isConfirm) { if (isConfirm) { - SensorService.deleteSensor(sensor, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + SensorService.deleteSensor(sensor, {headers}, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/sensor/sensorpoint.controller.js b/admin/app/controllers/settings/sensor/sensorpoint.controller.js index c2b6839c..b4c58ee4 100644 --- a/admin/app/controllers/settings/sensor/sensorpoint.controller.js +++ b/admin/app/controllers/settings/sensor/sensorpoint.controller.js @@ -80,7 +80,8 @@ app.controller('SensorPointController', function ( $scope.pairPoint = function (dragEl, dropEl) { var pointid = angular.element('#' + dragEl).scope().point.id; var sensorid = $scope.currentSensor.id; - SensorPointService.addPair(sensorid, pointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + SensorPointService.addPair(sensorid, pointid, {headers}, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -106,7 +107,8 @@ app.controller('SensorPointController', function ( } var sensorpointid = angular.element('#' + dragEl).scope().sensorpoint.id; var sensorid = $scope.currentSensor.id; - SensorPointService.deletePair(sensorid, sensorpointid, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + SensorPointService.deletePair(sensorid, sensorpointid, {headers}, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/services/settings/sensor/sensor.service.js b/admin/app/services/settings/sensor/sensor.service.js index 1282799b..e28b6e59 100644 --- a/admin/app/services/settings/sensor/sensor.service.js +++ b/admin/app/services/settings/sensor/sensor.service.js @@ -17,24 +17,24 @@ app.factory('SensorService', function($http) { callback(response); }); }, - addSensor: function(sensor, callback) { - $http.post(getAPI()+'sensors',{data:sensor}) + addSensor: function(sensor, headers, callback) { + $http.post(getAPI()+'sensors',{data:sensor}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - editSensor: function(sensor, callback) { - $http.put(getAPI()+'sensors/'+sensor.id,{data:sensor}) + editSensor: function(sensor, headers, callback) { + $http.put(getAPI()+'sensors/'+sensor.id,{data:sensor}, {headers}) .then(function (response) { callback(response); }, function (response) { callback(response); }); }, - deleteSensor: function(sensor, callback) { - $http.delete(getAPI()+'sensors/'+sensor.id) + deleteSensor: function(sensor, headers, callback) { + $http.delete(getAPI()+'sensors/'+sensor.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/app/services/settings/sensor/sensorpoint.service.js b/admin/app/services/settings/sensor/sensorpoint.service.js index d2f614de..c12cd976 100644 --- a/admin/app/services/settings/sensor/sensorpoint.service.js +++ b/admin/app/services/settings/sensor/sensorpoint.service.js @@ -1,7 +1,7 @@ 'use strict'; app.factory('SensorPointService', function($http) { return { - addPair: function(sensorID,pointID,callback) { + addPair: function(sensorID,pointID, headers, callback) { $http.post(getAPI()+'sensors/'+sensorID+'/points',{data:{'point_id':pointID}}) .then(function (response) { callback(response); @@ -10,7 +10,7 @@ app.factory('SensorPointService', function($http) { }); }, - deletePair: function(sensorID,pointID, callback) { + deletePair: function(sensorID,pointID, headers, callback) { $http.delete(getAPI()+'sensors/'+sensorID+'/points/'+pointID) .then(function (response) { callback(response); diff --git a/myems-api/core/sensor.py b/myems-api/core/sensor.py index b8984ed8..9c15b6d3 100644 --- a/myems-api/core/sensor.py +++ b/myems-api/core/sensor.py @@ -3,7 +3,7 @@ import simplejson as json import mysql.connector import config import uuid -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class SensorCollection: @@ -44,6 +44,7 @@ class SensorCollection: @user_logger def on_post(req, resp): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -133,6 +134,7 @@ class SensorItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_SENSOR_ID') @@ -209,6 +211,7 @@ class SensorItem: @user_logger def on_put(req, resp, id_): """Handles PUT requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -320,6 +323,7 @@ class SensorPointCollection: @user_logger def on_post(req, resp, id_): """Handles POST requests""" + access_control(req) try: raw_json = req.stream.read().decode('utf-8') except Exception as ex: @@ -387,6 +391,7 @@ class SensorPointItem: @staticmethod @user_logger def on_delete(req, resp, id_, pid): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_SENSOR_ID') From 0edaf58aeea2431c9b53a982495e2dc53925594e Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Fri, 3 Dec 2021 16:42:18 +0800 Subject: [PATCH 023/117] added access control to sensorpoint --- admin/app/services/settings/sensor/sensorpoint.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/app/services/settings/sensor/sensorpoint.service.js b/admin/app/services/settings/sensor/sensorpoint.service.js index c12cd976..365771a1 100644 --- a/admin/app/services/settings/sensor/sensorpoint.service.js +++ b/admin/app/services/settings/sensor/sensorpoint.service.js @@ -2,7 +2,7 @@ app.factory('SensorPointService', function($http) { return { addPair: function(sensorID,pointID, headers, callback) { - $http.post(getAPI()+'sensors/'+sensorID+'/points',{data:{'point_id':pointID}}) + $http.post(getAPI()+'sensors/'+sensorID+'/points',{data:{'point_id':pointID}}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -11,7 +11,7 @@ app.factory('SensorPointService', function($http) { }, deletePair: function(sensorID,pointID, headers, callback) { - $http.delete(getAPI()+'sensors/'+sensorID+'/points/'+pointID) + $http.delete(getAPI()+'sensors/'+sensorID+'/points/'+pointID, {headers}) .then(function (response) { callback(response); }, function (response) { From 4e0961e5fbb01c6bad3640db86a6b8546b40bfee Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Dec 2021 19:09:39 +0800 Subject: [PATCH 024/117] added access control to distribution system in api and admin --- .../distributioncircuitpoint.controller.js | 10 +- myems-api/MyEMS.postman_collection.json | 173 ++++++--- myems-api/README.md | 342 +++++++++--------- 3 files changed, 293 insertions(+), 232 deletions(-) diff --git a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js index c97b7fd1..96e4abe8 100644 --- a/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js +++ b/admin/app/controllers/settings/distributionsystem/distributioncircuitpoint.controller.js @@ -49,11 +49,11 @@ app.controller('DistributionCircuitPointController', function ( }); }; - $scope.changeDistributionCircuit=function(item,model){ - $scope.currentDistributionCircuit=item; - $scope.currentDistributionCircuit.selected=model; - $scope.getPointsByDistributionCircuitID($scope.currentDistributionCircuit.id); - }; + $scope.changeDistributionCircuit=function(item,model){ + $scope.currentDistributionCircuit=item; + $scope.currentDistributionCircuit.selected=model; + $scope.getPointsByDistributionCircuitID($scope.currentDistributionCircuit.id); + }; $scope.changeDataSource = function (item, model) { $scope.currentDataSource = model; diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 2b93ff88..75145af6 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1301,7 +1301,20 @@ "name": "POST Create Distribution System", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"示例配电系统2\", \"svg\":\"Four separate rectangles\", \"description\":\"demo description\"}}" @@ -1322,7 +1335,20 @@ "name": "DELETE Distribution Systems by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/distributionsystems/2", "host": [ @@ -1340,7 +1366,20 @@ "name": "PUT Update Distribution System by ID", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"示例配电系统1\", \"svg\":\"Four separate rectangles\", \"description\":\"demo description\"}}" @@ -1376,49 +1415,6 @@ } }, "response": [] - }, - { - "name": "POST Bind Distribution Circuit to Distribution System", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\"data\":{\"distribution_circuit_id\":\"1\"}}" - }, - "url": { - "raw": "{{base_url}}/distributionsystems/1/distributioncircuits", - "host": [ - "{{base_url}}" - ], - "path": [ - "distributionsystems", - "1", - "distributioncircuits" - ] - } - }, - "response": [] - }, - { - "name": "DELETE Unbind Distribution Circuit from Distribution System", - "request": { - "method": "DELETE", - "header": [], - "url": { - "raw": "{{base_url}}/distributionsystems/1/distributioncircuits/1", - "host": [ - "{{base_url}}" - ], - "path": [ - "distributionsystems", - "1", - "distributioncircuits", - "1" - ] - } - }, - "response": [] } ] }, @@ -1464,7 +1460,20 @@ "name": "POST Create new Distribution Circuit", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"51W92\", \"distribution_system_id\":1, \"distribution_room\":\"EW1\", \"switchgear\":\"51AL9\", \"peak_load\": 30, \"peak_current\": 53.6, \"customers\": \"地下室应急照明\", \"meters\": \"ALE-1102, ALE-1082\"}}" @@ -1485,7 +1494,20 @@ "name": "DELETE a Distribution Circuit by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/distributioncircuits/2", "host": [ @@ -1503,7 +1525,20 @@ "name": "PUT Update Distribution Circuit by ID", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"51W91\", \"distribution_system_id\":1, \"distribution_room\":\"EW1\", \"switchgear\":\"51AL9\", \"peak_load\": 30, \"peak_current\": 53.6, \"customers\": \"地下室应急照明\", \"meters\": \"ALE-1102, ALE-1082\"}}" @@ -1525,10 +1560,23 @@ "name": "POST Bind Point to Distribution Circuit", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"point_id\":\"1\"}}" + "raw": "{\"data\":{\"point_id\":\"2\"}}" }, "url": { "raw": "{{base_url}}/distributioncircuits/1/points", @@ -1567,9 +1615,22 @@ "name": "DELETE Unbind Point from Distribution Circuit", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "bd16461ce31dca5c026ee17b1e6e10167d7558230fc6387b4149819a1a2b0d19b87b72687fa488ee41b358b7d229ab44f1011968308c0cf3e9d379e6ae6b2565", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/distributioncircuits/1/points/1", + "raw": "{{base_url}}/distributioncircuits/1/points/2", "host": [ "{{base_url}}" ], @@ -1577,7 +1638,7 @@ "distributioncircuits", "1", "points", - "1" + "2" ] } }, @@ -3644,7 +3705,7 @@ "response": [] }, { - "name": "POST Meter Point Relation", + "name": "POST Bind Point to Meter", "request": { "method": "POST", "header": [ @@ -3699,7 +3760,7 @@ "response": [] }, { - "name": "DELETE Meter Point Relation", + "name": "DELETE Unbind Point from Meter", "request": { "method": "DELETE", "header": [ diff --git a/myems-api/README.md b/myems-api/README.md index 915199ae..e3629388 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -301,15 +301,15 @@ curl -i -X GET {{base_url}}/costcenters ``` * DELETE Cost Center by ID ```bash -curl -i -X DELETE {{base_url}}/costcenters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/costcenters/{id} ``` * POST Create New Cost Center ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"动力中心", "external_id":"21829198980001"}}' {{base_url}}/costcenters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"动力中心", "external_id":"21829198980001"}}' {{base_url}}/costcenters ``` * PUT Update a Cost Center ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力中心2", "external_id":"21829198980002"}}' {{base_url}}/costcenters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"动力中心2", "external_id":"21829198980002"}}' {{base_url}}/costcenters/{id} ``` * GET All Tariffs associated with Cost Center ID ```bash @@ -317,11 +317,11 @@ curl -i -X GET {{base_url}}/costcenters/{id}/tariffs ``` * POST Create a Cost Center and Tariff Relation ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tariff_id":"3"}}' {{base_url}}/costcenters/{id}/tariffs +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"tariff_id":"3"}}' {{base_url}}/costcenters/{id}/tariffs ``` * DELETE a Cost Center and Tariff Relation by tid ```bash -curl -i -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid} ``` ### Cost File @@ -380,23 +380,23 @@ Result in JSON * GET all Data Sources ```bash -curl -i -X GET {{base_url}}/datasources +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/datasources ``` * DELETE Data Source by ID ```bash -curl -i -X DELETE {{base_url}}/datasources/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/datasources/{id} ``` * POST Data Source ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.88\", \"port\":502}"}}' {{base_url}}/datasources +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.88\", \"port\":502}"}}' {{base_url}}/datasources ``` * PUT Data Source ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.99\", \"port\":502}"}}' {{base_url}}/datasources/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Modbus1", "gateway_id":1, "protocol":"modbus-tcp", "connection":"{\"host\":\"10.1.2.99\", \"port\":502}"}}' {{base_url}}/datasources/{id} ``` * GET all points of the Data Source by ID ```bash -curl -i -X GET {{base_url}}/datasources/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/datasources/{id}/points ``` ### Distribution Circuit @@ -424,17 +424,17 @@ Result in JSON ```bash curl -i -X GET {{base_url}}/distributioncircuits ``` -* DELETE a Distribution Circuit by ID -```bash -curl -i -X DELETE {{base_url}}/distributioncircuits/{id} -``` * POST Create new Distribution Circuit ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"51W91", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"51W91", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits ``` -* PUT Update a Distribution Circuit +* DELETE a Distribution Circuit by ID ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"51W92", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/distributioncircuits/{id} +``` +* PUT Update a Distribution Circuit by ID +```bash +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"51W92", "distribution_system_id":1, "distribution_room":"EW1", "switchgear":"51AL9", "peak_load": 30, "peak_current": 53.6, "customers": "地下室应急照明", "meters": "ALE-1102, ALE-1082"}}' {{base_url}}/distributioncircuits/{id} ``` * GET All Points associated with Distribution Circuit ID ```bash @@ -442,11 +442,11 @@ curl -i -X GET {{base_url}}/distributioncircuits/{id}/points ``` * POST Bind Point to Distribution Circuit ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/distributioncircuits/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"1"}}' {{base_url}}/distributioncircuits/{id}/points ``` * DELETE Unbind Point from Distribution Circuit ```bash -curl -i -X DELETE {{base_url}}/distributioncircuits/{id}/points/{pid} +curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/distributioncircuits/{id}/points/{pid} ``` ### Distribution System @@ -471,15 +471,15 @@ curl -i -X GET {{base_url}}/distributionsystems ``` * DELETE a Distribution System by ID ```bash -curl -i -X DELETE {{base_url}}/distributionsystems/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/distributionsystems/{id} ``` * POST Create new Distribution System ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems ``` * PUT Update a Distribution System ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"示例配电系统", "svg":"Four separate rectangles", "description":"demo description"}}' {{base_url}}/distributionsystems/{id} ``` * GET All Distribution Circuits associated with Distribution Circuit ```bash @@ -512,7 +512,7 @@ curl -i -X GET {{base_url}}/emailmessages/from/{startdate}/to/{enddate} ``` * DELETE an Email Message by ID ```bash -curl -i -X DELETE {{base_url}}/emailmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/emailmessages/{id} ``` ### Email Server @@ -539,15 +539,15 @@ curl -i -X GET {{base_url}}/emailservers ``` * DELETE an Email Server by ID ```bash -curl -i -X DELETE {{base_url}}/emailservers/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/emailservers/{id} ``` * POST Create New Email Server ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"host":"smtp.163.com","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@163.com"}}' {{base_url}}/emailservers +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"host":"smtp.163.com","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@163.com"}}' {{base_url}}/emailservers ``` * PUT Update an Email Server ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"host":"smtp.myems.io","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@myems.io"}}' {{base_url}}/emailservers/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"host":"smtp.myems.io","port":25, "requires_authentication":true, "user_name":"myems" , "password":"!MyEMS1" , "from_addr":"myems@myems.io"}}' {{base_url}}/emailservers/{id} ``` ### Energy Category @@ -703,19 +703,19 @@ curl -i -X GET {{base_url}}/equipments ``` * DELETE Equipment by ID ```bash -curl -i -X DELETE {{base_url}}/equipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/equipments/{id} ``` * POST Create an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments ``` * PUT Update an Equipment ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/equipments/{id} ``` * POST Clone an Equipment ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/equipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/equipments/{id} ``` * GET All Meters of Equipment by ID ```bash @@ -723,11 +723,11 @@ curl -i -X GET {{base_url}}/equipments/{id}/meters ``` * POST Bind a Meter to an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/equipments/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/equipments/{id}/meters ``` * DELETE a Meter from an Equipment ```bash -curl -i -X DELETE {{base_url}}/equipments/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/equipments/{id}/meters/{mid} ``` * GET All Parameters of Equipment by ID ```bash @@ -753,19 +753,19 @@ Result * POST Create a constant Parameter for an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters ``` * POST Create a point Parameter for an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/equipments/{id}/parameters ``` * POST Create a meter Parameter for an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/equipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/equipments/{id}/parameters ``` * DELETE a Parameter from an Equipment ```bash -curl -i -X DELETE {{base_url}}/equipments/{id}/parameters/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/equipments/{id}/parameters/{pid} ``` * GET All Offline Meters of Equipment by ID ```bash @@ -773,11 +773,11 @@ curl -i -X GET {{base_url}}/equipments/{id}/offlinemeters ``` * POST Bind an Offline Meter to an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/equipments/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/equipments/{id}/offlinemeters ``` * DELETE an Offline Meter from an Equipment ```bash -curl -i -X DELETE {{base_url}}/equipments/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/equipments/{id}/offlinemeters/{mid} ``` * GET All Virtual Meters of Equipment by ID ```bash @@ -785,11 +785,11 @@ curl -i -X GET {{base_url}}/equipments/{id}/virtualmeters ``` * POST Bind Virtual Meter to an Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/equipments/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/equipments/{id}/virtualmeters ``` * DELETE an Virtual Meter from an Equipment ```bash -curl -i -X DELETE {{base_url}}/equipments/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/equipments/{id}/virtualmeters/{mid} ``` ### Combined Equipment @@ -815,19 +815,19 @@ curl -i -X GET {{base_url}}/combinedequipments ``` * DELETE a Combined Equipment by ID ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id} ``` * POST Create a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":false, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments ``` * PUT Update a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Chiller Plant", "is_input_counted":true, "is_output_counted":true, "cost_center_id":1, "description":"equipment description"}}' {{base_url}}/combinedequipments/{id} ``` * POST Clone a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/combinedequipments/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{}}' {{base_url}}/combinedequipments/{id} ``` * GET All Equipments of a Combined Equipment by ID ```bash @@ -835,11 +835,11 @@ curl -i -X GET {{base_url}}/combinedequipments/{id}/equipments ``` * POST Bind an Equipment to a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/combinedequipments/{id}/equipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/combinedequipments/{id}/equipments ``` * DELETE an Equipment from a Combined Equipment ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id}/equipments/{eid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id}/equipments/{eid} ``` * GET All Meters of a Combined Equipment by ID ```bash @@ -847,11 +847,11 @@ curl -i -X GET {{base_url}}/combinedequipments/{id}/meters ``` * POST Bind a Meter to a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/combinedequipments/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/combinedequipments/{id}/meters ``` * DELETE a Meter from a Combined Equipment ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id}/meters/{mid} ``` * GET All Parameters of a Combined Equipment by ID ```bash @@ -877,19 +877,19 @@ Result * POST Create a constant Parameter for a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"constant", "constant":"test constant", "point_id":null, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters ``` * POST Create a point Parameter for a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"point", "constant":null, "point_id":1, "numerator_meter_uuid":null, "denominator_meter_uuid":null}}' {{base_url}}/combinedequipments/{id}/parameters ``` * POST Create a meter Parameter for a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/combinedequipments/{id}/parameters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"test parameter", "parameter_type":"fraction", "constant":null, "point_id":null, "numerator_meter_uuid":"89ff5118-d0c2-4dd8-8098-a8698189b2ea", "denominator_meter_uuid":"5ca62d2a-908e-40c5-a6b5-a8e436d60db4"}}' {{base_url}}/combinedequipments/{id}/parameters ``` * DELETE a Parameter from a Combined Equipment ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id}/parameters/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id}/parameters/{pid} ``` * GET All Offline Meters of a Combined Equipment by ID ```bash @@ -897,11 +897,11 @@ curl -i -X GET {{base_url}}/combinedequipments/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/combinedequipments/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/combinedequipments/{id}/offlinemeters ``` * DELETE an Offline Meter from a Combined Equipment ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id}/offlinemeters/{mid} ``` * GET All Virtual Meters of a Combined Equipment by ID ```bash @@ -909,11 +909,11 @@ curl -i -X GET {{base_url}}/combinedequipments/{id}/virtualmeters ``` * POST Bind Virtual Meter to a Combined Equipment ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/combinedequipments/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/combinedequipments/{id}/virtualmeters ``` * DELETE an Virtual Meter from a Combined Equipment ```bash -curl -i -X DELETE {{base_url}}/combinedequipments/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/combinedequipments/{id}/virtualmeters/{mid} ``` ### Gateway @@ -935,19 +935,19 @@ Result in JSON * GET all Gateways ```bash -curl -i -X GET {{base_url}}/gateways +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/gateways ``` * DELETE Gateway by ID ```bash -curl -i -X DELETE {{base_url}}/gateways/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/gateways/{id} ``` * POST Gateway ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Gateway 1"}}' {{base_url}}/gateways +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Gateway 1"}}' {{base_url}}/gateways ``` * PUT Gateway ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Gateway #1"}}' {{base_url}}/gateways/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Gateway #1"}}' {{base_url}}/gateways/{id} ``` * GET all data sources of the Gateway by ID ```bash @@ -977,7 +977,7 @@ curl -i -X GET {{base_url}}/knowledgefiles ``` * DELETE a Knowledge File by id ```bash -curl -i -X DELETE {{base_url}}/knowledgefiles/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/knowledgefiles/{id} ``` * POST Upload a Knowledge File (call users login API to get 'User-UUID' and 'Token') @@ -1010,7 +1010,7 @@ curl -i -X GET {{base_url}}/menus ``` * PUT Update a Menu ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id} ``` * Get All Menus for Web UI ```bash @@ -1049,17 +1049,17 @@ curl -i -X GET {{base_url}}/meters ``` * DELETE Meter by ID ```bash -curl -i -X DELETE {{base_url}}/meters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/meters/{id} ``` * POST Create a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters ``` * PUT Update a Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"PM20", "energy_category_id":1, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "is_counted":true, "cost_center_id":1, "energy_item_id":1, "master_meter_id":1, "description":"空调用电"}}' {{base_url}}/meters/{id} ``` -* GET All Submeters of Meter by ID +* GET All Sub-meters of Meter by ID ```bash curl -i -X GET {{base_url}}/meters/{id}/submeters ``` @@ -1067,11 +1067,11 @@ curl -i -X GET {{base_url}}/meters/{id}/submeters ```bash curl -i -X GET {{base_url}}/meters/{id}/points ``` -* POST Meter Point Relation +* POST Bind Point to Meter ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/meters/{id}/points ``` -* DELETE Meter Point Relation +* DELETE Unbind Point from Meter ```bash curl -i -H "User-UUID: dcdb67d1-6116-4987-916f-6fc6cf2bc0e4" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/meters/{id}/points/{pid} ``` @@ -1139,15 +1139,15 @@ curl -i -X GET {{base_url}}/offlinemeters ``` * DELETE Offline Meter by ID ```bash -curl -i -X DELETE {{base_url}}/offlinemeters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/offlinemeters/{id} ``` -* POST Create a Offline Meter +* POST Create an Offline Meter ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters ``` -* PUT Update a Offline Meter +* PUT Update an Offline Meter ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"OfflinePM20", "energy_category_id":1, "is_counted":true, "hourly_low_limit":0.000, "hourly_high_limit":999.999, "cost_center_id":1, "energy_item_id":1, "description":"空调用电"}}' {{base_url}}/offlinemeters/{id} ``` ### Offline Meter File @@ -1173,7 +1173,7 @@ curl -i -X GET {{base_url}}/offlinemeterfiles ``` * DELETE an Offline Meter File by ID ```bash -curl -i -X DELETE {{base_url}}/offlinemeterfiles/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/offlinemeterfiles/{id} ``` * POST Upload an Offline Meter File (call users login API to get 'User-UUID' and 'Token') @@ -1291,15 +1291,15 @@ curl -i -X GET {{base_url}}/rules ``` * DELETE a Rule by ID ```bash -curl -i -X DELETE {{base_url}}/rules/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/rules/{id} ``` * POST Create New Rule ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules ``` * PUT Update a Rule ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Space Energy Consumption Over Limit", "fdd_code":"SPACE01", "category":"SPACE", "priority":"HIGH", "channel":"WEB", "expression":"{\"space_id\":1, \"high_limit\":1000.000}", "message_template":"%s截止到目前电耗%s,超标%s。", "is_enabled":true}}' {{base_url}}/rules/{id} ``` ### Sensor @@ -1323,15 +1323,15 @@ curl -i -X GET {{base_url}}/sensors ``` * DELETE a Sensor by ID ```bash -curl -i -X DELETE {{base_url}}/sensors/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/sensors/{id} ``` * POST Create New Sensor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors ``` * PUT Update a Sensor ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors/{id} ``` * GET All Points associated with Sensor ID ```bash @@ -1339,11 +1339,11 @@ curl -i -X GET {{base_url}}/sensors/{id}/points ``` * POST Sensor Point Relation ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/sensors/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/sensors/{id}/points ``` * DELETE Sensor Point Relation ```bash -curl -i -X DELETE {{base_url}}/sensors/{id}/points/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/sensors/{id}/points/{pid} ``` ### Shopfloor @@ -1370,15 +1370,15 @@ curl -i -X GET {{base_url}}/shopfloors ``` * DELETE a Shopfloor by ID ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id} ``` * POST Create a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors ``` * PUT Update a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMS Shopfloor", "area":999.99, "is_input_counted":true, "contact_id":1, "cost_center_id":1, "description":"Shopfloor description"}}' {{base_url}}/shopfloors/{id} ``` * GET All Equipments of Shopfloor by ID ```bash @@ -1386,11 +1386,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/equipments ``` * POST Bind Equipment to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/shopfloors/{id}/equipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/shopfloors/{id}/equipments ``` * DELETE Equipment from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/equipments/{eid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/equipments/{eid} ``` * GET All Meters of Shopfloor by ID ```bash @@ -1398,11 +1398,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/meters ``` * POST Bind a Meter to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/shopfloors/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/shopfloors/{id}/meters ``` * DELETE a Meter from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/meters/{mid} ``` * GET All Offline Meters of Shopfloor by ID ```bash @@ -1410,11 +1410,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/shopfloors/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/shopfloors/{id}/offlinemeters ``` * DELETE an Offline Meter from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/offlinemeters/{mid} ``` * GET All Points of Shopfloor by ID ```bash @@ -1422,11 +1422,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/points ``` * POST Bind a Point to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/shopfloors/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/shopfloors/{id}/points ``` * DELETE a Point from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/points/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/points/{pid} ``` * GET All Sensors of Shopfloor by ID ```bash @@ -1434,11 +1434,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/sensors ``` * POST Bind a Sensor to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/shopfloors/{id}/sensors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/shopfloors/{id}/sensors ``` * DELETE a Sensor from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/sensors/{sid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/sensors/{sid} ``` * GET All Virtual Meters of Shopfloor by ID ```bash @@ -1446,11 +1446,11 @@ curl -i -X GET {{base_url}}/shopfloors/{id}/virtualmeters ``` * POST Bind Virtual Meter to a Shopfloor ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/shopfloors/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/shopfloors/{id}/virtualmeters ``` * DELETE Virtual Meter from Shopfloor ```bash -curl -i -X DELETE {{base_url}}/shopfloors/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/shopfloors/{id}/virtualmeters/{mid} ``` ### Space @@ -1480,15 +1480,15 @@ curl -i -X GET {{base_url}}/spaces ``` * DELETE Space by ID ```bash -curl -i -X DELETE {{base_url}}/spaces/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id} ``` * POST Create a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMSSpace", "parent_space_id":1, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":false, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"MyEMSSpace", "parent_space_id":1, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":false, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces ``` * PUT Update a Space ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMSSpace", "parent_space_id":2, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":true, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"MyEMSSpace", "parent_space_id":2, "area":999.99, "timezone_id":56, "is_input_counted":true, "is_output_counted":true, "contact_id":1, "cost_center_id":1, "description":"Space description"}}' {{base_url}}/spaces/{id} ``` * GET All Children of Space by ID ```bash @@ -1500,11 +1500,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/combinedequipments ``` * POST Bind a Combined Equipment to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"combined_equipment_id":1}}' {{base_url}}/spaces/{id}/equipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"combined_equipment_id":1}}' {{base_url}}/spaces/{id}/equipments ``` * DELETE a Combined Equipment from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/combinedequipments/{eid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/combinedequipments/{eid} ``` * GET All Equipments of Space by ID ```bash @@ -1512,11 +1512,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/equipments ``` * POST Bind Equipment to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/spaces/{id}/equipments +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"equipment_id":1}}' {{base_url}}/spaces/{id}/equipments ``` * DELETE Equipment from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/equipments/{eid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/equipments/{eid} ``` * GET All Meters of Space by ID ```bash @@ -1524,11 +1524,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/meters ``` * POST Bind a Meter to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/spaces/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/spaces/{id}/meters ``` * DELETE a Meter from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/meters/{mid} ``` * GET All Offline Meters of Space by ID ```bash @@ -1536,11 +1536,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/spaces/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/spaces/{id}/offlinemeters ``` * DELETE an Offline Meter from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/offlinemeters/{mid} ``` * GET All Points of Space by ID ```bash @@ -1548,11 +1548,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/points ``` * POST Bind a Point to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/spaces/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/spaces/{id}/points ``` * DELETE a Point from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/points/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/points/{pid} ``` * GET All Sensors of Space by ID ```bash @@ -1560,11 +1560,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/sensors ``` * POST Bind a Sensor to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/spaces/{id}/sensors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/spaces/{id}/sensors ``` * DELETE a Sensor from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/sensors/{sid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/sensors/{sid} ``` * GET All Stores of Space by ID ```bash @@ -1572,11 +1572,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/stores ``` * POST Bind a Store to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"store_id":1}}' {{base_url}}/spaces/{id}/stores +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"store_id":1}}' {{base_url}}/spaces/{id}/stores ``` * DELETE a Store from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/stores/{tid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/stores/{tid} ``` * GET All Tenants of Space by ID ```bash @@ -1584,11 +1584,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/tenants ``` * POST Bind a Tenant to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tenant_id":1}}' {{base_url}}/spaces/{id}/tenants +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"tenant_id":1}}' {{base_url}}/spaces/{id}/tenants ``` * DELETE a Tenant from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/tenants/{tid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/tenants/{tid} ``` * GET All Virtual Meters of Space by ID ```bash @@ -1596,11 +1596,11 @@ curl -i -X GET {{base_url}}/spaces/{id}/virtualmeters ``` * POST Bind Virtual Meter to a Space ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/spaces/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/spaces/{id}/virtualmeters ``` * DELETE Virtual Meter from Space ```bash -curl -i -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/spaces/{id}/virtualmeters/{mid} ``` * GET Space Tree of User ```bash @@ -1635,15 +1635,15 @@ curl -i -X GET {{base_url}}/stores ``` * POST Create New Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":418.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":418.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores ``` * PUT Update a Store ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":818.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"麦当劳(新王府井店)", "address":"北京市东城区王府井大街200号工美大厦1层010-65120499", "latitude":39.909429, "longitude":116.416993, "area":818.8, "store_type_id":9, "is_input_counted": true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/stores/{id} ``` * DELETE Store by ID ```bash -curl -i -X DELETE {{base_url}}/stores/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id} ``` * GET All Meters of Store by ID ```bash @@ -1651,11 +1651,11 @@ curl -i -X GET {{base_url}}/stores/{id}/meters ``` * POST Bind a Meter to a Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/stores/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/stores/{id}/meters ``` * DELETE a Meter from Store ```bash -curl -i -X DELETE {{base_url}}/stores/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id}/meters/{mid} ``` * GET All Offline Meters of Store by ID ```bash @@ -1663,11 +1663,11 @@ curl -i -X GET {{base_url}}/stores/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/stores/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/stores/{id}/offlinemeters ``` * DELETE an Offline Meter from Store ```bash -curl -i -X DELETE {{base_url}}/stores/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id}/offlinemeters/{mid} ``` * GET All Points of Store by ID ```bash @@ -1675,11 +1675,11 @@ curl -i -X GET {{base_url}}/stores/{id}/points ``` * POST Bind a Point to a Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/stores/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/stores/{id}/points ``` * DELETE a Point from Store ```bash -curl -i -X DELETE {{base_url}}/stores/{id}/points/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id}/points/{pid} ``` * GET All Sensors of Store by ID ```bash @@ -1687,11 +1687,11 @@ curl -i -X GET {{base_url}}/stores/{id}/sensors ``` * POST Bind a Sensor to a Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/stores/{id}/sensors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/stores/{id}/sensors ``` * DELETE a Sensor from Store ```bash -curl -i -X DELETE {{base_url}}/stores/{id}/sensors/{sid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id}/sensors/{sid} ``` * GET All Virtual Meters of Store by ID ```bash @@ -1699,11 +1699,11 @@ curl -i -X GET {{base_url}}/stores/{id}/virtualmeters ``` * POST Bind Virtual Meter to a Store ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/stores/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/stores/{id}/virtualmeters ``` * DELETE Virtual Meter from Store ```bash -curl -i -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/stores/{id}/virtualmeters/{mid} ``` @@ -1729,15 +1729,15 @@ curl -i -X GET {{base_url}}/storetypes ``` * POST Create New Store Types ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/storetypes +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/storetypes ``` * PUT Update a Store Types ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/storetypes/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/storetypes/{id} ``` * DELETE a Store Types by ID ```bash -curl -i -X DELETE {{base_url}}/storetypes/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/storetypes/{id} ``` @@ -1776,26 +1776,26 @@ curl -i -X GET {{base_url}}/tariffs ``` * DELETE Tariff by ID ```bash -curl -i -X DELETE {{base_url}}/tariffs/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tariffs/{id} ``` * POST Create a Tariff To POST a block tariff: ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"10000", "price":"0.567"}, {"start_amount":"10000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"10000", "price":"0.567"}, {"start_amount":"10000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs ``` To POST a time of use tariff: ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.345}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.345}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs ``` * PUT Update a Tariff To update a block tariff: ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"20000", "price":"0.567"}, {"start_amount":"20000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"阶梯电价","energy_category_id":1, "tariff_type":"block", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2021-01-01T00:00:00", "block":[{"start_amount":"0", "end_amount":"20000", "price":"0.567"}, {"start_amount":"20000", "end_amount":"30000", "price":"0.678"}, {"start_amount":"30000", "end_amount":"100000", "price":"0.789"}]}}' {{base_url}}/tariffs/{id} ``` To update a time of use tariff: ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.456}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"2020分时电价1-6","energy_category_id":1, "tariff_type":"timeofuse", "unit_of_price":"元/千瓦时", "valid_from":"2020-01-01T00:00:00", "valid_through":"2020-07-01T00:00:00", "timeofuse":[{"start_time_of_day":"00:00:00", "end_time_of_day":"05:59:59", "peak_type":"offpeak", "price":0.456}, {"start_time_of_day":"06:00:00", "end_time_of_day":"07:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"08:00:00", "end_time_of_day":"10:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"11:00:00", "end_time_of_day":"17:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"18:00:00", "end_time_of_day":"20:59:59", "peak_type":"onpeak", "price":1.159}, {"start_time_of_day":"21:00:00", "end_time_of_day":"21:59:59", "peak_type":"midpeak", "price":0.708}, {"start_time_of_day":"22:00:00", "end_time_of_day":"23:59:59", "peak_type":"offpeak", "price":0.345}]}}' {{base_url}}/tariffs/{id} ``` @@ -1832,15 +1832,15 @@ curl -i -X GET {{base_url}}/tenants ``` * POST Create New Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Starbucks", "buildings":"Building #1", "floors":"L1 L2 L3", "rooms":"1201b+2247+3F", "area":418.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants ``` * PUT Update a Tenant ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hermes 爱马仕", "buildings":"Building #1", "floors":"L1 L2 L3 L4 L5", "rooms":"1201b+2247+3F", "area":818.8, "tenant_type_id":9, "is_input_counted": true, "is_key_tenant":true, "lease_number":"6b0da806", "lease_start_datetime":"2021-01-01T00:00:00", "lease_end_datetime":"2022-01-01T00:00:00", "is_in_lease":true, "contact_id":1, "cost_center_id":1, "description":"my description"}}' {{base_url}}/tenants/{id} ``` * DELETE Tenant by ID ```bash -curl -i -X DELETE {{base_url}}/tenants/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id} ``` * GET All Meters of Tenant by ID ```bash @@ -1848,11 +1848,11 @@ curl -i -X GET {{base_url}}/tenants/{id}/meters ``` * POST Bind a Meter to a Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/tenants/{id}/meters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"meter_id":1}}' {{base_url}}/tenants/{id}/meters ``` * DELETE a Meter from Tenant ```bash -curl -i -X DELETE {{base_url}}/tenants/{id}/meters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id}/meters/{mid} ``` * GET All Offline Meters of Tenant by ID ```bash @@ -1860,11 +1860,11 @@ curl -i -X GET {{base_url}}/tenants/{id}/offlinemeters ``` * POST Bind an Offline Meter to a Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/tenants/{id}/offlinemeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"offline_meter_id":1}}' {{base_url}}/tenants/{id}/offlinemeters ``` * DELETE an Offline Meter from Tenant ```bash -curl -i -X DELETE {{base_url}}/tenants/{id}/offlinemeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id}/offlinemeters/{mid} ``` * GET All Points of Tenant by ID ```bash @@ -1872,11 +1872,11 @@ curl -i -X GET {{base_url}}/tenants/{id}/points ``` * POST Bind a Point to a Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/tenants/{id}/points +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":1}}' {{base_url}}/tenants/{id}/points ``` * DELETE a Point from Tenant ```bash -curl -i -X DELETE {{base_url}}/tenants/{id}/points/{pid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id}/points/{pid} ``` * GET All Sensors of Tenant by ID ```bash @@ -1884,11 +1884,11 @@ curl -i -X GET {{base_url}}/tenants/{id}/sensors ``` * POST Bind a Sensor to a Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/tenants/{id}/sensors +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"sensor_id":1}}' {{base_url}}/tenants/{id}/sensors ``` * DELETE a Sensor from Tenant ```bash -curl -i -X DELETE {{base_url}}/tenants/{id}/sensors/{sid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id}/sensors/{sid} ``` * GET All Virtual Meters of Tenant by ID ```bash @@ -1896,11 +1896,11 @@ curl -i -X GET {{base_url}}/tenants/{id}/virtualmeters ``` * POST Bind Virtual Meter to a Tenant ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/tenants/{id}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"virtual_meter_id":1}}' {{base_url}}/tenants/{id}/virtualmeters ``` * DELETE an Virtual Meter from Tenant ```bash -curl -i -X DELETE {{base_url}}/tenants/{id}/virtualmeters/{mid} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenants/{id}/virtualmeters/{mid} ``` ### Tenant Type @@ -1925,15 +1925,15 @@ curl -i -X GET {{base_url}}/tenanttypes ``` * POST Create New Tenant Types ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/tenanttypes +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name": "Office", "description":"办公", "simplified_code":"OF"}}' {{base_url}}/tenanttypes ``` * PUT Update a Tenant Types ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/tenanttypes/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name": "Office1", "description":"办公", "simplified_code":"OF1"}}' {{base_url}}/tenanttypes/{id} ``` * DELETE a Tenant Types by ID ```bash -curl -i -X DELETE {{base_url}}/tenanttypes/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/tenanttypes/{id} ``` ### Text Message @@ -1961,7 +1961,7 @@ curl -i -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} ``` * DELETE Text Message by ID ```bash -curl -i -X DELETE {{base_url}}/textmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/textmessages/{id} ``` ### Timezone @@ -1975,7 +1975,7 @@ curl -i -X GET {{base_url}}/timezones ``` * PUT Update a Timezone by ID ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hawaiian Standard Time","description":"(GMT-10:00) Hawaii", "utc_offset":"-10:00"}}' {{base_url}}/timezones/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Hawaiian Standard Time","description":"(GMT-10:00) Hawaii", "utc_offset":"-10:00"}}' {{base_url}}/timezones/{id} ``` ### User @@ -1989,15 +1989,15 @@ curl -i -X GET {{base_url}}/users/{id} ``` * DELETE User by id ```bash -curl -i -X DELETE {{base_url}}/users/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/users/{id} ``` * POST New User ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "password":"!MyEMS1", "account_expiration_datetime":"2100-01-01T00:00:00", "password_expiration_datetime":"2100-01-01T00:00:00"}}' {{base_url}}/users +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "password":"!MyEMS1", "account_expiration_datetime":"2100-01-01T00:00:00", "password_expiration_datetime":"2100-01-01T00:00:00"}}' {{base_url}}/users ``` -* PUT User Profile +* PUT Update User Profile ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "privilege_id":1, "password":"!MyEMS1", "account_expiration_datetime":"2100-01-01T00:00:00", "password_expiration_datetime":"2100-01-01T00:00:00"}}' {{base_url}}/users/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"albert", "display_name":"Mr. Albert", "email":"albert@myems.io", "is_admin":false, "privilege_id":1, "password":"!MyEMS1", "account_expiration_datetime":"2100-01-01T00:00:00", "password_expiration_datetime":"2100-01-01T00:00:00"}}' {{base_url}}/users/{id} ``` * PUT User Login by Username ```bash @@ -2009,15 +2009,15 @@ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"email":"johnson ``` * PUT User Logout ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT {{base_url}}/users/logout +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT {{base_url}}/users/logout ``` * PUT User change password ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"old_password":"Password1", "new_password":"Password2"}}' {{base_url}}/users/changepassword ``` * PUT User reset other user's password by administrator ```bash -curl -i -H "Content-Type: application/json" -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` ### Virtual Meter @@ -2055,15 +2055,15 @@ curl -i -X GET {{base_url}}/virtualmeters ``` * DELETE a Virtual Meter by ID ```bash -curl -i -X DELETE {{base_url}}/virtualmeters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/virtualmeters/{id} ``` * POST Create New Virtual Meter ```bash -curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters ``` * PUT Update a Virtual Meter by ID ```bash -curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"VM21", "energy_category_id":1, "is_counted": true, "cost_center_id":1, "energy_item_id":1, "description":"virtual description", "expression": {"equation":"x1-x2-x3", "variables":[{"name":"x1", "meter_type":"meter", "meter_id":3},{"name":"x2", "meter_type":"meter", "meter_id":4},{"name":"x3", "meter_type":"meter", "meter_id":5}] } }}' {{base_url}}/virtualmeters/{id} ``` ### Web Message @@ -2094,7 +2094,7 @@ curl -i -X GET {{base_url}}/webmessagesnew ``` * DELETE a Web Message by ID ```bash -curl -i -X DELETE {{base_url}}/webmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/webmessages/{id} ``` ### Wechat Message @@ -2122,7 +2122,7 @@ curl -i -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} ``` * DELETE Wechat Message by ID ```bash -curl -i -X DELETE {{base_url}}/wechatmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/wechatmessages/{id} ``` ### Reports @@ -2136,7 +2136,7 @@ curl -i -X GET {{base_url}}/reports/advancedreports/{id} ``` * DELETE AdvancedReport by ID ```bash -curl -i -X GET {{base_url}}/reports/advancedreports/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/reports/advancedreports/{id} ``` * GET Combined Equipment Batch Analysis Report ```bash From 3ec50fab0d6d4c69a5051acdd37eb101acc61de4 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 3 Dec 2021 19:53:12 +0800 Subject: [PATCH 025/117] added access control to sersor in api and admin --- .../settings/sensor/sensor.controller.js | 16 ++-- .../settings/sensor/sensorpoint.controller.js | 14 +-- myems-api/MyEMS.postman_collection.json | 85 +++++++++++++++---- myems-api/README.md | 20 ++--- 4 files changed, 98 insertions(+), 37 deletions(-) diff --git a/admin/app/controllers/settings/sensor/sensor.controller.js b/admin/app/controllers/settings/sensor/sensor.controller.js index b4ee268a..e9f5edae 100644 --- a/admin/app/controllers/settings/sensor/sensor.controller.js +++ b/admin/app/controllers/settings/sensor/sensor.controller.js @@ -1,6 +1,13 @@ 'use strict'; -app.controller('SensorController', function($scope, $window, $translate, $uibModal, SensorService, toaster, SweetAlert) { +app.controller('SensorController', function( + $scope, + $window, + $translate, + $uibModal, + SensorService, + toaster, + SweetAlert) { $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.getAllSensors = function() { SensorService.getAllSensors(function (response) { @@ -28,8 +35,7 @@ app.controller('SensorController', function($scope, $window, $translate, $uibMo }); modalInstance.result.then(function(sensor) { let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; - SensorService.addSensor(sensor, {headers}, - function (response) { + SensorService.addSensor(sensor, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -70,7 +76,7 @@ app.controller('SensorController', function($scope, $window, $translate, $uibMo modalInstance.result.then(function(modifiedSensor) { let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; - SensorService.editSensor(modifiedSensor, {headers}, function (response) { + SensorService.editSensor(modifiedSensor, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -109,7 +115,7 @@ app.controller('SensorController', function($scope, $window, $translate, $uibMo function(isConfirm) { if (isConfirm) { let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; - SensorService.deleteSensor(sensor, {headers}, function (response) { + SensorService.deleteSensor(sensor, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/settings/sensor/sensorpoint.controller.js b/admin/app/controllers/settings/sensor/sensorpoint.controller.js index b4c58ee4..2edbd3e0 100644 --- a/admin/app/controllers/settings/sensor/sensorpoint.controller.js +++ b/admin/app/controllers/settings/sensor/sensorpoint.controller.js @@ -52,11 +52,11 @@ app.controller('SensorPointController', function ( }; - $scope.changeSensor=function(item,model){ - $scope.currentSensor=item; - $scope.currentSensor.selected=model; - $scope.getPointsBySensorID($scope.currentSensor.id); - }; + $scope.changeSensor=function(item,model){ + $scope.currentSensor=item; + $scope.currentSensor.selected=model; + $scope.getPointsBySensorID($scope.currentSensor.id); + }; $scope.changeDataSource = function (item, model) { $scope.currentDataSource = model; @@ -81,7 +81,7 @@ app.controller('SensorPointController', function ( var pointid = angular.element('#' + dragEl).scope().point.id; var sensorid = $scope.currentSensor.id; let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; - SensorPointService.addPair(sensorid, pointid, {headers}, function (response) { + SensorPointService.addPair(sensorid, pointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 201) { toaster.pop({ type: "success", @@ -108,7 +108,7 @@ app.controller('SensorPointController', function ( var sensorpointid = angular.element('#' + dragEl).scope().sensorpoint.id; var sensorid = $scope.currentSensor.id; let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; - SensorPointService.deletePair(sensorid, sensorpointid, {headers}, function (response) { + SensorPointService.deletePair(sensorid, sensorpointid, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 75145af6..404a52d1 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -4647,7 +4647,18 @@ "name": "POST Create New Sensor", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"Sensor10\", \"description\":\"sensor description\"}}" @@ -4668,19 +4679,30 @@ "name": "PUT Update a Sensor", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"Sensor10\", \"description\":\"sensor description\"}}" }, "url": { - "raw": "{{base_url}}/sensors/5", + "raw": "{{base_url}}/sensors/3", "host": [ "{{base_url}}" ], "path": [ "sensors", - "5" + "3" ] } }, @@ -4690,28 +4712,50 @@ "name": "DELETE Sensor by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", + "type": "text" + } + ], "url": { - "raw": "{{base_url}}/sensors/2", + "raw": "{{base_url}}/sensors/3", "host": [ "{{base_url}}" ], "path": [ "sensors", - "2" + "3" ] } }, "response": [] }, { - "name": "POST Sensor Point Relation", + "name": "POST Bind Point to Sensor", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", + "type": "text" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"point_id\":\"2686\"}}" + "raw": "{\"data\":{\"point_id\":\"2\"}}" }, "url": { "raw": "{{base_url}}/sensors/1/points", @@ -4728,7 +4772,7 @@ "response": [] }, { - "name": "GET All Points associated with Sensor ID", + "name": "GET All Points associated with Sensor by ID", "request": { "method": "GET", "header": [], @@ -4747,12 +4791,23 @@ "response": [] }, { - "name": "DELETE Sensor Point Relation", + "name": "DELETE Unbind Point from Sensor", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", + "type": "text" + } + ], "url": { - "raw": "{{base_url}}/sensors/1/points/2686", + "raw": "{{base_url}}/sensors/1/points/2", "host": [ "{{base_url}}" ], @@ -4760,7 +4815,7 @@ "sensors", "1", "points", - "2686" + "2" ] } }, diff --git a/myems-api/README.md b/myems-api/README.md index e3629388..73700050 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1321,10 +1321,6 @@ Result ```bash curl -i -X GET {{base_url}}/sensors ``` -* DELETE a Sensor by ID -```bash -curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/sensors/{id} -``` * POST Create New Sensor ```bash curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors @@ -1333,15 +1329,19 @@ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKE ```bash curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"Sensor10", "description":"sensor description"}}' {{base_url}}/sensors/{id} ``` -* GET All Points associated with Sensor ID +* DELETE Sensor by ID +```bash +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/sensors/{id} +``` +* POST Bind Point to Sensor +```bash +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"2"}}' {{base_url}}/sensors/{id}/points +``` +* GET All Points associated with Sensor by ID ```bash curl -i -X GET {{base_url}}/sensors/{id}/points ``` -* POST Sensor Point Relation -```bash -curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X POST -d '{"data":{"point_id":"3"}}' {{base_url}}/sensors/{id}/points -``` -* DELETE Sensor Point Relation +* DELETE Unbind Point from Sensor ```bash curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X DELETE {{base_url}}/sensors/{id}/points/{pid} ``` From 3e536d503e1cf2e77a765e5f6f516868e8b51783 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 4 Dec 2021 19:52:12 +0800 Subject: [PATCH 026/117] added access control to email message in api and admin --- .../emailmessage/emailmessage.controller.js | 18 ++- .../emailmessageoption.controller.js | 14 ++- .../fdd/emailmessageanalysis.service.js | 10 +- myems-api/MyEMS.postman_collection.json | 113 +++++++++++++++--- myems-api/README.md | 6 +- myems-api/core/emailmessage.py | 5 +- 6 files changed, 125 insertions(+), 41 deletions(-) diff --git a/admin/app/controllers/fdd/emailmessage/emailmessage.controller.js b/admin/app/controllers/fdd/emailmessage/emailmessage.controller.js index 6ffeeedc..d7130749 100644 --- a/admin/app/controllers/fdd/emailmessage/emailmessage.controller.js +++ b/admin/app/controllers/fdd/emailmessage/emailmessage.controller.js @@ -1,9 +1,14 @@ 'use strict'; -app.controller('EmailMessageController', function($scope, $timeout,$translate, +app.controller('EmailMessageController', function( + $scope, + $window, + $timeout, + $translate, EmailMessageAnalysisService, - toaster, SweetAlert) { - + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.$on('handleBroadcastEmailMessageOptionChanged', function (event, data) { if (angular.isDefined(data.load)) { $scope.tabledata = []; @@ -34,7 +39,8 @@ app.controller('EmailMessageController', function($scope, $timeout,$translate, }, function(isConfirm) { if (isConfirm) { - EmailMessageAnalysisService.deleteEmailMessage(emailmessage, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EmailMessageAnalysisService.deleteEmailMessage(emailmessage, headers, function(response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", @@ -50,11 +56,11 @@ app.controller('EmailMessageController', function($scope, $timeout,$translate, body: $translate.instant(response.data.description), showCloseButton: true, }); - } }); } - }); + } + ); }; }); \ No newline at end of file diff --git a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js index 69eb0b6a..06195354 100644 --- a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js +++ b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js @@ -1,7 +1,11 @@ 'use strict'; -app.controller('EmailMessageOptionController', function($scope, $timeout, +app.controller('EmailMessageOptionController', function( + $scope, + $window, + $timeout, EmailMessageAnalysisService) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.daterange = { startDate: moment().subtract(7,'days'), endDate: moment() @@ -18,17 +22,15 @@ app.controller('EmailMessageOptionController', function($scope, $timeout, applyLabel: "OK", cancelLabel: "Cancel", }, - eventHandlers:{ 'apply.daterangepicker':function(ev,picker){ //$scope.execute(); } } - }; $scope.execute = function() { - var datestart,dateend; + var datestart, dateend; var query = { datestart: $scope.daterange.startDate.format().slice(0, 10), dateend: $scope.daterange.endDate.format().slice(0, 10) @@ -37,8 +39,8 @@ app.controller('EmailMessageOptionController', function($scope, $timeout, load: true, period:$scope.currentPeriod }); - - EmailMessageAnalysisService.getAnalysisResult(query, function(response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + EmailMessageAnalysisService.getAnalysisResult(query, headers, function(response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.$emit('handleEmitEmailMessageOptionChanged', response.data); } diff --git a/admin/app/services/fdd/emailmessageanalysis.service.js b/admin/app/services/fdd/emailmessageanalysis.service.js index a9512c89..be596a7a 100644 --- a/admin/app/services/fdd/emailmessageanalysis.service.js +++ b/admin/app/services/fdd/emailmessageanalysis.service.js @@ -2,10 +2,8 @@ app.factory('EmailMessageAnalysisService', function($http) { return { - getAnalysisResult: function(query,callback) { - var base="emailmessages"; - var url=base+"/from/"+query.datestart+"/to/"+query.dateend; - $http.get(getAPI()+url) + getAnalysisResult: function(query, headers, callback) { + $http.get(getAPI()+"emailmessages"+"/from/"+query.datestart+"/to/"+query.dateend, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -13,8 +11,8 @@ app.factory('EmailMessageAnalysisService', function($http) { }); }, - deleteEmailMessage: function(emailmessage, callback) { - $http.delete(getAPI()+'emailmessages/'+emailmessage.id) + deleteEmailMessage: function(emailmessage, headers, callback) { + $http.delete(getAPI()+'emailmessages/'+emailmessage.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 404a52d1..0c4770b9 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -1816,21 +1816,34 @@ "name": "Email Message", "item": [ { - "name": "GET Email Messages from Startdate to Enddate", + "name": "GET Email Messages by Date Range", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "592641a558bc1724c4b75bd80d7d37b9b6a441b9b2231e3a5b2843b1f1e4f6864608ca97c4db00c94012b3406bf0c45cf231b789d2f551c1d420aa4de09f75cd", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/emailmessages/from/2020-04-01/to/2020-05-01", + "raw": "{{base_url}}/emailmessages/from/2021-12-01/to/2021-12-31", "host": [ "{{base_url}}" ], "path": [ "emailmessages", "from", - "2020-04-01", + "2021-12-01", "to", - "2020-05-01" + "2021-12-31" ], "query": [ { @@ -1847,7 +1860,20 @@ "name": "GET an Email Message by ID", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "592641a558bc1724c4b75bd80d7d37b9b6a441b9b2231e3a5b2843b1f1e4f6864608ca97c4db00c94012b3406bf0c45cf231b789d2f551c1d420aa4de09f75cd", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/emailmessages/1", "host": [ @@ -1865,7 +1891,20 @@ "name": "POST Create New Email Message TODO", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "592641a558bc1724c4b75bd80d7d37b9b6a441b9b2231e3a5b2843b1f1e4f6864608ca97c4db00c94012b3406bf0c45cf231b789d2f551c1d420aa4de09f75cd", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/emailmessages", "host": [ @@ -1882,7 +1921,20 @@ "name": "PUT Update an Email Message TODO", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "592641a558bc1724c4b75bd80d7d37b9b6a441b9b2231e3a5b2843b1f1e4f6864608ca97c4db00c94012b3406bf0c45cf231b789d2f551c1d420aa4de09f75cd", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "" } @@ -1893,7 +1945,20 @@ "name": "DELETE an Email Message by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "592641a558bc1724c4b75bd80d7d37b9b6a441b9b2231e3a5b2843b1f1e4f6864608ca97c4db00c94012b3406bf0c45cf231b789d2f551c1d420aa4de09f75cd", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/emailmessages/2", "host": [ @@ -4651,12 +4716,14 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", - "type": "text" + "type": "text", + "description": "Login to get a valid token" } ], "body": { @@ -4683,12 +4750,14 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", - "type": "text" + "type": "text", + "description": "Login to get a valid token" } ], "body": { @@ -4716,12 +4785,14 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", - "type": "text" + "type": "text", + "description": "Login to get a valid token" } ], "url": { @@ -4745,12 +4816,14 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", - "type": "text" + "type": "text", + "description": "Login to get a valid token" } ], "body": { @@ -4798,12 +4871,14 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any admin users' UUID" }, { "key": "Token", "value": "e713a4845a2f936eef1dca4314e7fad875b898854c56b4c5176d219f5ee19a0831d2ee67c63b17c2f2a49474d090cccb024f98a797d96571bc61027cbe1995af", - "type": "text" + "type": "text", + "description": "Login to get a valid token" } ], "url": { diff --git a/myems-api/README.md b/myems-api/README.md index 73700050..e405e268 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -504,11 +504,11 @@ Result in JSON | status | string | Status ('new', 'sent', 'timeout' | ```bash -curl -i -X GET {{base_url}}/emailmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/emailmessages/{id} ``` -* GET Email Messages from Startdate to Enddate +* GET Email Messages by Date Range ```bash -curl -i -X GET {{base_url}}/emailmessages/from/{startdate}/to/{enddate} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/emailmessages/from/{startdate}/to/{enddate} ``` * DELETE an Email Message by ID ```bash diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index 0068462f..318f39aa 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -3,7 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class EmailMessageCollection: @@ -18,6 +18,7 @@ class EmailMessageCollection: @staticmethod def on_get(req, resp, startdate, enddate): + access_control(req) try: start_datetime_local = datetime.strptime(startdate, '%Y-%m-%d') except Exception: @@ -100,6 +101,7 @@ class EmailMessageItem: @staticmethod def on_get(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_EMAIL_MESSAGE_ID') @@ -149,6 +151,7 @@ class EmailMessageItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_EMAIL_MESSAGE_ID') From 65565a53511931b2325d9d927b93c59f78bc9771 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sat, 4 Dec 2021 20:48:56 +0800 Subject: [PATCH 027/117] added access control to text message in api and admin --- .../fdd/textmessage/textmessage.controller.js | 19 +++-- .../textmessageoption.controller.js | 10 ++- .../fdd/textmessageanalysis.service.js | 10 +-- myems-api/MyEMS.postman_collection.json | 83 +++++++++++++++++-- myems-api/README.md | 6 +- myems-api/core/textmessage.py | 5 +- 6 files changed, 105 insertions(+), 28 deletions(-) diff --git a/admin/app/controllers/fdd/textmessage/textmessage.controller.js b/admin/app/controllers/fdd/textmessage/textmessage.controller.js index 4a0ee551..f46cf8a1 100644 --- a/admin/app/controllers/fdd/textmessage/textmessage.controller.js +++ b/admin/app/controllers/fdd/textmessage/textmessage.controller.js @@ -1,8 +1,14 @@ 'use strict'; -app.controller('TextMessageController', function($scope,$timeout,$translate, - TextMessageAnalysisService,SweetAlert,toaster) { - +app.controller('TextMessageController', function( + $scope, + $window, + $timeout, + $translate, + TextMessageAnalysisService, + SweetAlert, + toaster) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.$on('handleBroadcastTextMessageOptionChanged', function (event, data) { if (angular.isDefined(data.load)) { $scope.tabledata = []; @@ -32,7 +38,8 @@ app.controller('TextMessageController', function($scope,$timeout,$translate, }, function(isConfirm) { if (isConfirm) { - TextMessageAnalysisService.deleteTextMessage(textmessage, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + TextMessageAnalysisService.deleteTextMessage(textmessage, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", @@ -52,7 +59,7 @@ app.controller('TextMessageController', function($scope,$timeout,$translate, } }); } - }); + } + ); }; - }); diff --git a/admin/app/controllers/fdd/textmessage/textmessageoption.controller.js b/admin/app/controllers/fdd/textmessage/textmessageoption.controller.js index 2d9873c1..44b5eef7 100644 --- a/admin/app/controllers/fdd/textmessage/textmessageoption.controller.js +++ b/admin/app/controllers/fdd/textmessage/textmessageoption.controller.js @@ -1,7 +1,11 @@ 'use strict'; -app.controller('TextMessageOptionController', function($scope, $timeout, +app.controller('TextMessageOptionController', function( + $scope, + $window, + $timeout, TextMessageAnalysisService) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.daterange = { startDate: moment().subtract(7,'days'), endDate: moment() @@ -37,8 +41,8 @@ app.controller('TextMessageOptionController', function($scope, $timeout, load: true, period:$scope.currentPeriod }); - - TextMessageAnalysisService.getAnalysisResult(query, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + TextMessageAnalysisService.getAnalysisResult(query, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.$emit('handleEmitTextMessageOptionChanged', response.data); } diff --git a/admin/app/services/fdd/textmessageanalysis.service.js b/admin/app/services/fdd/textmessageanalysis.service.js index 81ccdc22..dbe2d8d9 100644 --- a/admin/app/services/fdd/textmessageanalysis.service.js +++ b/admin/app/services/fdd/textmessageanalysis.service.js @@ -2,10 +2,8 @@ app.factory('TextMessageAnalysisService', function($http) { return { - getAnalysisResult: function(query, callback) { - var base="textmessages"; - var url=base+"/from/"+query.datestart+"/to/"+query.dateend; - $http.get(getAPI()+url) + getAnalysisResult: function(query, headers, callback) { + $http.get(getAPI()+"textmessages"+"/from/"+query.datestart+"/to/"+query.dateend, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -13,8 +11,8 @@ app.factory('TextMessageAnalysisService', function($http) { }); }, - deleteTextMessage: function(textmessage, callback) { - $http.delete(getAPI()+'textmessages/'+textmessage.id) + deleteTextMessage: function(textmessage, headers, callback) { + $http.delete(getAPI()+'textmessages/'+textmessage.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 0c4770b9..8e909fff 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7377,21 +7377,34 @@ "name": "Text Message", "item": [ { - "name": "GET Text Messages from Startdate to Enddate", + "name": "GET Text Messages by Date Range", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/textmessages/from/2020-04-01/to/2020-05-01", + "raw": "{{base_url}}/textmessages/from/2021-12-01/to/2021-12-31", "host": [ "{{base_url}}" ], "path": [ "textmessages", "from", - "2020-04-01", + "2021-12-01", "to", - "2020-05-01" + "2021-12-31" ], "query": [ { @@ -7408,7 +7421,20 @@ "name": "GET an Text Message by ID", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/textmessages/1", "host": [ @@ -7426,7 +7452,20 @@ "name": "POST Create New Text Message TODO", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/textmessages", "host": [ @@ -7443,7 +7482,20 @@ "name": "PUT Update an Text Message TODO", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/textmessages/1", "host": [ @@ -7461,7 +7513,20 @@ "name": "DELETE an Text Message by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/textmessages/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index e405e268..c6937a04 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1953,11 +1953,11 @@ Result in JSON | acknowledge_code| string | Recipient reply with Acknowledge code to acknowledge | | status | string | Status ('new', 'sent', 'acknowledged', 'timeout'| ```bash -curl -i -X GET {{base_url}}/textmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/textmessages/{id} ``` -* GET Text Messages from Startdate to Enddate +* GET Text Messages by Date Range ```bash -curl -i -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/textmessages/from/{startdate}/to/{enddate} ``` * DELETE Text Message by ID ```bash diff --git a/myems-api/core/textmessage.py b/myems-api/core/textmessage.py index 04d989fc..8f3679c1 100644 --- a/myems-api/core/textmessage.py +++ b/myems-api/core/textmessage.py @@ -3,7 +3,7 @@ import json import mysql.connector import config from datetime import datetime, timedelta, timezone -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class TextMessageCollection: @@ -18,6 +18,7 @@ class TextMessageCollection: @staticmethod def on_get(req, resp, startdate, enddate): + access_control(req) try: start_datetime_local = datetime.strptime(startdate, '%Y-%m-%d') except Exception: @@ -97,6 +98,7 @@ class TextMessageItem: @staticmethod def on_get(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_TEXT_MESSAGE_ID') @@ -145,6 +147,7 @@ class TextMessageItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_TEXT_MESSAGE_ID') From 996f7066e14f7a90e11bd639ad251b9d972ce465 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 5 Dec 2021 12:37:42 +0800 Subject: [PATCH 028/117] added access control to wechat message in api and admin --- .../wechatmessage/wechatmessage.controller.js | 17 ++- .../wechatmessageoption.controller.js | 9 +- .../fdd/wechatmessageanalysis.service.js | 11 +- myems-api/MyEMS.postman_collection.json | 85 +++++++++++-- myems-api/README.md | 4 +- myems-api/core/emailmessage.py | 120 ++++++------------ myems-api/core/textmessage.py | 108 +++++----------- myems-api/core/wechatmessage.py | 35 +++-- 8 files changed, 192 insertions(+), 197 deletions(-) diff --git a/admin/app/controllers/fdd/wechatmessage/wechatmessage.controller.js b/admin/app/controllers/fdd/wechatmessage/wechatmessage.controller.js index 0da845ce..af330bea 100644 --- a/admin/app/controllers/fdd/wechatmessage/wechatmessage.controller.js +++ b/admin/app/controllers/fdd/wechatmessage/wechatmessage.controller.js @@ -1,7 +1,14 @@ 'use strict'; -app.controller('WechatMessageController', function($scope, $timeout,$translate, WechatMessageAnalysisService, toaster, SweetAlert) { - +app.controller('WechatMessageController', function( + $scope, + $window, + $timeout, + $translate, + WechatMessageAnalysisService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.$on('handleBroadcastWechatMessageOptionChanged', function (event, data) { if (angular.isDefined(data.load)) { $scope.tabledata = []; @@ -31,7 +38,8 @@ app.controller('WechatMessageController', function($scope, $timeout,$translate, }, function(isConfirm) { if (isConfirm) { - WechatMessageAnalysisService.deleteWechatMessage(wechatmessage, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WechatMessageAnalysisService.deleteWechatMessage(wechatmessage, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", @@ -51,6 +59,7 @@ app.controller('WechatMessageController', function($scope, $timeout,$translate, } }); } - }); + } + ); }; }); diff --git a/admin/app/controllers/fdd/wechatmessage/wechatmessageoption.controller.js b/admin/app/controllers/fdd/wechatmessage/wechatmessageoption.controller.js index 8f8b3ce5..0b46f7d1 100644 --- a/admin/app/controllers/fdd/wechatmessage/wechatmessageoption.controller.js +++ b/admin/app/controllers/fdd/wechatmessage/wechatmessageoption.controller.js @@ -1,7 +1,11 @@ 'use strict'; -app.controller('WechatMessageOptionController', function($scope, $timeout, +app.controller('WechatMessageOptionController', function( + $scope, + $window, + $timeout, WechatMessageAnalysisService) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.daterange = { startDate: moment().subtract(7,'days'), endDate: moment() @@ -36,7 +40,8 @@ app.controller('WechatMessageOptionController', function($scope, $timeout, load: true, period:$scope.currentPeriod }); - WechatMessageAnalysisService.getAnalysisResult(query, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WechatMessageAnalysisService.getAnalysisResult(query, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.$emit('handleEmitWechatMessageOptionChanged', response.data); } diff --git a/admin/app/services/fdd/wechatmessageanalysis.service.js b/admin/app/services/fdd/wechatmessageanalysis.service.js index e19d9532..13d3be20 100644 --- a/admin/app/services/fdd/wechatmessageanalysis.service.js +++ b/admin/app/services/fdd/wechatmessageanalysis.service.js @@ -1,11 +1,8 @@ 'use strict'; app.factory('WechatMessageAnalysisService', function($http) { return { - - getAnalysisResult: function(query,callback) { - var base="wechatmessages"; - var url=base+"/from/"+query.datestart+"/to/"+query.dateend; - $http.get(getAPI()+url) + getAnalysisResult: function(query, headers, callback) { + $http.get(getAPI()+"wechatmessages"+"/from/"+query.datestart+"/to/"+query.dateend, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -13,8 +10,8 @@ app.factory('WechatMessageAnalysisService', function($http) { }); }, - deleteWechatMessage: function(wechatmessage, callback) { - $http.delete(getAPI()+'wechatmessages/'+wechatmessage.id) + deleteWechatMessage: function(wechatmessage, headers, callback) { + $http.delete(getAPI()+'wechatmessages/'+wechatmessage.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index 8e909fff..af77b436 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -7389,7 +7389,7 @@ }, { "key": "Token", - "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "value": "14f2bb7378e6926c20b54bd48bd8618e4d78ece1f1658c946a7257eaa97d3149ecd6407a62a39f0f3a6ef6b65f19d63894f297ad5a58d7b597a547f8b8e2898c", "type": "text", "description": "Login to get a valid token" } @@ -8178,21 +8178,34 @@ "name": "Wechat Message", "item": [ { - "name": "GET Wechat Messages from Startdate to Enddate", + "name": "GET Wechat Messages by Date Range", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "14f2bb7378e6926c20b54bd48bd8618e4d78ece1f1658c946a7257eaa97d3149ecd6407a62a39f0f3a6ef6b65f19d63894f297ad5a58d7b597a547f8b8e2898c", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { - "raw": "{{base_url}}/wechatmessages/from/2020-04-01/to/2020-05-01", + "raw": "{{base_url}}/wechatmessages/from/2021-12-01/to/2021-12-31", "host": [ "{{base_url}}" ], "path": [ "wechatmessages", "from", - "2020-04-01", + "2021-12-01", "to", - "2020-05-01" + "2021-12-31" ], "query": [ { @@ -8209,7 +8222,20 @@ "name": "GET a Wechat Message by ID", "request": { "method": "GET", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "14f2bb7378e6926c20b54bd48bd8618e4d78ece1f1658c946a7257eaa97d3149ecd6407a62a39f0f3a6ef6b65f19d63894f297ad5a58d7b597a547f8b8e2898c", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/wechatmessages/1", "host": [ @@ -8227,7 +8253,20 @@ "name": "POST Create New Wechat Message TODO", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/wechatmessages", "host": [ @@ -8244,7 +8283,20 @@ "name": "PUT Update a Wechat Message TODO", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "c6f5fa938c0e228d06e1f3adb3ef1eac319e1167e6ff0cb7fd5d928e83da5764ddb66e29204e0f4e6aa407ded3702b15be67a435c4825dc722b6047010398714", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/wechatmessages/1", "host": [ @@ -8262,7 +8314,20 @@ "name": "DELETE a Wechat Message by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "14f2bb7378e6926c20b54bd48bd8618e4d78ece1f1658c946a7257eaa97d3149ecd6407a62a39f0f3a6ef6b65f19d63894f297ad5a58d7b597a547f8b8e2898c", + "type": "text", + "description": "Login to get a valid token" + } + ], "url": { "raw": "{{base_url}}/wechatmessages/2", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index c6937a04..1dd3d0d1 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -2114,11 +2114,11 @@ Result in JSON | acknowledge_code| string | Recipient reply with Acknowledge code to acknowledge | | status | string | Status ('new', 'sent', 'acknowledged', 'timeout'| ```bash -curl -i -X GET {{base_url}}/wechatmessages/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/wechatmessages/{id} ``` * GET Wechat Messages from Startdate to Enddate ```bash -curl -i -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/wechatmessages/from/{startdate}/to/{enddate} ``` * DELETE Wechat Message by ID ```bash diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index 318f39aa..eab41ee5 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -1,5 +1,5 @@ import falcon -import json +import simplejson as json import mysql.connector import config from datetime import datetime, timedelta, timezone @@ -48,28 +48,22 @@ class EmailMessageCollection: title='API.BAD_REQUEST', description='API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME') - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - query = (" SELECT id, recipient_name, recipient_email, " - " subject, message, attachment_file_name, " - " created_datetime_utc, scheduled_datetime_utc, status " - " FROM tbl_email_messages " - " WHERE created_datetime_utc >= %s AND created_datetime_utc < %s " - " ORDER BY created_datetime_utc ") - cursor.execute(query, (start_datetime_utc, end_datetime_utc)) - rows = cursor.fetchall() + query = (" SELECT id, recipient_name, recipient_email, " + " subject, message, attachment_file_name, " + " created_datetime_utc, scheduled_datetime_utc, status " + " FROM tbl_email_messages " + " WHERE created_datetime_utc >= %s AND created_datetime_utc < %s " + " ORDER BY created_datetime_utc ") + cursor.execute(query, (start_datetime_utc, end_datetime_utc)) + rows = cursor.fetchall() - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + if cursor: + cursor.close() + if cnx: + cnx.disconnect() result = list() if rows is not None and len(rows) > 0: @@ -106,31 +100,21 @@ class EmailMessageItem: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_EMAIL_MESSAGE_ID') - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - query = (" SELECT id, recipient_name, recipient_email, " - " subject, message, attachment_file_name, " - " created_datetime_utc, scheduled_datetime_utc, status " - " FROM tbl_email_messages " - " WHERE id = %s ") - cursor.execute(query, (id_,)) - row = cursor.fetchone() + query = (" SELECT id, recipient_name, recipient_email, " + " subject, message, attachment_file_name, " + " created_datetime_utc, scheduled_datetime_utc, status " + " FROM tbl_email_messages " + " WHERE id = %s ") + cursor.execute(query, (id_,)) + row = cursor.fetchone() - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + if cursor: + cursor.close() + if cnx: + cnx.disconnect() if row is None: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', @@ -156,29 +140,13 @@ class EmailMessageItem: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_EMAIL_MESSAGE_ID') - cnx = None - cursor = None - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - cursor.execute(" SELECT id " - " FROM tbl_email_messages " - " WHERE id = %s ", (id_,)) - row = cursor.fetchone() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cursor.execute(" SELECT id " + " FROM tbl_email_messages " + " WHERE id = %s ", (id_,)) + row = cursor.fetchone() if row is None: if cursor: @@ -188,19 +156,13 @@ class EmailMessageItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.EMAIL_MESSAGE_NOT_FOUND') - try: - cursor.execute(" DELETE FROM tbl_email_messages WHERE id = %s ", (id_,)) - cnx.commit() - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cursor.execute(" DELETE FROM tbl_email_messages WHERE id = %s ", (id_,)) + cnx.commit() + + if cursor: + cursor.close() + if cnx: + cnx.disconnect() resp.status = falcon.HTTP_204 diff --git a/myems-api/core/textmessage.py b/myems-api/core/textmessage.py index 8f3679c1..5ce69800 100644 --- a/myems-api/core/textmessage.py +++ b/myems-api/core/textmessage.py @@ -1,5 +1,5 @@ import falcon -import json +import simplejson as json import mysql.connector import config from datetime import datetime, timedelta, timezone @@ -47,27 +47,21 @@ class TextMessageCollection: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME') - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - query = (" SELECT id, recipient_name, recipient_mobile, " - " message, created_datetime_utc, scheduled_datetime_utc, acknowledge_code, status " - " FROM tbl_text_messages_outbox " - " WHERE created_datetime_utc >= %s AND created_datetime_utc < %s " - " ORDER BY created_datetime_utc ") - cursor.execute(query, (start_datetime_utc, end_datetime_utc)) - rows = cursor.fetchall() + query = (" SELECT id, recipient_name, recipient_mobile, " + " message, created_datetime_utc, scheduled_datetime_utc, acknowledge_code, status " + " FROM tbl_text_messages_outbox " + " WHERE created_datetime_utc >= %s AND created_datetime_utc < %s " + " ORDER BY created_datetime_utc DESC ") + cursor.execute(query, (start_datetime_utc, end_datetime_utc)) + rows = cursor.fetchall() - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + if cursor: + cursor.close() + if cnx: + cnx.disconnect() result = list() if rows is not None and len(rows) > 0: @@ -77,8 +71,7 @@ class TextMessageCollection: "recipient_mobile": row[2], "message": row[3], "created_datetime": row[4].timestamp() * 1000 if isinstance(row[4], datetime) else None, - "scheduled_datetime": row[5].timestamp() * 1000 if isinstance(row[5], datetime) - else None, + "scheduled_datetime": row[5].timestamp() * 1000 if isinstance(row[5], datetime) else None, "acknowledge_code": row[6], "status": row[7]} result.append(meta_result) @@ -103,31 +96,20 @@ class TextMessageItem: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_TEXT_MESSAGE_ID') - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - query = (" SELECT id, recipient_name, recipient_mobile, " - " message, created_datetime_utc, scheduled_datetime_utc, acknowledge_code, status " - " FROM tbl_text_messages_outbox " - " WHERE id = %s ") - cursor.execute(query, (id_,)) - row = cursor.fetchone() + query = (" SELECT id, recipient_name, recipient_mobile, " + " message, created_datetime_utc, scheduled_datetime_utc, acknowledge_code, status " + " FROM tbl_text_messages_outbox " + " WHERE id = %s ") + cursor.execute(query, (id_,)) + row = cursor.fetchone() - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + if cursor: + cursor.close() + if cnx: + cnx.disconnect() if row is None: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', @@ -152,27 +134,11 @@ class TextMessageItem: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_TEXT_MESSAGE_ID') - cnx = None - cursor = None - try: - cnx = mysql.connector.connect(**config.myems_fdd_db) - cursor = cnx.cursor() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cnx = mysql.connector.connect(**config.myems_fdd_db) + cursor = cnx.cursor() - try: - cursor.execute(" SELECT id FROM tbl_text_messages_outbox WHERE id = %s ", (id_,)) - row = cursor.fetchone() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cursor.execute(" SELECT id FROM tbl_text_messages_outbox WHERE id = %s ", (id_,)) + row = cursor.fetchone() if row is None: if cursor: @@ -182,15 +148,8 @@ class TextMessageItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.TEXT_MESSAGE_NOT_FOUND') - try: - cursor.execute(" DELETE FROM tbl_text_messages_outbox WHERE id = %s ", (id_,)) - cnx.commit() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.DATABASE_ERROR', description=str(e)) + cursor.execute(" DELETE FROM tbl_text_messages_outbox WHERE id = %s ", (id_,)) + cnx.commit() if cursor: cursor.close() @@ -198,4 +157,3 @@ class TextMessageItem: cnx.disconnect() resp.status = falcon.HTTP_204 - diff --git a/myems-api/core/wechatmessage.py b/myems-api/core/wechatmessage.py index 1aba6b05..3b3c0b78 100644 --- a/myems-api/core/wechatmessage.py +++ b/myems-api/core/wechatmessage.py @@ -1,12 +1,16 @@ import falcon -import json +import simplejson as json import mysql.connector import config from datetime import datetime, timedelta, timezone -from core.useractivity import user_logger +from core.useractivity import user_logger, access_control class WechatMessageCollection(object): + @staticmethod + def __init__(): + """"Initializes WechatMessageCollection""" + pass @staticmethod def on_options(req, resp, startdate, enddate): @@ -14,6 +18,7 @@ class WechatMessageCollection(object): @staticmethod def on_get(req, resp, startdate, enddate): + access_control(req) try: start_datetime_local = datetime.strptime(startdate, '%Y-%m-%d') except Exception: @@ -42,7 +47,6 @@ class WechatMessageCollection(object): raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.START_DATETIME_MUST_BE_EARLIER_THAN_END_DATETIME') - cnx = mysql.connector.connect(**config.myems_fdd_db) cursor = cnx.cursor() @@ -51,7 +55,7 @@ class WechatMessageCollection(object): " acknowledge_code, status " " FROM tbl_wechat_messages_outbox " " WHERE created_datetime_utc >= %s AND created_datetime_utc < %s " - " ORDER BY id DESC ") + " ORDER BY created_datetime_utc DESC ") cursor.execute(query, (start_datetime_utc, end_datetime_utc)) rows = cursor.fetchall() @@ -68,11 +72,12 @@ class WechatMessageCollection(object): "recipient_openid": row[2], "message_template_id": row[3], "message_data": row[4], - "created_datetime_utc": row[5].timestamp() * 1000 if row[5] else None, - "scheduled_datetime_utc": row[6].timestamp() * 1000 if row[6] else None, + "created_datetime_utc": row[5].timestamp() * 1000 if isinstance(row[5], datetime) else None, + "scheduled_datetime_utc": row[6].timestamp() * 1000 if isinstance(row[6], datetime) else None, "acknowledge_code": row[7], "status": row[8]} result.append(meta_result) + resp.text = json.dumps(result) @@ -88,6 +93,7 @@ class WechatMessageItem: @staticmethod def on_get(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_WECHAT_MESSAGE_ID') @@ -117,8 +123,8 @@ class WechatMessageItem: "recipient_openid": row[2], "recipient_template_id": row[3], "message_data": row[4], - "created_datetime_utc": row[5].timestamp() * 1000 if row[5] else None, - "scheduled_datetime_utc": row[6].timestamp() * 1000 if row[6] else None, + "created_datetime_utc": row[5].timestamp() * 1000 if isinstance(row[5], datetime) else None, + "scheduled_datetime_utc": row[6].timestamp() * 1000 if isinstance(row[6], datetime) else None, "acknowledge_code": row[7], "status": row[8]} @@ -127,6 +133,7 @@ class WechatMessageItem: @staticmethod @user_logger def on_delete(req, resp, id_): + access_control(req) if not id_.isdigit() or int(id_) <= 0: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_WECHAT_MESSAGE_ID') @@ -147,16 +154,8 @@ class WechatMessageItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.WECHAT_MESSAGE_NOT_FOUND') - try: - cursor.execute(" DELETE FROM tbl_wechat_messages_outbox WHERE id = %s ", (id_,)) - cnx.commit() - except Exception as e: - if cursor: - cursor.close() - if cnx: - cnx.disconnect() - raise falcon.HTTPError(falcon.HTTP_500, title='API.ERROR', - description='API.DATABASE_ERROR') + cursor.execute(" DELETE FROM tbl_wechat_messages_outbox WHERE id = %s ", (id_,)) + cnx.commit() if cursor: cursor.close() From cd94e31a98943a7e091fc36e91984d0aa0b417a2 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Sun, 5 Dec 2021 18:06:50 +0800 Subject: [PATCH 029/117] added user varification to webmessage in admin and api --- admin/Dockerfile | 9 +- .../fdd/webmessage/webmessage.controller.js | 17 +- .../webmessage/webmessageoption.controller.js | 9 +- .../app/controllers/login/login.controller.js | 13 +- .../fdd/webmessageanalysis.service.js | 19 +- admin/views/fdd/webmessage.html | 2 - admin/views/fdd/webmessage.model.html | 8 - myems-api/Dockerfile | 3 + myems-api/MyEMS.postman_collection.json | 186 ++++++--- myems-api/README.md | 6 +- myems-api/core/costfile.py | 2 +- myems-api/core/emailserver.py | 2 +- myems-api/core/knowledgefile.py | 2 +- myems-api/core/notification.py | 2 +- myems-api/core/offlinemeterfile.py | 2 +- myems-api/core/webmessage.py | 352 ++++++++++++++---- myems-api/example.env | 1 + web/Dockerfile | 6 +- 18 files changed, 480 insertions(+), 161 deletions(-) diff --git a/admin/Dockerfile b/admin/Dockerfile index 3ae1a605..2afb2091 100644 --- a/admin/Dockerfile +++ b/admin/Dockerfile @@ -1,9 +1,12 @@ FROM nginx:1.21.1 -# remove the config +# remove the default config RUN rm /etc/nginx/conf.d/default.conf && \ - rm /etc/nginx/nginx.conf && \ - mkdir -p /var/www/html/admin + rm /etc/nginx/nginx.conf + +# create new root folder +# todo: share upload folder in admin with myems-api container on Docker +RUN mkdir -p /var/www/html/admin # copy the config and web codes COPY nginx.conf /etc/nginx/ diff --git a/admin/app/controllers/fdd/webmessage/webmessage.controller.js b/admin/app/controllers/fdd/webmessage/webmessage.controller.js index 9cf4e0f3..fe7a729f 100644 --- a/admin/app/controllers/fdd/webmessage/webmessage.controller.js +++ b/admin/app/controllers/fdd/webmessage/webmessage.controller.js @@ -1,6 +1,15 @@ 'use strict'; -app.controller('WebMessageController', function($scope, $timeout, $translate, $uibModal, WebMessageAnalysisService, toaster, SweetAlert) { +app.controller('WebMessageController', function( + $scope, + $window, + $timeout, + $translate, + $uibModal, + WebMessageAnalysisService, + toaster, + SweetAlert) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.$on('handleBroadcastWebMessageOptionChanged', function (event, data) { if (angular.isDefined(data.load)) { $scope.tabledata = []; @@ -32,7 +41,8 @@ app.controller('WebMessageController', function($scope, $timeout, $translate, $u modalInstance.result.then(function(modifiedWebmessage) { modifiedWebmessage.status = "acknowledged"; - WebMessageAnalysisService.editWebMessage(modifiedWebmessage, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WebMessageAnalysisService.editWebMessage(modifiedWebmessage, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { toaster.pop({ type: "success", @@ -70,7 +80,8 @@ app.controller('WebMessageController', function($scope, $timeout, $translate, $u }, function(isConfirm) { if (isConfirm) { - WebMessageAnalysisService.deleteWebMessage(webmessage, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WebMessageAnalysisService.deleteWebMessage(webmessage, headers, function (response) { if (angular.isDefined(response.status) && response.status === 204) { toaster.pop({ type: "success", diff --git a/admin/app/controllers/fdd/webmessage/webmessageoption.controller.js b/admin/app/controllers/fdd/webmessage/webmessageoption.controller.js index 2301def8..6a84f101 100644 --- a/admin/app/controllers/fdd/webmessage/webmessageoption.controller.js +++ b/admin/app/controllers/fdd/webmessage/webmessageoption.controller.js @@ -1,7 +1,11 @@ 'use strict'; -app.controller('WebMessageOptionController', function($scope, $timeout, +app.controller('WebMessageOptionController', function( + $scope, + $window, + $timeout, WebMessageAnalysisService) { + $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user")); $scope.daterange = { startDate: moment().subtract(7,'days'), endDate: moment() @@ -36,7 +40,8 @@ app.controller('WebMessageOptionController', function($scope, $timeout, load: true, period:$scope.currentPeriod }); - WebMessageAnalysisService.getAnalysisResult(query, function (response) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WebMessageAnalysisService.getAnalysisResult(query, headers, function (response) { if (angular.isDefined(response.status) && response.status === 200) { $scope.$emit('handleEmitWebMessageOptionChanged', response.data); } diff --git a/admin/app/controllers/login/login.controller.js b/admin/app/controllers/login/login.controller.js index 86e702b9..e8e3670a 100644 --- a/admin/app/controllers/login/login.controller.js +++ b/admin/app/controllers/login/login.controller.js @@ -200,11 +200,14 @@ app.controller('LoginController', function ( // web message alarm section start $scope.webmessages = []; $scope.getWebMessage = function () { - WebMessageAnalysisService.getStatusNewResult(function (response) { - if (angular.isDefined(response.status) && response.status === 200) { - $scope.webmessages = response.data; - } - }); + if ($scope.cur_user != null && $scope.cur_user.uuid != null && $scope.cur_user.token != null) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + WebMessageAnalysisService.getStatusNewResult(headers, function (response) { + if (angular.isDefined(response.status) && response.status === 200) { + $scope.webmessages = response.data; + } + }); + } }; // web message alarm section end diff --git a/admin/app/services/fdd/webmessageanalysis.service.js b/admin/app/services/fdd/webmessageanalysis.service.js index 25fed0f6..9fc18fcd 100644 --- a/admin/app/services/fdd/webmessageanalysis.service.js +++ b/admin/app/services/fdd/webmessageanalysis.service.js @@ -2,10 +2,8 @@ app.factory('WebMessageAnalysisService', function($http) { return { - getAnalysisResult: function(query,callback) { - var base="webmessages"; - var url=base+"/from/"+query.datestart+"/to/"+query.dateend; - $http.get(getAPI()+url) + getAnalysisResult: function(query, headers, callback) { + $http.get(getAPI()+"webmessages"+"/from/"+query.datestart+"/to/"+query.dateend, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -13,9 +11,8 @@ app.factory('WebMessageAnalysisService', function($http) { }); }, - getStatusNewResult: function(callback) { - var base="webmessagesnew"; - $http.get(getAPI()+base) + getStatusNewResult: function(headers, callback) { + $http.get(getAPI()+"webmessagesnew", {headers}) .then(function (response) { callback(response); }, function (response) { @@ -23,8 +20,8 @@ app.factory('WebMessageAnalysisService', function($http) { }); }, - editWebMessage: function(webmessage, callback) { - $http.put(getAPI()+'webmessages/'+webmessage.id, {data:webmessage}) + editWebMessage: function(webmessage, headers, callback) { + $http.put(getAPI()+'webmessages/'+webmessage.id, {data:webmessage}, {headers}) .then(function (response) { callback(response); }, function (response) { @@ -32,8 +29,8 @@ app.factory('WebMessageAnalysisService', function($http) { }); }, - deleteWebMessage: function(webmessage, callback) { - $http.delete(getAPI()+'webmessages/'+webmessage.id) + deleteWebMessage: function(webmessage, headers, callback) { + $http.delete(getAPI()+'webmessages/'+webmessage.id, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/admin/views/fdd/webmessage.html b/admin/views/fdd/webmessage.html index b6e7f4fb..0b0004d9 100644 --- a/admin/views/fdd/webmessage.html +++ b/admin/views/fdd/webmessage.html @@ -30,7 +30,6 @@ {{'FDD.ID' | translate}} - {{'FDD.RECIPIENT_NAME' | translate}} {{'FDD.TOPIC' | translate}} {{'FDD.ALARM_MESSAGE' | translate}} {{'FDD.ALARM_TIME' | translate}} @@ -42,7 +41,6 @@ {{ row.id }} - {{ row.user_display_name }} {{ row.subject }} {{ row.message.slice(0,50) }} ... diff --git a/admin/views/fdd/webmessage.model.html b/admin/views/fdd/webmessage.model.html index e2f58306..28857e74 100644 --- a/admin/views/fdd/webmessage.model.html +++ b/admin/views/fdd/webmessage.model.html @@ -4,14 +4,6 @@ diff --git a/database/install/myems_system_db.sql b/database/install/myems_system_db.sql index cccddaa7..5158d4f6 100644 --- a/database/install/myems_system_db.sql +++ b/database/install/myems_system_db.sql @@ -1246,6 +1246,6 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_versions` (`id`, `version`, `release_date`) VALUES -(1, '1.4.0', '2021-11-14'); +(1, '1.5.0', '2021-12-12'); COMMIT; diff --git a/database/upgrade/upgrade1.4.1.sql b/database/upgrade/upgrade1.5.0.sql similarity index 99% rename from database/upgrade/upgrade1.4.1.sql rename to database/upgrade/upgrade1.5.0.sql index a7d45651..a723f7ce 100644 --- a/database/upgrade/upgrade1.4.1.sql +++ b/database/upgrade/upgrade1.5.0.sql @@ -311,6 +311,6 @@ CREATE INDEX `tbl_virtual_meter_8760_index_1` ON `myems_energy_model_db`.`tbl_v -- UPDATE VERSION NUMBER -UPDATE myems_system_db.tbl_versions SET version='1.4.1', release_date='2021-12-12' WHERE id=1; +UPDATE myems_system_db.tbl_versions SET version='1.5.0', release_date='2021-12-12' WHERE id=1; COMMIT; diff --git a/myems-api/core/version.py b/myems-api/core/version.py index 4bb57482..e9dc6bdc 100644 --- a/myems-api/core/version.py +++ b/myems-api/core/version.py @@ -15,8 +15,8 @@ class VersionItem: @staticmethod def on_get(req, resp): - result = {"version": 'MyEMS v1.4.0', - "release-date": '2021-11-14', + result = {"version": 'MyEMS v1.5.0 Community Edition', + "release-date": '2021-12-12', "website": "https://myems.io"} resp.text = json.dumps(result) diff --git a/web/package-lock.json b/web/package-lock.json index 1be1a523..af31d7e5 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "myems", - "version": "1.4.0", + "version": "1.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "myems", - "version": "1.4.0", + "version": "1.5.0", "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", "@fortawesome/fontawesome-svg-core": "^1.2.30", @@ -110,9 +110,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", "engines": { "node": ">=6.9.0" } @@ -148,9 +148,9 @@ } }, "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -292,9 +292,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -310,9 +310,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -448,9 +448,9 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz", - "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-wrap-function": "^7.16.0", @@ -599,9 +599,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", - "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", "bin": { "parser": "bin/babel-parser.js" }, @@ -640,12 +640,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz", - "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0", + "@babel/helper-remap-async-to-generator": "^7.16.4", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1742,17 +1742,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz", - "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-class-static-block": "^7.16.0", "@babel/plugin-proposal-dynamic-import": "^7.16.0", @@ -1802,7 +1802,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", "@babel/plugin-transform-new-target": "^7.16.0", "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", "@babel/plugin-transform-property-literals": "^7.16.0", "@babel/plugin-transform-regenerator": "^7.16.0", "@babel/plugin-transform-reserved-words": "^7.16.0", @@ -1815,10 +1815,10 @@ "@babel/plugin-transform-unicode-regex": "^7.16.0", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.2.3", - "babel-plugin-polyfill-corejs3": "^0.3.0", - "babel-plugin-polyfill-regenerator": "^0.2.3", - "core-js-compat": "^3.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", "semver": "^6.3.0" }, "engines": { @@ -1930,9 +1930,9 @@ } }, "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -2014,9 +2014,9 @@ } }, "node_modules/@emotion/core": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.1.1.tgz", - "integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", + "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", "dependencies": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -2999,9 +2999,9 @@ } }, "node_modules/@loadable/component": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.0.tgz", - "integrity": "sha512-g63rQzypPOZi0BeGsK4ST2MYhsFR+i7bhL8k/McUoWDNMDuTTdUlQ2GACKxqh5sI/dNC/6nVoPrycMnSylnAgQ==", + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.2.tgz", + "integrity": "sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==", "dependencies": { "@babel/runtime": "^7.7.7", "hoist-non-react-statics": "^3.3.1", @@ -3252,9 +3252,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz", + "integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -3356,9 +3356,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.176", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", - "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==" + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" }, "node_modules/@types/minimatch": { "version": "3.0.5", @@ -3371,9 +3371,9 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" }, "node_modules/@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -3404,9 +3404,9 @@ } }, "node_modules/@types/react": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.34.tgz", - "integrity": "sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg==", + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3433,9 +3433,9 @@ } }, "node_modules/@types/react/node_modules/csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/@types/scheduler": { "version": "0.16.2", @@ -3561,9 +3561,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -4833,12 +4833,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.0", "semver": "^6.1.1" }, "peerDependencies": { @@ -4846,11 +4846,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz", - "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.0", "core-js-compat": "^3.18.0" }, "peerDependencies": { @@ -4858,11 +4858,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.4" + "@babel/helper-define-polyfill-provider": "^0.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5289,6 +5289,14 @@ "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -5331,6 +5339,11 @@ "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "node_modules/body-parser/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -5339,6 +5352,14 @@ "node": ">= 0.6" } }, + "node_modules/body-parser/node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -5591,9 +5612,9 @@ } }, "node_modules/browserslist": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.0.tgz", - "integrity": "sha512-ER2M0g5iAR84fS/zjBDqEgU6iO5fS9JI2EkHr5zxDxYEFk3LjhU9Vpp/INb6RMQphxko7PDV1FH38H/qVP5yCA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", "dependencies": { "caniuse-lite": "^1.0.30001280", "electron-to-chromium": "^1.3.896", @@ -5733,9 +5754,10 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -5908,9 +5930,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001280", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", - "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", + "version": "1.0.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -6445,9 +6467,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -6479,9 +6501,9 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/common-tags": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.1.tgz", - "integrity": "sha512-uOZd85rJqrdEIE/JjhW5YAeatX8iqjjvVzIyfx7JL7G5r9Tep6YpYT9gEJWhWpVyDQEyzukWd6p2qULpJ8tmBw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "engines": { "node": ">=4.0.0" } @@ -6716,9 +6738,9 @@ } }, "node_modules/core-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz", - "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6726,11 +6748,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", + "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", "dependencies": { - "browserslist": "^4.17.6", + "browserslist": "^4.18.1", "semver": "7.0.0" }, "funding": { @@ -6747,9 +6769,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", - "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.3.tgz", + "integrity": "sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7195,9 +7217,9 @@ } }, "node_modules/csstype": { - "version": "2.6.18", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", - "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" }, "node_modules/custom-event-polyfill": { "version": "1.0.7", @@ -7709,9 +7731,9 @@ } }, "node_modules/domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dependencies": { "domelementtype": "^2.2.0" }, @@ -7875,9 +7897,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.896", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.896.tgz", - "integrity": "sha512-NcGkBVXePiuUrPLV8IxP43n1EOtdg+dudVjrfVEUd/bOqpQUFZ2diL5PPYzbgEhZFEltdXV3AcyKwGnEQ5lhMA==" + "version": "1.4.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz", + "integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==" }, "node_modules/element-resize-event": { "version": "3.0.6", @@ -8775,9 +8797,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.0.tgz", - "integrity": "sha512-0Ut+CkzpppgFtoIhdzi2LpdpxxBvgFf99eFqWxJnUrO7mMe0eOiNpou6rvNYeVVV6lWZvTah0BFne7k5xHjARg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", "dev": true, "dependencies": { "array-includes": "^3.1.4", @@ -8911,9 +8933,9 @@ } }, "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -9505,6 +9527,21 @@ "node": ">= 0.8" } }, + "node_modules/express/node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -9571,6 +9608,11 @@ "node": ">= 0.8.0" } }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "node_modules/express/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -9579,6 +9621,14 @@ "node": ">= 0.6" } }, + "node_modules/express/node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ext": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", @@ -10324,9 +10374,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", "funding": [ { "type": "individual", @@ -12376,15 +12426,16 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" @@ -12394,6 +12445,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13308,9 +13360,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "engines": { "node": ">= 0.4" }, @@ -13535,11 +13587,11 @@ } }, "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13658,9 +13710,9 @@ } }, "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -15553,9 +15605,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -15625,17 +15677,17 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jss": { @@ -15830,9 +15882,9 @@ "dev": true }, "node_modules/keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" }, "node_modules/killable": { "version": "1.0.1", @@ -16027,9 +16079,9 @@ "dev": true }, "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/load-json-file": { "version": "2.0.0", @@ -16401,9 +16453,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "engines": { "node": ">= 0.6.0" }, @@ -17048,9 +17100,9 @@ } }, "node_modules/minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dependencies": { "yallist": "^4.0.0" }, @@ -17431,14 +17483,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-notifier": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", @@ -17763,9 +17807,9 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -18499,12 +18543,9 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", "engines": { "node": ">= 6" } @@ -19723,9 +19764,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", + "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19766,9 +19807,9 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss-values-parser": { "version": "2.0.1", @@ -19784,9 +19825,9 @@ } }, "node_modules/preact": { - "version": "10.5.15", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.5.15.tgz", - "integrity": "sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA==", + "version": "10.6.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.4.tgz", + "integrity": "sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -20195,13 +20236,13 @@ "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==" }, "node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dev": true, "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -20276,9 +20317,9 @@ } }, "node_modules/rc-util": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.15.0.tgz", - "integrity": "sha512-8RI8sjOCXD3FhD3dzQNBQetpGol6BBd3sHQ/8jSGk9NPT0CH3JGtBfPODnASyE7AdDpCFQMOmgcp9CBs3S/1hg==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", + "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", "dependencies": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -20831,11 +20872,12 @@ } }, "node_modules/react-i18next": { - "version": "11.14.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.14.2.tgz", - "integrity": "sha512-fmDhwNA0zDmSEL3BBT5qwNMvxrKu25oXDDAZyHprfB0AHZmWXfBmRLf8MX8i1iBd2I2C2vsA2D9wxYBIwzooEQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", + "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", "dependencies": { "@babel/runtime": "^7.14.5", + "html-escaper": "^2.0.2", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { @@ -21031,9 +21073,9 @@ } }, "node_modules/react-onclickoutside": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.0.tgz", - "integrity": "sha512-oPlOTYcISLHfpMog2lUZMFSbqOs4LFcA4+vo7fpfevB5v9Z0D5VBDBkfeO5lv+hpEcGoaGk67braLT+QT+eICA==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", + "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==", "funding": { "type": "individual", "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" @@ -21089,9 +21131,9 @@ } }, "node_modules/react-rating/node_modules/@types/react": { - "version": "16.14.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.20.tgz", - "integrity": "sha512-SV7TaVc8e9E/5Xuv6TIyJ5VhQpZoVFJqX6IZgj5HZoFCtIDCArE3qXkcHlc6O/Ud4UwcMoX+tlvDA95YrKdLgA==", + "version": "16.14.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz", + "integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -21099,9 +21141,9 @@ } }, "node_modules/react-rating/node_modules/csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/react-redux": { "version": "7.2.6", @@ -21402,9 +21444,9 @@ } }, "node_modules/react-select/node_modules/csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/react-select/node_modules/dom-helpers": { "version": "5.2.1", @@ -21471,9 +21513,9 @@ } }, "node_modules/react-toastify/node_modules/csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/react-toastify/node_modules/dom-helpers": { "version": "5.2.1", @@ -22786,12 +22828,14 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "node_modules/sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" @@ -22993,6 +23037,12 @@ "node": ">=8" } }, + "node_modules/sass/node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -23289,9 +23339,10 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/sha.js": { "version": "2.4.11", @@ -23381,9 +23432,12 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "node_modules/shifty": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/shifty/-/shifty-2.16.0.tgz", - "integrity": "sha512-hmaxYxbunTNYGcoMS9OGvgjymPP29HWaWc0k+Dv16zo9PhjRGdTbPCT/uH75DDuRbwP4RW9D9e/HhxkyoTQm8Q==" + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/shifty/-/shifty-2.17.1.tgz", + "integrity": "sha512-ime0aar6UX4OHG8WjC84ThqLU6PWf/6UdSLCMJFvWmeYx1PmuxvRNwiJom4py7GVLv10xRfDKt0MssotIxkYhQ==", + "optionalDependencies": { + "fsevents": "^2.3.2" + } }, "node_modules/side-channel": { "version": "1.0.4", @@ -23399,9 +23453,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "node_modules/simple-swizzle": { "version": "0.2.2", @@ -23824,6 +23878,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -23837,9 +23900,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23888,9 +23951,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "node_modules/spdy": { "version": "4.0.2", @@ -23921,9 +23984,9 @@ } }, "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -23955,9 +24018,9 @@ } }, "node_modules/spdy/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -25204,9 +25267,10 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -26569,9 +26633,9 @@ } }, "node_modules/webpack-dev-server/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -27840,9 +27904,9 @@ } }, "@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" }, "@babel/core": { "version": "7.9.0", @@ -27868,9 +27932,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -27969,9 +28033,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -27984,9 +28048,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -28086,9 +28150,9 @@ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz", - "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.0", "@babel/helper-wrap-function": "^7.16.0", @@ -28200,9 +28264,9 @@ } }, "@babel/parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", - "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==" + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.2", @@ -28223,12 +28287,12 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz", - "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0", + "@babel/helper-remap-async-to-generator": "^7.16.4", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -28907,17 +28971,17 @@ } }, "@babel/preset-env": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz", - "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-class-static-block": "^7.16.0", "@babel/plugin-proposal-dynamic-import": "^7.16.0", @@ -28967,7 +29031,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", "@babel/plugin-transform-new-target": "^7.16.0", "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", "@babel/plugin-transform-property-literals": "^7.16.0", "@babel/plugin-transform-regenerator": "^7.16.0", "@babel/plugin-transform-reserved-words": "^7.16.0", @@ -28980,10 +29044,10 @@ "@babel/plugin-transform-unicode-regex": "^7.16.0", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.2.3", - "babel-plugin-polyfill-corejs3": "^0.3.0", - "babel-plugin-polyfill-regenerator": "^0.2.3", - "core-js-compat": "^3.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", "semver": "^6.3.0" } }, @@ -29065,9 +29129,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -29128,9 +29192,9 @@ } }, "@emotion/core": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.1.1.tgz", - "integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", + "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -29942,9 +30006,9 @@ } }, "@loadable/component": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.0.tgz", - "integrity": "sha512-g63rQzypPOZi0BeGsK4ST2MYhsFR+i7bhL8k/McUoWDNMDuTTdUlQ2GACKxqh5sI/dNC/6nVoPrycMnSylnAgQ==", + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.15.2.tgz", + "integrity": "sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==", "requires": { "@babel/runtime": "^7.7.7", "hoist-non-react-statics": "^3.3.1", @@ -30124,9 +30188,9 @@ } }, "@types/babel__core": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", - "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.17.tgz", + "integrity": "sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -30228,9 +30292,9 @@ } }, "@types/lodash": { - "version": "4.14.176", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", - "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==" + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" }, "@types/minimatch": { "version": "3.0.5", @@ -30243,9 +30307,9 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" }, "@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "16.11.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -30276,9 +30340,9 @@ } }, "@types/react": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.34.tgz", - "integrity": "sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg==", + "version": "17.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", + "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -30286,9 +30350,9 @@ }, "dependencies": { "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" } } }, @@ -30382,9 +30446,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -31400,30 +31464,30 @@ "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.0", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz", - "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.0", "core-js-compat": "^3.18.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4" + "@babel/helper-define-polyfill-provider": "^0.3.0" } }, "babel-plugin-syntax-jsx": { @@ -31780,6 +31844,11 @@ "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -31813,10 +31882,20 @@ "unpipe": "1.0.0" } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" } } }, @@ -32039,9 +32118,9 @@ } }, "browserslist": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.0.tgz", - "integrity": "sha512-ER2M0g5iAR84fS/zjBDqEgU6iO5fS9JI2EkHr5zxDxYEFk3LjhU9Vpp/INb6RMQphxko7PDV1FH38H/qVP5yCA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", "requires": { "caniuse-lite": "^1.0.30001280", "electron-to-chromium": "^1.3.896", @@ -32162,9 +32241,10 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true }, "cacache": { "version": "13.0.1", @@ -32306,9 +32386,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001280", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", - "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==" + "version": "1.0.30001286", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", + "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==" }, "capture-exit": { "version": "2.0.0", @@ -32738,9 +32818,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -32766,9 +32846,9 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-tags": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.1.tgz", - "integrity": "sha512-uOZd85rJqrdEIE/JjhW5YAeatX8iqjjvVzIyfx7JL7G5r9Tep6YpYT9gEJWhWpVyDQEyzukWd6p2qULpJ8tmBw==" + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" }, "commondir": { "version": "1.0.1", @@ -32968,16 +33048,16 @@ } }, "core-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz", - "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==" + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" }, "core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.3.tgz", + "integrity": "sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==", "requires": { - "browserslist": "^4.17.6", + "browserslist": "^4.18.1", "semver": "7.0.0" }, "dependencies": { @@ -32989,9 +33069,9 @@ } }, "core-js-pure": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", - "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==" + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.3.tgz", + "integrity": "sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==" }, "core-util-is": { "version": "1.0.3", @@ -33344,9 +33424,9 @@ } }, "csstype": { - "version": "2.6.18", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", - "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" }, "custom-event-polyfill": { "version": "1.0.7", @@ -33772,9 +33852,9 @@ } }, "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "requires": { "domelementtype": "^2.2.0" } @@ -33910,9 +33990,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.896", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.896.tgz", - "integrity": "sha512-NcGkBVXePiuUrPLV8IxP43n1EOtdg+dudVjrfVEUd/bOqpQUFZ2diL5PPYzbgEhZFEltdXV3AcyKwGnEQ5lhMA==" + "version": "1.4.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz", + "integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==" }, "element-resize-event": { "version": "3.0.6", @@ -34334,9 +34414,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -34763,9 +34843,9 @@ } }, "eslint-plugin-react": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.0.tgz", - "integrity": "sha512-0Ut+CkzpppgFtoIhdzi2LpdpxxBvgFf99eFqWxJnUrO7mMe0eOiNpou6rvNYeVVV6lWZvTah0BFne7k5xHjARg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -35158,6 +35238,18 @@ "unpipe": "~1.0.0" } }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -35209,10 +35301,20 @@ "send": "0.17.1" } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" } } }, @@ -35834,9 +35936,9 @@ } }, "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" }, "for-in": { "version": "1.0.2", @@ -37481,21 +37583,23 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "dependencies": { "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true } } }, @@ -38186,9 +38290,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { "version": "7.0.0", @@ -38341,11 +38445,11 @@ "dev": true }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "is-windows": { @@ -38439,9 +38543,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -39968,9 +40072,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -40031,13 +40135,13 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -40203,9 +40307,9 @@ "dev": true }, "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" }, "killable": { "version": "1.0.1", @@ -40359,9 +40463,9 @@ "dev": true }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "load-json-file": { "version": "2.0.0", @@ -40661,9 +40765,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" }, "loose-envify": { "version": "1.4.0", @@ -41185,9 +41289,9 @@ } }, "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { "yallist": "^4.0.0" } @@ -41508,11 +41612,6 @@ } } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, "node-notifier": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", @@ -41764,9 +41863,9 @@ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==" }, "object-is": { "version": "1.1.5", @@ -42320,12 +42419,9 @@ } }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==" }, "pkg-dir": { "version": "2.0.0", @@ -43329,9 +43425,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz", + "integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -43365,9 +43461,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "postcss-values-parser": { "version": "2.0.1", @@ -43380,9 +43476,9 @@ } }, "preact": { - "version": "10.5.15", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.5.15.tgz", - "integrity": "sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA==" + "version": "10.6.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.4.tgz", + "integrity": "sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ==" }, "prelude-ls": { "version": "1.1.2", @@ -43720,13 +43816,13 @@ "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==" }, "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -43779,9 +43875,9 @@ } }, "rc-util": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.15.0.tgz", - "integrity": "sha512-8RI8sjOCXD3FhD3dzQNBQetpGol6BBd3sHQ/8jSGk9NPT0CH3JGtBfPODnASyE7AdDpCFQMOmgcp9CBs3S/1hg==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", + "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", "requires": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -44205,11 +44301,12 @@ "integrity": "sha512-Ule/KqHBwUvuubqGC4WDvOARS6VjlULSS+WHspgQ5FhFKR4ytHDc4AMpjVfnv+Wbz2TEbMp9/ZHmuZsUksPCiA==" }, "react-i18next": { - "version": "11.14.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.14.2.tgz", - "integrity": "sha512-fmDhwNA0zDmSEL3BBT5qwNMvxrKu25oXDDAZyHprfB0AHZmWXfBmRLf8MX8i1iBd2I2C2vsA2D9wxYBIwzooEQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.15.0.tgz", + "integrity": "sha512-7JOIO7KkKSxB7Ycof6ilx9aQ/tviInTqN2sqHyKrjd5MKHyFyKyXVkYrb7KmG/ISFPA4ugWwor5Qsq8IVyQ/Cg==", "requires": { "@babel/runtime": "^7.14.5", + "html-escaper": "^2.0.2", "html-parse-stringify": "^3.0.1" } }, @@ -44360,9 +44457,9 @@ } }, "react-onclickoutside": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.0.tgz", - "integrity": "sha512-oPlOTYcISLHfpMog2lUZMFSbqOs4LFcA4+vo7fpfevB5v9Z0D5VBDBkfeO5lv+hpEcGoaGk67braLT+QT+eICA==" + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz", + "integrity": "sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==" }, "react-popper": { "version": "0.10.4", @@ -44396,9 +44493,9 @@ }, "dependencies": { "@types/react": { - "version": "16.14.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.20.tgz", - "integrity": "sha512-SV7TaVc8e9E/5Xuv6TIyJ5VhQpZoVFJqX6IZgj5HZoFCtIDCArE3qXkcHlc6O/Ud4UwcMoX+tlvDA95YrKdLgA==", + "version": "16.14.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz", + "integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -44406,9 +44503,9 @@ } }, "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" } } }, @@ -44639,9 +44736,9 @@ }, "dependencies": { "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "dom-helpers": { "version": "5.2.1", @@ -44694,9 +44791,9 @@ }, "dependencies": { "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "dom-helpers": { "version": "5.2.1", @@ -45755,12 +45852,22 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "dependencies": { + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + } } }, "sass-graph": { @@ -46155,9 +46262,10 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "sha.js": { "version": "2.4.11", @@ -46228,9 +46336,12 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "shifty": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/shifty/-/shifty-2.16.0.tgz", - "integrity": "sha512-hmaxYxbunTNYGcoMS9OGvgjymPP29HWaWc0k+Dv16zo9PhjRGdTbPCT/uH75DDuRbwP4RW9D9e/HhxkyoTQm8Q==" + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/shifty/-/shifty-2.17.1.tgz", + "integrity": "sha512-ime0aar6UX4OHG8WjC84ThqLU6PWf/6UdSLCMJFvWmeYx1PmuxvRNwiJom4py7GVLv10xRfDKt0MssotIxkYhQ==", + "requires": { + "fsevents": "^2.3.2" + } }, "side-channel": { "version": "1.0.4", @@ -46243,9 +46354,9 @@ } }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "simple-swizzle": { "version": "0.2.2", @@ -46622,6 +46733,12 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -46635,9 +46752,9 @@ } }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -46683,9 +46800,9 @@ } }, "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "spdy": { "version": "4.0.2", @@ -46700,9 +46817,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -46728,9 +46845,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -47732,9 +47849,10 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true }, "tough-cookie": { "version": "2.5.0", @@ -49054,9 +49172,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } diff --git a/web/package.json b/web/package.json index 86348b67..816c60c2 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "myems", - "version": "1.4.0", + "version": "1.5.0", "private": true, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.1", diff --git a/web/src/config.js b/web/src/config.js index a6a98629..007d85e6 100644 --- a/web/src/config.js +++ b/web/src/config.js @@ -1,4 +1,4 @@ -export const version = '1.4.0'; +export const version = '1.5.0'; export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint export const topNavbarBreakpoint = 'lg'; //export const APIBaseURL = 'http://127.0.0.1:8000'; From 905cd6f870692d6c21d79ce05e5656f9cd505d48 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 13 Dec 2021 17:07:52 +0800 Subject: [PATCH 049/117] EmailMessages interface is modified --- .../fdd/emailmessage/emailmessageoption.controller.js | 7 ++++--- admin/app/services/fdd/emailmessageanalysis.service.js | 2 +- myems-api/app.py | 2 +- myems-api/core/emailmessage.py | 7 +++++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js index 06195354..98d7bc87 100644 --- a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js +++ b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js @@ -30,11 +30,12 @@ app.controller('EmailMessageOptionController', function( }; $scope.execute = function() { - var datestart, dateend; + var startdatetime, dateend; var query = { - datestart: $scope.daterange.startDate.format().slice(0, 10), - dateend: $scope.daterange.endDate.format().slice(0, 10) + startdatetime: $scope.daterange.startDate.format().slice(0, 10), + enddatetime: $scope.daterange.endDate.format().slice(0, 10) }; + console.log(query.startdatetime,query.enddatetime) $scope.$emit('handleEmitEmailMessageOptionChanged', { load: true, period:$scope.currentPeriod diff --git a/admin/app/services/fdd/emailmessageanalysis.service.js b/admin/app/services/fdd/emailmessageanalysis.service.js index be596a7a..3f81cb6e 100644 --- a/admin/app/services/fdd/emailmessageanalysis.service.js +++ b/admin/app/services/fdd/emailmessageanalysis.service.js @@ -3,7 +3,7 @@ app.factory('EmailMessageAnalysisService', function($http) { return { getAnalysisResult: function(query, headers, callback) { - $http.get(getAPI()+"emailmessages"+"/from/"+query.datestart+"/to/"+query.dateend, {headers}) + $http.get(getAPI()+"emailmessages", { params: {startdatetime: query.startdatetime, enddatetime: query.enddatetime}} , {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/app.py b/myems-api/app.py index abadcf81..e54d4210 100644 --- a/myems-api/app.py +++ b/myems-api/app.py @@ -170,7 +170,7 @@ api.add_route('/distributionsystems/{id_}', api.add_route('/distributionsystems/{id_}/distributioncircuits', distributionsystem.DistributionSystemDistributionCircuitCollection()) -api.add_route('/emailmessages/from/{startdate}/to/{enddate}', +api.add_route('/emailmessages', emailmessage.EmailMessageCollection()) api.add_route('/emailmessages/{id_}', emailmessage.EmailMessageItem()) diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index eab41ee5..73bd3cce 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -17,8 +17,11 @@ class EmailMessageCollection: resp.status = falcon.HTTP_200 @staticmethod - def on_get(req, resp, startdate, enddate): - access_control(req) + def on_get(req, resp): + # access_control(req) + print(req.params) + startdate = req.params.get('startdatetime') + enddate = req.params.get('enddatetime') try: start_datetime_local = datetime.strptime(startdate, '%Y-%m-%d') except Exception: From 45e9bd9e7e13b0dcc186cbbb3960532816eb418c Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 13 Dec 2021 17:13:11 +0800 Subject: [PATCH 050/117] Modified the EmailMessages interface --- .../fdd/emailmessage/emailmessageoption.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js index 98d7bc87..71ccea0f 100644 --- a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js +++ b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js @@ -30,12 +30,12 @@ app.controller('EmailMessageOptionController', function( }; $scope.execute = function() { - var startdatetime, dateend; + var startdatetime, enddatetime; var query = { startdatetime: $scope.daterange.startDate.format().slice(0, 10), enddatetime: $scope.daterange.endDate.format().slice(0, 10) }; - console.log(query.startdatetime,query.enddatetime) + $scope.$emit('handleEmitEmailMessageOptionChanged', { load: true, period:$scope.currentPeriod From 3cc2c929ec30811285780017014da8f53c612859 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Mon, 13 Dec 2021 17:28:20 +0800 Subject: [PATCH 051/117] Modified the EmailMessages interface --- myems-api/core/emailmessage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index 73bd3cce..07e5830f 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -18,7 +18,7 @@ class EmailMessageCollection: @staticmethod def on_get(req, resp): - # access_control(req) + access_control(req) print(req.params) startdate = req.params.get('startdatetime') enddate = req.params.get('enddatetime') From d387684a782dcd15065c701fbbcc9fd9d2770eaf Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Mon, 13 Dec 2021 20:15:41 +0800 Subject: [PATCH 052/117] lock user --- admin/app/api.js | 2 +- .../controllers/users/user/user.controller.js | 35 +++++++ admin/app/services/users/user/user.service.js | 8 ++ admin/app/translations.js | 5 + admin/views/users/user/user.html | 1 + myems-api/app.py | 2 + myems-api/core/user.py | 93 ++++++++++++++++++- 7 files changed, 141 insertions(+), 5 deletions(-) diff --git a/admin/app/api.js b/admin/app/api.js index 89aa9e28..ae9f7569 100644 --- a/admin/app/api.js +++ b/admin/app/api.js @@ -1,6 +1,6 @@ //Switch Classes Function function getAPI(){ - //return "http://127.0.0.1:8000/"; + // return "http://127.0.0.1:8000/"; // to avoid CORS issue, use Nginx to proxy myems-api to path /api with the same ip and port as myems-web return window.location.protocol+"//"+window.location.hostname+":"+window.location.port+"/api/"; } diff --git a/admin/app/controllers/users/user/user.controller.js b/admin/app/controllers/users/user/user.controller.js index 71063a83..a062907d 100644 --- a/admin/app/controllers/users/user/user.controller.js +++ b/admin/app/controllers/users/user/user.controller.js @@ -186,6 +186,41 @@ app.controller('UserController', function ($scope, }); }; + $scope.unlockUser = function (user){ + SweetAlert.swal({ + title: $translate.instant("SWEET.UNLOCK_TITLE"), + type: "warning", + showCancelButton: true, + confirmButtonColor: "#DD6B55", + confirmButtonText: $translate.instant("SWEET.UNLOCK_CONFIRM_BUTTON_TEXT"), + cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"), + closeOnConfirm: true, + closeOnCancel: true + },function (isConfirm) { + if (isConfirm) { + let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }; + UserService.unlockUser(user, headers, function (response) { + if (angular.isDefined(response.status) && response.status === 200) { + toaster.pop({ + type: "success", + title: $translate.instant("TOASTER.SUCCESS_TITLE"), + body: $translate.instant("TOASTER.SUCCESS_UNLOCK_BODY", { template: $translate.instant("SETTING.USER") }), + showCloseButton: true, + }); + $scope.getAllUsers(); + } else { + toaster.pop({ + type: "error", + title: $translate.instant("TOASTER.ERROR_UNLOCK_BODY", { template: $translate.instant("SETTING.USER") }), + body: $translate.instant(response.data.description), + showCloseButton: true, + }); + } + }); + } + }); + }; + $scope.getAllUsers(); $scope.getAllPrivileges(); diff --git a/admin/app/services/users/user/user.service.js b/admin/app/services/users/user/user.service.js index 29d39962..be8b2c02 100644 --- a/admin/app/services/users/user/user.service.js +++ b/admin/app/services/users/user/user.service.js @@ -64,6 +64,14 @@ app.factory('UserService', function($http) { }, function (response) { callback(response); }); + }, + unlockUser: function(user, headers, callback){ + $http.put(getAPI()+'users/unlock/'+ user.id, {user}, {headers}) + .then(function (response) { + callback(response); + }, function (response) { + callback(response); + }); } }; }); \ No newline at end of file diff --git a/admin/app/translations.js b/admin/app/translations.js index 5251e020..61e516c9 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -1107,6 +1107,7 @@ function config($translateProvider) { BIND_PROPERTY: '绑定属性', EDIT: '修改', DELETE: '删除', + UNLOCK: '解锁', SELECT: '选择', RESET: '重置', SAVE: '保存', @@ -1544,9 +1545,11 @@ function config($translateProvider) { SUCCESS_ADD_BODY: '添加 {{template}} 成功', SUCCESS_UPDATE_BODY: '更新 {{template}} 成功', SUCCESS_DELETE_BODY: '删除 {{template}} 成功', + SUCCESS_UNLOCK_BODY: '解锁 {{template}} 成功', ERROR_ADD_BODY: '添加 {{template}} 失败', ERROR_UPDATE_BODY: '更新 {{template}} 失败', ERROR_DELETE_BODY: '删除 {{template}} 失败', + ERROR_UNLOCK_BODY: '解锁 {{template}} 失败', USER_PASSWORD: '用户密码', BIND_METER_SUCCESS: '绑定计量表成功', @@ -1573,6 +1576,8 @@ function config($translateProvider) { TEXT: '删除该条也会删除所有与其相关数据!', CONFIRM_BUTTON_TEXT: '确认删除', CANCEL_BUTTON_TEXT: '取消', + UNLOCK_TITLE: '请确认是否解锁该用户登录权限', + UNLOCK_CONFIRM_BUTTON_TEXT: '确认解锁' }, API: { ADMINISTRATOR_SESSION_NOT_FOUND: 'Administrator Session Not Found', diff --git a/admin/views/users/user/user.html b/admin/views/users/user/user.html index 9ea9b675..41c399bc 100644 --- a/admin/views/users/user/user.html +++ b/admin/views/users/user/user.html @@ -36,6 +36,7 @@ {{'SETTING.EDIT' | translate}} {{'USER.RESET_PASSWORD' | translate}} {{'SETTING.DELETE' | translate}} + {{'SETTING.UNLOCK' | translate}} diff --git a/myems-api/app.py b/myems-api/app.py index abadcf81..a6bf2b8e 100644 --- a/myems-api/app.py +++ b/myems-api/app.py @@ -464,6 +464,8 @@ api.add_route('/users/resetpassword', user.ResetPassword()) api.add_route('/users/changepassword', user.ChangePassword()) +api.add_route('/users/unlock/{id_}', + user.Unlock()) api.add_route('/virtualmeters', virtualmeter.VirtualMeterCollection()) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 8c8fd9f5..c95a409e 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -444,7 +444,7 @@ class UserLogin: description='API.INVALID_USER_NAME') query = (" SELECT id, name, uuid, display_name, email, salt, password, is_admin, " - " account_expiration_datetime_utc, password_expiration_datetime_utc " + " account_expiration_datetime_utc, password_expiration_datetime_utc, login_counter " " FROM tbl_users " " WHERE name = %s ") cursor.execute(query, (str.strip(new_values['data']['name']).lower(),)) @@ -463,7 +463,8 @@ class UserLogin: "password": row[6], "is_admin": True if row[7] else False, "account_expiration_datetime_utc": row[8], - "password_expiration_datetime_utc": row[9]} + "password_expiration_datetime_utc": row[9], + "login_counter": row[10]} elif 'email' in new_values['data']: if not isinstance(new_values['data']['email'], str) or \ @@ -472,7 +473,7 @@ class UserLogin: description='API.INVALID_EMAIL') query = (" SELECT id, name, uuid, display_name, email, salt, password, is_admin, " - " account_expiration_datetime_utc, password_expiration_datetime_utc " + " account_expiration_datetime_utc, password_expiration_datetime_utc,login_counter " " FROM tbl_users " " WHERE email = %s ") cursor.execute(query, (str.strip(new_values['data']['email']).lower(),)) @@ -491,18 +492,33 @@ class UserLogin: "password": row[6], "is_admin": True if row[7] else False, "account_expiration_datetime_utc": row[8], - "password_expiration_datetime_utc": row[9]} + "password_expiration_datetime_utc": row[9], + "login_counter": row[10]} + else: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_USER_NAME_OR_EMAIL') + login_counter = result['login_counter'] + + if login_counter >= 3: + cursor.close() + cnx.disconnect() + raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_HAS_BEEN_LOCKED') + salt = result['salt'] password = str.strip(new_values['data']['password']) hashed_password = hashlib.sha512(salt.encode() + password.encode()).hexdigest() if hashed_password != result['password']: + update_login_counter = (" UPDATE tbl_users " + " SET login_counter = %s " + " WHERE uuid = %s ") + user_uuid = result['uuid'] + cursor.execute(update_login_counter, (login_counter + 1, user_uuid)) + cnx.commit() cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_PASSWORD') @@ -828,3 +844,72 @@ class ResetPassword: resp.status = falcon.HTTP_200 write_log(user_uuid=admin_user_uuid, request_method='PUT', resource_type='ResetPassword', resource_id=user_id, request_body=None) + + +class Unlock: + @staticmethod + def __init__(): + """Initializes Class""" + pass + + @staticmethod + def on_options(req, resp): + resp.status = falcon.HTTP_200 + + @staticmethod + def on_put(req, resp, id_): + """Handles PUT requests""" + if 'USER-UUID' not in req.headers or \ + not isinstance(req.headers['USER-UUID'], str) or \ + len(str.strip(req.headers['USER-UUID'])) == 0: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description='API.INVALID_USER_UUID') + admin_user_uuid = str.strip(req.headers['USER-UUID']) + + if not id_.isdigit() or int(id_) <= 0: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description='API.INVALID_USER_ID') + + Id = id_ + + cnx = mysql.connector.connect(**config.myems_user_db) + cursor = cnx.cursor() + + query = (" SELECT login_counter " + " FROM tbl_users " + " WHERE id = %s ") + cursor.execute(query, (Id,)) + row = cursor.fetchone() + if row is None: + cursor.close() + cnx.disconnect() + raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_Id') + + login_counter = row[0] + if login_counter < 3: + cursor.close() + cnx.disconnect() + raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_IS_NOT_LOCKED') + + update_user = (" UPDATE tbl_users " + " SET login_counter = 0" + " WHERE id = %s ") + cursor.execute(update_user, (Id, )) + cnx.commit() + + query = (" SELECT login_counter " + " FROM tbl_users " + " WHERE id = %s ") + cursor.execute(query, (Id,)) + row = cursor.fetchone() + if row is None or row[0] != 0: + cursor.close() + cnx.disconnect() + raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.ACCOUNT_UNLOCK_FAILED') + + cursor.close() + cnx.disconnect() + resp.text = json.dumps("OK") + resp.status = falcon.HTTP_200 + write_log(user_uuid=admin_user_uuid, request_method='PUT', resource_type='UnlockUser', + resource_id=Id, request_body=None) From d56f839e2111a7e321fda06eb52203bb7ddd84ec Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Tue, 14 Dec 2021 23:17:48 +0800 Subject: [PATCH 053/117] added failed_login_count to user database --- database/install/myems_user_db.sql | 5 +++-- database/upgrade/upgrade1.5.1.sql | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 database/upgrade/upgrade1.5.1.sql diff --git a/database/install/myems_user_db.sql b/database/install/myems_user_db.sql index 9c96ef78..253f8b79 100644 --- a/database/install/myems_user_db.sql +++ b/database/install/myems_user_db.sql @@ -24,6 +24,7 @@ CREATE TABLE IF NOT EXISTS `myems_user_db`.`tbl_users` ( `privilege_id` BIGINT NULL, `account_expiration_datetime_utc` DATETIME NOT NULL, `password_expiration_datetime_utc` DATETIME NOT NULL, + `failed_login_count` INT NOT NULL, PRIMARY KEY (`id`)); -- -------------------------------------------------------------------------------------------------------------------- @@ -33,9 +34,9 @@ START TRANSACTION; USE `myems_user_db`; -- default username: administrator -- default password: !MyEMS1 -INSERT INTO `myems_user_db`.`tbl_users`(`id`, `name`, `uuid`, `display_name`, `email`, `salt`, `password`, `is_admin`, `privilege_id`, `account_expiration_datetime_utc`, `password_expiration_datetime_utc`) +INSERT INTO `myems_user_db`.`tbl_users`(`id`, `name`, `uuid`, `display_name`, `email`, `salt`, `password`, `is_admin`, `privilege_id`, `account_expiration_datetime_utc`, `password_expiration_datetime_utc`, `failed_login_count`) VALUES -(1, 'administrator', 'dcdb67d1-6116-4987-916f-6fc6cf2bc0e4', 'Administrator', 'administrator@myems.io', 'adfd6fb6d78d4e3780ebdd6afdec2c3a', 'bc00df65270b1a72b9ed37136fa95a695896edc8c114391821f5edc6b1bbdbabc3d449962f8d1c7a4ec3f2d0a1a79055623963d88ecb9b778423194ff7b6be42', 1, NULL, '2099-12-31 16:00:00', '2099-12-31 16:00:00'); +(1, 'administrator', 'dcdb67d1-6116-4987-916f-6fc6cf2bc0e4', 'Administrator', 'administrator@myems.io', 'adfd6fb6d78d4e3780ebdd6afdec2c3a', 'bc00df65270b1a72b9ed37136fa95a695896edc8c114391821f5edc6b1bbdbabc3d449962f8d1c7a4ec3f2d0a1a79055623963d88ecb9b778423194ff7b6be42', 1, NULL, '2099-12-31 16:00:00', '2099-12-31 16:00:00', 0); COMMIT; -- --------------------------------------------------------------------------------------------------------------------- diff --git a/database/upgrade/upgrade1.5.1.sql b/database/upgrade/upgrade1.5.1.sql new file mode 100644 index 00000000..b07acf01 --- /dev/null +++ b/database/upgrade/upgrade1.5.1.sql @@ -0,0 +1,6 @@ + +ALTER TABLE `myems_user_db`.`tbl_users` ADD `failed_login_count` INT NOT NULL DEFAULT 0 AFTER password_expiration_datetime_utc; + + +-- UPDATE VERSION NUMBER +UPDATE myems_system_db.tbl_versions SET version='1.5.1', release_date='2021-12-18' WHERE id=1; From 952e9dd2780d267c8866fdb937ff8c666ec12163 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Wed, 15 Dec 2021 09:49:38 +0800 Subject: [PATCH 054/117] Modified the EmailMessages interface3 --- .../fdd/emailmessageanalysis.service.js | 2 +- myems-api/core/emailmessage.py | 48 +++++++++++-------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/admin/app/services/fdd/emailmessageanalysis.service.js b/admin/app/services/fdd/emailmessageanalysis.service.js index 3f81cb6e..be0a6ab9 100644 --- a/admin/app/services/fdd/emailmessageanalysis.service.js +++ b/admin/app/services/fdd/emailmessageanalysis.service.js @@ -3,7 +3,7 @@ app.factory('EmailMessageAnalysisService', function($http) { return { getAnalysisResult: function(query, headers, callback) { - $http.get(getAPI()+"emailmessages", { params: {startdatetime: query.startdatetime, enddatetime: query.enddatetime}} , {headers}) + $http.get(getAPI()+"emailmessages?" + 'startdatetime=' + query.startdatetime + '&enddatetime=' + query.enddatetime, {headers}) .then(function (response) { callback(response); }, function (response) { diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index 07e5830f..a34ab3d8 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -13,38 +13,46 @@ class EmailMessageCollection: pass @staticmethod - def on_options(req, resp, startdate, enddate): + def on_options(req, resp): resp.status = falcon.HTTP_200 @staticmethod def on_get(req, resp): access_control(req) print(req.params) - startdate = req.params.get('startdatetime') - enddate = req.params.get('enddatetime') - try: - start_datetime_local = datetime.strptime(startdate, '%Y-%m-%d') - except Exception: - raise falcon.HTTPError(falcon.HTTP_400, - title='API.BAD_REQUEST', - description='API.INVALID_START_DATE_FORMAT') - try: - end_datetime_local = datetime.strptime(enddate, '%Y-%m-%d') - except Exception: - raise falcon.HTTPError(falcon.HTTP_400, - title='API.BAD_REQUEST', - description='API.INVALID_END_DATE_FORMAT') + start_datetime_local = req.params.get('startdatetime') + end_datetime_local = req.params.get('enddatetime') timezone_offset = int(config.utc_offset[1:3]) * 60 + int(config.utc_offset[4:6]) if config.utc_offset[0] == '-': timezone_offset = -timezone_offset - start_datetime_utc = start_datetime_local.replace(tzinfo=timezone.utc) - start_datetime_utc -= timedelta(minutes=timezone_offset) + if start_datetime_local is None: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description="API.INVALID_START_DATE_FORMAT") + else: + start_datetime_local = str.strip(start_datetime_local) + try: + start_datetime_utc = datetime.strptime(start_datetime_local, + '%Y-%m-%d').replace(tzinfo=timezone.utc) - \ + timedelta(minutes=timezone_offset) + except ValueError: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description="API.INVALID_START_DATE_FORMAT") - end_datetime_utc = end_datetime_local.replace(tzinfo=timezone.utc) - end_datetime_utc -= timedelta(minutes=timezone_offset) - end_datetime_utc += timedelta(days=1) + if end_datetime_local is None: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description="API.INVALID_END_DATE_FORMAT") + else: + end_datetime_local = str.strip(end_datetime_local) + try: + end_datetime_utc = datetime.strptime(end_datetime_local, + '%Y-%m-%d').replace(tzinfo=timezone.utc) - \ + timedelta(minutes=timezone_offset) + end_datetime_utc += timedelta(days=1) + except ValueError: + raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', + description="API.INVALID_END_DATE_FORMAT") if start_datetime_utc >= end_datetime_utc: raise falcon.HTTPError(falcon.HTTP_400, From a581caa2fa833ea8c914bbfa57d70669d87eaf8a Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Wed, 15 Dec 2021 09:52:55 +0800 Subject: [PATCH 055/117] Modified the EmailMessages interface4 --- myems-api/core/emailmessage.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index a34ab3d8..4b5b0ed3 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -29,7 +29,7 @@ class EmailMessageCollection: if start_datetime_local is None: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description="API.INVALID_START_DATE_FORMAT") + description="API.INVALID_START_DATETIME_FORMAT") else: start_datetime_local = str.strip(start_datetime_local) try: @@ -38,11 +38,11 @@ class EmailMessageCollection: timedelta(minutes=timezone_offset) except ValueError: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description="API.INVALID_START_DATE_FORMAT") + description="API.INVALID_START_DATETIME_FORMAT") if end_datetime_local is None: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description="API.INVALID_END_DATE_FORMAT") + description="API.INVALID_END_DATETIME_FORMAT") else: end_datetime_local = str.strip(end_datetime_local) try: @@ -52,7 +52,7 @@ class EmailMessageCollection: end_datetime_utc += timedelta(days=1) except ValueError: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', - description="API.INVALID_END_DATE_FORMAT") + description="API.INVALID_END_DATETIME_FORMAT") if start_datetime_utc >= end_datetime_utc: raise falcon.HTTPError(falcon.HTTP_400, From 3810b0cf3078dca31d4d6516af88a890a5aa0bae Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 15 Dec 2021 11:48:06 +0800 Subject: [PATCH 056/117] modified login_counter to failed_login_count --- myems-api/core/user.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index c95a409e..69df28de 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -444,7 +444,7 @@ class UserLogin: description='API.INVALID_USER_NAME') query = (" SELECT id, name, uuid, display_name, email, salt, password, is_admin, " - " account_expiration_datetime_utc, password_expiration_datetime_utc, login_counter " + " account_expiration_datetime_utc, password_expiration_datetime_utc, failed_login_count " " FROM tbl_users " " WHERE name = %s ") cursor.execute(query, (str.strip(new_values['data']['name']).lower(),)) @@ -464,7 +464,7 @@ class UserLogin: "is_admin": True if row[7] else False, "account_expiration_datetime_utc": row[8], "password_expiration_datetime_utc": row[9], - "login_counter": row[10]} + "failed_login_count": row[10]} elif 'email' in new_values['data']: if not isinstance(new_values['data']['email'], str) or \ @@ -473,7 +473,7 @@ class UserLogin: description='API.INVALID_EMAIL') query = (" SELECT id, name, uuid, display_name, email, salt, password, is_admin, " - " account_expiration_datetime_utc, password_expiration_datetime_utc,login_counter " + " account_expiration_datetime_utc, password_expiration_datetime_utc,failed_login_count " " FROM tbl_users " " WHERE email = %s ") cursor.execute(query, (str.strip(new_values['data']['email']).lower(),)) @@ -493,7 +493,7 @@ class UserLogin: "is_admin": True if row[7] else False, "account_expiration_datetime_utc": row[8], "password_expiration_datetime_utc": row[9], - "login_counter": row[10]} + "failed_login_count": row[10]} else: cursor.close() @@ -501,9 +501,9 @@ class UserLogin: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description='API.INVALID_USER_NAME_OR_EMAIL') - login_counter = result['login_counter'] + failed_login_count = result['failed_login_count'] - if login_counter >= 3: + if failed_login_count >= 3: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_HAS_BEEN_LOCKED') @@ -513,11 +513,11 @@ class UserLogin: hashed_password = hashlib.sha512(salt.encode() + password.encode()).hexdigest() if hashed_password != result['password']: - update_login_counter = (" UPDATE tbl_users " - " SET login_counter = %s " + update_failed_login_count = (" UPDATE tbl_users " + " SET failed_login_count = %s " " WHERE uuid = %s ") user_uuid = result['uuid'] - cursor.execute(update_login_counter, (login_counter + 1, user_uuid)) + cursor.execute(update_failed_login_count, (failed_login_count + 1, user_uuid)) cnx.commit() cursor.close() cnx.disconnect() @@ -875,7 +875,7 @@ class Unlock: cnx = mysql.connector.connect(**config.myems_user_db) cursor = cnx.cursor() - query = (" SELECT login_counter " + query = (" SELECT failed_login_count " " FROM tbl_users " " WHERE id = %s ") cursor.execute(query, (Id,)) @@ -885,19 +885,19 @@ class Unlock: cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_Id') - login_counter = row[0] - if login_counter < 3: + failed_login_count = row[0] + if failed_login_count < 3: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_IS_NOT_LOCKED') update_user = (" UPDATE tbl_users " - " SET login_counter = 0" + " SET failed_login_count = 0" " WHERE id = %s ") cursor.execute(update_user, (Id, )) cnx.commit() - query = (" SELECT login_counter " + query = (" SELECT failed_login_count " " FROM tbl_users " " WHERE id = %s ") cursor.execute(query, (Id,)) From 747daab4cbd94a1d20fb86d7def7377d5ede233a Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 15 Dec 2021 11:49:46 +0800 Subject: [PATCH 057/117] 2021/12/15 11:49 --- admin/app/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/app/api.js b/admin/app/api.js index ae9f7569..89aa9e28 100644 --- a/admin/app/api.js +++ b/admin/app/api.js @@ -1,6 +1,6 @@ //Switch Classes Function function getAPI(){ - // return "http://127.0.0.1:8000/"; + //return "http://127.0.0.1:8000/"; // to avoid CORS issue, use Nginx to proxy myems-api to path /api with the same ip and port as myems-web return window.location.protocol+"//"+window.location.hostname+":"+window.location.port+"/api/"; } From 83758854681c7be2c102dabc1de7df2a19d1f8d5 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 15 Dec 2021 14:40:13 +0800 Subject: [PATCH 058/117] If the login is successful, failed login count is cleared --- admin/views/users/user/user.html | 2 +- myems-api/core/user.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/admin/views/users/user/user.html b/admin/views/users/user/user.html index 41c399bc..eae9dd2d 100644 --- a/admin/views/users/user/user.html +++ b/admin/views/users/user/user.html @@ -36,7 +36,7 @@ {{'SETTING.EDIT' | translate}} {{'USER.RESET_PASSWORD' | translate}} {{'SETTING.DELETE' | translate}} - {{'SETTING.UNLOCK' | translate}} + {{'SETTING.UNLOCK' | translate}} diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 69df28de..fae74f6a 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -27,7 +27,7 @@ class UserCollection: cursor = cnx.cursor() query = (" SELECT u.id, u.name, u.display_name, u.uuid, " " u.email, u.is_admin, p.id, p.name, " - " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc " + " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc, u.failed_login_count " " FROM tbl_users u " " LEFT JOIN tbl_privileges p ON u.privilege_id = p.id " " ORDER BY u.name ") @@ -59,7 +59,8 @@ class UserCollection: "account_expiration_datetime": account_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "password_expiration_datetime": - password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S')} + password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), + "failed_login_count": row[10]} result.append(meta_result) resp.text = json.dumps(result) @@ -523,6 +524,14 @@ class UserLogin: cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_PASSWORD') + if failed_login_count != 0: + update_failed_login_count = (" UPDATE tbl_users " + " SET failed_login_count = 0 " + " WHERE uuid = %s ") + user_uuid = result['uuid'] + cursor.execute(update_failed_login_count, (user_uuid, )) + cnx.commit() + if result['account_expiration_datetime_utc'] <= datetime.utcnow(): cursor.close() cnx.disconnect() From 9086a2c7676bbf4b98fdf73ed5cfbc4e4d28a6c4 Mon Sep 17 00:00:00 2001 From: tianlinzhong <673359306@qq.com> Date: Wed, 15 Dec 2021 15:13:52 +0800 Subject: [PATCH 059/117] Modified the EmailMessages interface 5 --- .../fdd/emailmessage/emailmessageoption.controller.js | 10 +++++----- myems-api/core/emailmessage.py | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js index 71ccea0f..970be75a 100644 --- a/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js +++ b/admin/app/controllers/fdd/emailmessage/emailmessageoption.controller.js @@ -11,14 +11,14 @@ app.controller('EmailMessageOptionController', function( endDate: moment() }; $scope.dtOptions = { - timePicker: false, + timePicker: true, timePicker24Hour: true, timePickerIncrement: 1, timePickerSeconds: true, startView:2, autoApply: true, locale:{ - format: 'YYYY-MM-DD', + format: 'YYYY-MM-DDTHH:mm:ss', applyLabel: "OK", cancelLabel: "Cancel", }, @@ -32,10 +32,10 @@ app.controller('EmailMessageOptionController', function( $scope.execute = function() { var startdatetime, enddatetime; var query = { - startdatetime: $scope.daterange.startDate.format().slice(0, 10), - enddatetime: $scope.daterange.endDate.format().slice(0, 10) + startdatetime: $scope.daterange.startDate.format().slice(0, 19), + enddatetime: $scope.daterange.endDate.format().slice(0, 19) }; - + $scope.$emit('handleEmitEmailMessageOptionChanged', { load: true, period:$scope.currentPeriod diff --git a/myems-api/core/emailmessage.py b/myems-api/core/emailmessage.py index 4b5b0ed3..050dbfbb 100644 --- a/myems-api/core/emailmessage.py +++ b/myems-api/core/emailmessage.py @@ -34,7 +34,7 @@ class EmailMessageCollection: start_datetime_local = str.strip(start_datetime_local) try: start_datetime_utc = datetime.strptime(start_datetime_local, - '%Y-%m-%d').replace(tzinfo=timezone.utc) - \ + '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc) - \ timedelta(minutes=timezone_offset) except ValueError: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', @@ -47,9 +47,8 @@ class EmailMessageCollection: end_datetime_local = str.strip(end_datetime_local) try: end_datetime_utc = datetime.strptime(end_datetime_local, - '%Y-%m-%d').replace(tzinfo=timezone.utc) - \ + '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc) - \ timedelta(minutes=timezone_offset) - end_datetime_utc += timedelta(days=1) except ValueError: raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', description="API.INVALID_END_DATETIME_FORMAT") From 82a9735a776b9ac4d9353041ec3d306b4c6dd89c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 16 Dec 2021 21:57:16 +0800 Subject: [PATCH 060/117] added maximum_failed_login_count to config in api --- myems-api/config.py | 163 ++++++++++++++--------------------------- myems-api/core/user.py | 8 +- 2 files changed, 57 insertions(+), 114 deletions(-) diff --git a/myems-api/config.py b/myems-api/config.py index 29b019ae..3a9bb99b 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -1,154 +1,97 @@ from decouple import config -MYEMS_SYSTEM_DB_HOST = config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1') -MYEMS_SYSTEM_DB_PORT = config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int) -MYEMS_SYSTEM_DB_DATABASE = config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db') -MYEMS_SYSTEM_DB_USER = config('MYEMS_SYSTEM_DB_USER', default='root') -MYEMS_SYSTEM_DB_PASSWORD = config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_DB_HOST = config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_DB_PORT = config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_DB_DATABASE = config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db') -MYEMS_ENERGY_DB_USER = config('MYEMS_ENERGY_DB_USER', default='root') -MYEMS_ENERGY_DB_PASSWORD = config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_BASELINE_DB_HOST = config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_BASELINE_DB_PORT = config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_BASELINE_DB_DATABASE = config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db') -MYEMS_ENERGY_BASELINE_DB_USER = config('MYEMS_ENERGY_BASELINE_DB_USER', default='root') -MYEMS_ENERGY_BASELINE_DB_PASSWORD = config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_DB_HOST = config('MYEMS_BILLING_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_DB_PORT = config('MYEMS_BILLING_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_DB_DATABASE = config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db') -MYEMS_BILLING_DB_USER = config('MYEMS_BILLING_DB_USER', default='root') -MYEMS_BILLING_DB_PASSWORD = config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_BASELINE_DB_HOST = config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_BASELINE_DB_PORT = config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_BASELINE_DB_DATABASE = config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db') -MYEMS_BILLING_BASELINE_DB_USER = config('MYEMS_BILLING_BASELINE_DB_USER', default='root') -MYEMS_BILLING_BASELINE_DB_PASSWORD = config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_HISTORICAL_DB_HOST = config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1') -MYEMS_HISTORICAL_DB_PORT = config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int) -MYEMS_HISTORICAL_DB_DATABASE = config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db') -MYEMS_HISTORICAL_DB_USER = config('MYEMS_HISTORICAL_DB_USER', default='root') -MYEMS_HISTORICAL_DB_PASSWORD = config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1') - -MYEMS_USER_DB_HOST = config('MYEMS_USER_DB_HOST', default='127.0.0.1') -MYEMS_USER_DB_PORT = config('MYEMS_USER_DB_PORT', default=3306, cast=int) -MYEMS_USER_DB_DATABASE = config('MYEMS_USER_DB_DATABASE', default='myems_user_db') -MYEMS_USER_DB_USER = config('MYEMS_USER_DB_USER', default='root') -MYEMS_USER_DB_PASSWORD = config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1') - -MYEMS_FDD_DB_HOST = config('MYEMS_FDD_DB_HOST', default='127.0.0.1') -MYEMS_FDD_DB_PORT = config('MYEMS_FDD_DB_PORT', default=3306, cast=int) -MYEMS_FDD_DB_DATABASE = config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db') -MYEMS_FDD_DB_USER = config('MYEMS_FDD_DB_USER', default='root') -MYEMS_FDD_DB_PASSWORD = config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1') - -MYEMS_REPORTING_DB_HOST = config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1') -MYEMS_REPORTING_DB_PORT = config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int) -MYEMS_REPORTING_DB_DATABASE = config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db') -MYEMS_REPORTING_DB_USER = config('MYEMS_REPORTING_DB_USER', default='root') -MYEMS_REPORTING_DB_PASSWORD = config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1') - -MINUTES_TO_COUNT = config('MINUTES_TO_COUNT', default=60, cast=int) -UTC_OFFSET = config('UTC_OFFSET', default='+08:00') -WORKING_DAY_START_TIME_LOCAL = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') -UPLOAD_PATH = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') -CURRENCY_UNIT = config('CURRENCY_UNIT', default='CNY') - myems_system_db = { - 'host': MYEMS_SYSTEM_DB_HOST, - 'port': MYEMS_SYSTEM_DB_PORT, - 'database': MYEMS_SYSTEM_DB_DATABASE, - 'user': MYEMS_SYSTEM_DB_USER, - 'password': MYEMS_SYSTEM_DB_PASSWORD, + 'host': config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db'), + 'user': config('MYEMS_SYSTEM_DB_USER', default='root'), + 'password': config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1'), } myems_energy_db = { - 'host': MYEMS_ENERGY_DB_HOST, - 'port': MYEMS_ENERGY_DB_PORT, - 'database': MYEMS_ENERGY_DB_DATABASE, - 'user': MYEMS_ENERGY_DB_USER, - 'password': MYEMS_ENERGY_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db'), + 'user': config('MYEMS_ENERGY_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1'), } myems_energy_baseline_db = { - 'host': MYEMS_ENERGY_BASELINE_DB_HOST, - 'port': MYEMS_ENERGY_BASELINE_DB_PORT, - 'database': MYEMS_ENERGY_BASELINE_DB_DATABASE, - 'user': MYEMS_ENERGY_BASELINE_DB_USER, - 'password': MYEMS_ENERGY_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db'), + 'user': config('MYEMS_ENERGY_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_billing_db = { - 'host': MYEMS_BILLING_DB_HOST, - 'port': MYEMS_BILLING_DB_PORT, - 'database': MYEMS_BILLING_DB_DATABASE, - 'user': MYEMS_BILLING_DB_USER, - 'password': MYEMS_BILLING_DB_PASSWORD, + 'host': config('MYEMS_BILLING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db'), + 'user': config('MYEMS_BILLING_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1'), } myems_billing_baseline_db = { - 'host': MYEMS_BILLING_BASELINE_DB_HOST, - 'port': MYEMS_BILLING_BASELINE_DB_PORT, - 'database': MYEMS_BILLING_BASELINE_DB_DATABASE, - 'user': MYEMS_BILLING_BASELINE_DB_USER, - 'password': MYEMS_BILLING_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db'), + 'user': config('MYEMS_BILLING_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_historical_db = { - 'host': MYEMS_HISTORICAL_DB_HOST, - 'port': MYEMS_HISTORICAL_DB_PORT, - 'database': MYEMS_HISTORICAL_DB_DATABASE, - 'user': MYEMS_HISTORICAL_DB_USER, - 'password': MYEMS_HISTORICAL_DB_PASSWORD, + 'host': config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db'), + 'user': config('MYEMS_HISTORICAL_DB_USER', default='root'), + 'password': config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1'), } myems_user_db = { - 'host': MYEMS_USER_DB_HOST, - 'port': MYEMS_USER_DB_PORT, - 'database': MYEMS_USER_DB_DATABASE, - 'user': MYEMS_USER_DB_USER, - 'password': MYEMS_USER_DB_PASSWORD, + 'host': config('MYEMS_USER_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_USER_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_USER_DB_DATABASE', default='myems_user_db'), + 'user': config('MYEMS_USER_DB_USER', default='root'), + 'password': config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1'), } myems_fdd_db = { - 'host': MYEMS_FDD_DB_HOST, - 'port': MYEMS_FDD_DB_PORT, - 'database': MYEMS_FDD_DB_DATABASE, - 'user': MYEMS_FDD_DB_USER, - 'password': MYEMS_FDD_DB_PASSWORD, + 'host': config('MYEMS_FDD_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_FDD_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db'), + 'user': config('MYEMS_FDD_DB_USER', default='root'), + 'password': config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1'), } myems_reporting_db = { - 'host': MYEMS_REPORTING_DB_HOST, - 'port': MYEMS_REPORTING_DB_PORT, - 'database': MYEMS_REPORTING_DB_DATABASE, - 'user': MYEMS_REPORTING_DB_USER, - 'password': MYEMS_REPORTING_DB_PASSWORD, + 'host': config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db'), + 'user': config('MYEMS_REPORTING_DB_USER', default='root'), + 'password': config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1'), } # indicated in how many minutes to calculate meter energy consumption # 30 for half hourly period # 60 for hourly period -minutes_to_count = MINUTES_TO_COUNT +minutes_to_count = config('MINUTES_TO_COUNT', default=60, cast=int) # indicates the project's time zone offset from UTC -utc_offset = UTC_OFFSET +utc_offset = config('UTC_OFFSET', default='+08:00') # indicates from when ( in local timezone) of the day to calculate working days -working_day_start_time_local = WORKING_DAY_START_TIME_LOCAL +working_day_start_time_local = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') # indicates where user uploaded files will be saved to # must use the root folder of myems-admin web application # for example if you serve myems-admin at /var/www/html/admin # you should set the upload_path as below -upload_path = UPLOAD_PATH +upload_path = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') # main currency unit -currency_unit = CURRENCY_UNIT +currency_unit = config('CURRENCY_UNIT', default='CNY') + +# maximum failed login count, otherwise the user should be locked +maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=6, cast=int) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index fae74f6a..aefd2e83 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -504,7 +504,7 @@ class UserLogin: failed_login_count = result['failed_login_count'] - if failed_login_count >= 3: + if failed_login_count >= config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_HAS_BEEN_LOCKED') @@ -515,8 +515,8 @@ class UserLogin: if hashed_password != result['password']: update_failed_login_count = (" UPDATE tbl_users " - " SET failed_login_count = %s " - " WHERE uuid = %s ") + " SET failed_login_count = %s " + " WHERE uuid = %s ") user_uuid = result['uuid'] cursor.execute(update_failed_login_count, (failed_login_count + 1, user_uuid)) cnx.commit() @@ -895,7 +895,7 @@ class Unlock: raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_Id') failed_login_count = row[0] - if failed_login_count < 3: + if failed_login_count < config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_IS_NOT_LOCKED') From 33e6c24e286cc6f47d2ef632a4412419f744c7c2 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 16 Dec 2021 22:24:04 +0800 Subject: [PATCH 061/117] added unlock user into api and admin --- myems-api/MyEMS.postman_collection.json | 481 +++++++++++++++++++++--- myems-api/README.md | 8 +- myems-api/config.py | 2 +- 3 files changed, 439 insertions(+), 52 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index c2514164..9700132c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -4577,7 +4577,19 @@ "name": "POST Create New Offline Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"OfflinePM21\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"空调用电\"}}" @@ -4598,19 +4610,31 @@ "name": "PUT Update a Offline Meter", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"OfflinePM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"空调用电\"}}" }, "url": { - "raw": "{{base_url}}/offlinemeters/6", + "raw": "{{base_url}}/offlinemeters/3", "host": [ "{{base_url}}" ], "path": [ "offlinemeters", - "6" + "3" ] } }, @@ -4620,15 +4644,27 @@ "name": "DELETE Offline Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { - "raw": "{{base_url}}/offlinemeters/2", + "raw": "{{base_url}}/offlinemeters/3", "host": [ "{{base_url}}" ], "path": [ "offlinemeters", - "2" + "3" ] } }, @@ -5161,7 +5197,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -5193,7 +5230,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -5226,7 +5264,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -6157,7 +6196,19 @@ "name": "POST Create New Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMSSpace\", \"parent_space_id\":1, \"area\":999.99, \"timezone_id\":56, \"is_input_counted\":true, \"is_output_counted\":false, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"Space description\"}}" @@ -6178,7 +6229,19 @@ "name": "PUT Update a Space", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMSSpace\", \"parent_space_id\":2, \"area\":999.99, \"timezone_id\":56, \"is_input_counted\":true, \"is_output_counted\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"Space description\"}}" @@ -6200,7 +6263,19 @@ "name": "DELETE a Space by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/57", "host": [ @@ -6256,7 +6331,19 @@ "name": "POST Bind a Combined Equipment to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"combined_equipment_id\":1}}" @@ -6279,7 +6366,19 @@ "name": "DELETE a Combined Equipment from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/combinedequipments/1", "host": [ @@ -6318,7 +6417,19 @@ "name": "POST Bind an Equipment to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"equipment_id\":1}}" @@ -6341,7 +6452,19 @@ "name": "DELETE an Equipment from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/equipments/1", "host": [ @@ -6380,7 +6503,18 @@ "name": "POST Bind a Meter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"meter_id\":1}}" @@ -6400,10 +6534,22 @@ "response": [] }, { - "name": "DELETE a Meter from Space", + "name": "DELETE Unbind a Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/meters/1", "host": [ @@ -6442,7 +6588,19 @@ "name": "POST Bind an OfflineMeter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"offline_meter_id\":1}}" @@ -6462,10 +6620,22 @@ "response": [] }, { - "name": "DELETE an Offline Meter from Space", + "name": "DELETE Unbind an Offline Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/offlinemeters/1", "host": [ @@ -6504,7 +6674,19 @@ "name": "POST Bind a Point to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"point_id\":1}}" @@ -6524,10 +6706,22 @@ "response": [] }, { - "name": "DELETE a Point from Space", + "name": "DELETE Unbind a Point from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/points/3", "host": [ @@ -6566,7 +6760,19 @@ "name": "POST Bind a Sensor to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"sensor_id\":1}}" @@ -6586,10 +6792,22 @@ "response": [] }, { - "name": "DELETE a Sensor from Space", + "name": "DELETE Unbind a Sensor from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/sensors/1", "host": [ @@ -6628,7 +6846,19 @@ "name": "POST Bind a Shopfloor to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"shopfloor_id\":1}}" @@ -6648,10 +6878,22 @@ "response": [] }, { - "name": "DELETE a Shopfloor from a Space", + "name": "DELETE Unbind a Shopfloor from a Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/shopfloors/1", "host": [ @@ -6690,7 +6932,19 @@ "name": "POST Bind a Store to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"store_id\":1}}" @@ -6710,10 +6964,22 @@ "response": [] }, { - "name": "DELETE a Store from Space", + "name": "DELETE Unbind a Store from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/stores/1", "host": [ @@ -6752,7 +7018,19 @@ "name": "POST Bind a Tenant to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"tenant_id\":1}}" @@ -6772,10 +7050,22 @@ "response": [] }, { - "name": "DELETE a Tenant from Space", + "name": "DELETE Unbind a Tenant from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/tenants/1", "host": [ @@ -6814,7 +7104,19 @@ "name": "POST Bind a Virtual Meter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"virtual_meter_id\":1}}" @@ -6834,10 +7136,22 @@ "response": [] }, { - "name": "DELETE a Virtual Meter from Space", + "name": "DELETE Unbind a Virtual Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/virtualmeters/1", "host": [ @@ -6861,11 +7175,12 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any User's UUID" }, { "key": "Token", - "value": "e1879592cb12e4cbf0e1762ed42edde699499cd9", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", "type": "text" } ], @@ -8721,7 +9036,7 @@ }, { "key": "Token", - "value": "50bc979c9181699bc33927aa04a453fd83e2b8e8280544bfc3807fdedf2645201676fe474787e0ea3024502659a2ab4b1905c6ca4f444ffdba764a603c4eb691", + "value": "6c32302cb46cae4236fe9d04ccb21f950bce593267f33dc169e700bb98ea5c3446521251a1b4078ebcbe51b4ca4ba59ac01b395e0f69ef42fa0bc36d6bd5683c", "description": "Login to get a valid token", "type": "text" } @@ -9030,6 +9345,38 @@ } }, "response": [] + }, + { + "name": "PUT Unlock User", + "request": { + "method": "PUT", + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "6c32302cb46cae4236fe9d04ccb21f950bce593267f33dc169e700bb98ea5c3446521251a1b4078ebcbe51b4ca4ba59ac01b395e0f69ef42fa0bc36d6bd5683c", + "type": "text", + "description": "Login to get a valid token" + } + ], + "url": { + "raw": "{{base_url}}/users/unlock/2", + "host": [ + "{{base_url}}" + ], + "path": [ + "users", + "unlock", + "2" + ] + } + }, + "response": [] } ] }, @@ -9075,10 +9422,22 @@ "name": "POST Create New Virtual Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"VM10\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":3},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":4},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":5}] } }}" + "raw": "{\"data\":{\"name\":\"VM10\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":1},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":2},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":3}] } }}" }, "url": { "raw": "{{base_url}}/virtualmeters", @@ -9096,10 +9455,22 @@ "name": "PUT Update a Virtual Meter by ID", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"VM51\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1-x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":3},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":4},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":5}] } }}" + "raw": "{\"data\":{\"name\":\"VM11\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":1},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":2},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":3}] } }}" }, "url": { "raw": "{{base_url}}/virtualmeters/3", @@ -9118,7 +9489,19 @@ "name": "DELETE a Virtual Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/virtualmeters/3", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 71fdd398..b7688aa0 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1981,11 +1981,11 @@ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKE ### User * GET All Users ```bash -curl -i -X GET {{base_url}}/users +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/users ``` * GET a User by ID ```bash -curl -i -X GET {{base_url}}/users/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/users/{id} ``` * DELETE User by id ```bash @@ -2019,6 +2019,10 @@ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKE ```bash curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` +* PUT User Unlock +```bash +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT {{base_url}}/users/unlock/{id} +``` ### Virtual Meter * GET a Virtual Meter by ID diff --git a/myems-api/config.py b/myems-api/config.py index 3a9bb99b..30a590f2 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -94,4 +94,4 @@ upload_path = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') currency_unit = config('CURRENCY_UNIT', default='CNY') # maximum failed login count, otherwise the user should be locked -maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=6, cast=int) +maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=3, cast=int) From 273ab4cdab5ece0146e5d80561316cfa8ea105db Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Fri, 17 Dec 2021 09:45:10 +0800 Subject: [PATCH 062/117] avoid merge conflict --- myems-api/config.py | 163 ++++++++++++++--------------------------- myems-api/core/user.py | 23 ++++-- 2 files changed, 69 insertions(+), 117 deletions(-) diff --git a/myems-api/config.py b/myems-api/config.py index 29b019ae..c9ad8e57 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -1,154 +1,97 @@ from decouple import config -MYEMS_SYSTEM_DB_HOST = config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1') -MYEMS_SYSTEM_DB_PORT = config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int) -MYEMS_SYSTEM_DB_DATABASE = config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db') -MYEMS_SYSTEM_DB_USER = config('MYEMS_SYSTEM_DB_USER', default='root') -MYEMS_SYSTEM_DB_PASSWORD = config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_DB_HOST = config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_DB_PORT = config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_DB_DATABASE = config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db') -MYEMS_ENERGY_DB_USER = config('MYEMS_ENERGY_DB_USER', default='root') -MYEMS_ENERGY_DB_PASSWORD = config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_BASELINE_DB_HOST = config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_BASELINE_DB_PORT = config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_BASELINE_DB_DATABASE = config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db') -MYEMS_ENERGY_BASELINE_DB_USER = config('MYEMS_ENERGY_BASELINE_DB_USER', default='root') -MYEMS_ENERGY_BASELINE_DB_PASSWORD = config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_DB_HOST = config('MYEMS_BILLING_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_DB_PORT = config('MYEMS_BILLING_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_DB_DATABASE = config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db') -MYEMS_BILLING_DB_USER = config('MYEMS_BILLING_DB_USER', default='root') -MYEMS_BILLING_DB_PASSWORD = config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_BASELINE_DB_HOST = config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_BASELINE_DB_PORT = config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_BASELINE_DB_DATABASE = config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db') -MYEMS_BILLING_BASELINE_DB_USER = config('MYEMS_BILLING_BASELINE_DB_USER', default='root') -MYEMS_BILLING_BASELINE_DB_PASSWORD = config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_HISTORICAL_DB_HOST = config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1') -MYEMS_HISTORICAL_DB_PORT = config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int) -MYEMS_HISTORICAL_DB_DATABASE = config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db') -MYEMS_HISTORICAL_DB_USER = config('MYEMS_HISTORICAL_DB_USER', default='root') -MYEMS_HISTORICAL_DB_PASSWORD = config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1') - -MYEMS_USER_DB_HOST = config('MYEMS_USER_DB_HOST', default='127.0.0.1') -MYEMS_USER_DB_PORT = config('MYEMS_USER_DB_PORT', default=3306, cast=int) -MYEMS_USER_DB_DATABASE = config('MYEMS_USER_DB_DATABASE', default='myems_user_db') -MYEMS_USER_DB_USER = config('MYEMS_USER_DB_USER', default='root') -MYEMS_USER_DB_PASSWORD = config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1') - -MYEMS_FDD_DB_HOST = config('MYEMS_FDD_DB_HOST', default='127.0.0.1') -MYEMS_FDD_DB_PORT = config('MYEMS_FDD_DB_PORT', default=3306, cast=int) -MYEMS_FDD_DB_DATABASE = config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db') -MYEMS_FDD_DB_USER = config('MYEMS_FDD_DB_USER', default='root') -MYEMS_FDD_DB_PASSWORD = config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1') - -MYEMS_REPORTING_DB_HOST = config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1') -MYEMS_REPORTING_DB_PORT = config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int) -MYEMS_REPORTING_DB_DATABASE = config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db') -MYEMS_REPORTING_DB_USER = config('MYEMS_REPORTING_DB_USER', default='root') -MYEMS_REPORTING_DB_PASSWORD = config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1') - -MINUTES_TO_COUNT = config('MINUTES_TO_COUNT', default=60, cast=int) -UTC_OFFSET = config('UTC_OFFSET', default='+08:00') -WORKING_DAY_START_TIME_LOCAL = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') -UPLOAD_PATH = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') -CURRENCY_UNIT = config('CURRENCY_UNIT', default='CNY') - myems_system_db = { - 'host': MYEMS_SYSTEM_DB_HOST, - 'port': MYEMS_SYSTEM_DB_PORT, - 'database': MYEMS_SYSTEM_DB_DATABASE, - 'user': MYEMS_SYSTEM_DB_USER, - 'password': MYEMS_SYSTEM_DB_PASSWORD, + 'host': config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db'), + 'user': config('MYEMS_SYSTEM_DB_USER', default='root'), + 'password': config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1'), } myems_energy_db = { - 'host': MYEMS_ENERGY_DB_HOST, - 'port': MYEMS_ENERGY_DB_PORT, - 'database': MYEMS_ENERGY_DB_DATABASE, - 'user': MYEMS_ENERGY_DB_USER, - 'password': MYEMS_ENERGY_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db'), + 'user': config('MYEMS_ENERGY_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1'), } myems_energy_baseline_db = { - 'host': MYEMS_ENERGY_BASELINE_DB_HOST, - 'port': MYEMS_ENERGY_BASELINE_DB_PORT, - 'database': MYEMS_ENERGY_BASELINE_DB_DATABASE, - 'user': MYEMS_ENERGY_BASELINE_DB_USER, - 'password': MYEMS_ENERGY_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db'), + 'user': config('MYEMS_ENERGY_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_billing_db = { - 'host': MYEMS_BILLING_DB_HOST, - 'port': MYEMS_BILLING_DB_PORT, - 'database': MYEMS_BILLING_DB_DATABASE, - 'user': MYEMS_BILLING_DB_USER, - 'password': MYEMS_BILLING_DB_PASSWORD, + 'host': config('MYEMS_BILLING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db'), + 'user': config('MYEMS_BILLING_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1'), } myems_billing_baseline_db = { - 'host': MYEMS_BILLING_BASELINE_DB_HOST, - 'port': MYEMS_BILLING_BASELINE_DB_PORT, - 'database': MYEMS_BILLING_BASELINE_DB_DATABASE, - 'user': MYEMS_BILLING_BASELINE_DB_USER, - 'password': MYEMS_BILLING_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db'), + 'user': config('MYEMS_BILLING_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_historical_db = { - 'host': MYEMS_HISTORICAL_DB_HOST, - 'port': MYEMS_HISTORICAL_DB_PORT, - 'database': MYEMS_HISTORICAL_DB_DATABASE, - 'user': MYEMS_HISTORICAL_DB_USER, - 'password': MYEMS_HISTORICAL_DB_PASSWORD, + 'host': config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db'), + 'user': config('MYEMS_HISTORICAL_DB_USER', default='root'), + 'password': config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1'), } myems_user_db = { - 'host': MYEMS_USER_DB_HOST, - 'port': MYEMS_USER_DB_PORT, - 'database': MYEMS_USER_DB_DATABASE, - 'user': MYEMS_USER_DB_USER, - 'password': MYEMS_USER_DB_PASSWORD, + 'host': config('MYEMS_USER_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_USER_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_USER_DB_DATABASE', default='myems_user_db'), + 'user': config('MYEMS_USER_DB_USER', default='root'), + 'password': config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1'), } myems_fdd_db = { - 'host': MYEMS_FDD_DB_HOST, - 'port': MYEMS_FDD_DB_PORT, - 'database': MYEMS_FDD_DB_DATABASE, - 'user': MYEMS_FDD_DB_USER, - 'password': MYEMS_FDD_DB_PASSWORD, + 'host': config('MYEMS_FDD_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_FDD_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db'), + 'user': config('MYEMS_FDD_DB_USER', default='root'), + 'password': config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1'), } myems_reporting_db = { - 'host': MYEMS_REPORTING_DB_HOST, - 'port': MYEMS_REPORTING_DB_PORT, - 'database': MYEMS_REPORTING_DB_DATABASE, - 'user': MYEMS_REPORTING_DB_USER, - 'password': MYEMS_REPORTING_DB_PASSWORD, + 'host': config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db'), + 'user': config('MYEMS_REPORTING_DB_USER', default='root'), + 'password': config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1'), } # indicated in how many minutes to calculate meter energy consumption # 30 for half hourly period # 60 for hourly period -minutes_to_count = MINUTES_TO_COUNT +minutes_to_count = config('MINUTES_TO_COUNT', default=60, cast=int) # indicates the project's time zone offset from UTC -utc_offset = UTC_OFFSET +utc_offset = config('UTC_OFFSET', default='+08:00') # indicates from when ( in local timezone) of the day to calculate working days -working_day_start_time_local = WORKING_DAY_START_TIME_LOCAL +working_day_start_time_local = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') # indicates where user uploaded files will be saved to # must use the root folder of myems-admin web application # for example if you serve myems-admin at /var/www/html/admin # you should set the upload_path as below -upload_path = UPLOAD_PATH +upload_path = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') # main currency unit -currency_unit = CURRENCY_UNIT +currency_unit = config('CURRENCY_UNIT', default='CNY') + +# maximum failed login count, otherwise the user should be locked +maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=3, cast=int) \ No newline at end of file diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 69df28de..6444a3ad 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -27,7 +27,7 @@ class UserCollection: cursor = cnx.cursor() query = (" SELECT u.id, u.name, u.display_name, u.uuid, " " u.email, u.is_admin, p.id, p.name, " - " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc " + " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc, u.failed_login_count " " FROM tbl_users u " " LEFT JOIN tbl_privileges p ON u.privilege_id = p.id " " ORDER BY u.name ") @@ -59,7 +59,8 @@ class UserCollection: "account_expiration_datetime": account_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "password_expiration_datetime": - password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S')} + password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), + "failed_login_count": row[10]} result.append(meta_result) resp.text = json.dumps(result) @@ -503,7 +504,7 @@ class UserLogin: failed_login_count = result['failed_login_count'] - if failed_login_count >= 3: + if failed_login_count >= config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_HAS_BEEN_LOCKED') @@ -514,8 +515,8 @@ class UserLogin: if hashed_password != result['password']: update_failed_login_count = (" UPDATE tbl_users " - " SET failed_login_count = %s " - " WHERE uuid = %s ") + " SET failed_login_count = %s " + " WHERE uuid = %s ") user_uuid = result['uuid'] cursor.execute(update_failed_login_count, (failed_login_count + 1, user_uuid)) cnx.commit() @@ -523,6 +524,14 @@ class UserLogin: cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_PASSWORD') + if failed_login_count != 0: + update_failed_login_count = (" UPDATE tbl_users " + " SET failed_login_count = 0 " + " WHERE uuid = %s ") + user_uuid = result['uuid'] + cursor.execute(update_failed_login_count, (user_uuid, )) + cnx.commit() + if result['account_expiration_datetime_utc'] <= datetime.utcnow(): cursor.close() cnx.disconnect() @@ -886,7 +895,7 @@ class Unlock: raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_Id') failed_login_count = row[0] - if failed_login_count < 3: + if failed_login_count < config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_IS_NOT_LOCKED') @@ -912,4 +921,4 @@ class Unlock: resp.text = json.dumps("OK") resp.status = falcon.HTTP_200 write_log(user_uuid=admin_user_uuid, request_method='PUT', resource_type='UnlockUser', - resource_id=Id, request_body=None) + resource_id=Id, request_body=None) \ No newline at end of file From 1b1afa7de1c6ff45aea35e9815e81a14864fe63d Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Fri, 17 Dec 2021 10:19:06 +0800 Subject: [PATCH 063/117] The step of judging the number of 'failed login count' moves to myems-api --- admin/views/users/user/user.html | 2 +- myems-api/core/user.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/views/users/user/user.html b/admin/views/users/user/user.html index eae9dd2d..9d92622a 100644 --- a/admin/views/users/user/user.html +++ b/admin/views/users/user/user.html @@ -36,7 +36,7 @@ {{'SETTING.EDIT' | translate}} {{'USER.RESET_PASSWORD' | translate}} {{'SETTING.DELETE' | translate}} - {{'SETTING.UNLOCK' | translate}} + {{'SETTING.UNLOCK' | translate}} diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 6444a3ad..99116de0 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -60,7 +60,7 @@ class UserCollection: account_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "password_expiration_datetime": password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), - "failed_login_count": row[10]} + "failed_login_count": True if row[10] < 3 else False} result.append(meta_result) resp.text = json.dumps(result) From 01e894eaeafc51867a4d106ef339df5b09a0beaa Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 17 Dec 2021 20:51:48 +0800 Subject: [PATCH 064/117] changed codechina to gitcode in README --- README.md | 2 +- README_DE.md | 2 +- README_EN.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ebf33012..b9fbc2bc 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ MyEMS由资深专业团队开发维护,系统代码基于MIT开源软件许可 [4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems -[5]. [CODE CHINA](https://codechina.csdn.net/myems/myems) https://codechina.csdn.net/myems/myems +[5]. [GitCode](https://gitcode.net/myems/myems) https://gitcode.net/myems/myems ## MyEMS安装(社区版) diff --git a/README_DE.md b/README_DE.md index a3b129ca..39d21f53 100644 --- a/README_DE.md +++ b/README_DE.md @@ -139,7 +139,7 @@ Sehen [Funktionen der MyEMS Enterprise Edition](./enterprise-edition-de.md) [4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems -[5]. [CODE CHINA](https://codechina.csdn.net/myems/myems) https://codechina.csdn.net/myems/myems +[5]. [GitCode](https://gitcode.net/myems/myems) https://gitcode.net/myems/myems ## MyEMS Installation (Community Edition) diff --git a/README_EN.md b/README_EN.md index 720a3c0c..7003d671 100644 --- a/README_EN.md +++ b/README_EN.md @@ -142,7 +142,7 @@ See [Features of MyEMS Enterprise Edition](./enterprise-edition-en.md) [4]. [Gitlab](https://gitlab.com/myems/myems) https://gitlab.com/myems/myems -[5]. [CODE CHINA](https://codechina.csdn.net/myems/myems) https://codechina.csdn.net/myems/myems +[5]. [GitCode](https://gitcode.net/myems/myems) https://gitcode.net/myems/myems ## MyEMS Installation (Community Edition) From 6e4fd346519fc69beb9597824990286da31f8af1 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 17 Dec 2021 22:34:24 +0800 Subject: [PATCH 065/117] updated date-range-picker of emailmessage view in admin --- admin/views/fdd/emailmessage.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/views/fdd/emailmessage.html b/admin/views/fdd/emailmessage.html index d1ce6262..a052bfb0 100644 --- a/admin/views/fdd/emailmessage.html +++ b/admin/views/fdd/emailmessage.html @@ -4,8 +4,8 @@
-