From c6e992a3e2580f8adef183d2bd45c4028a29b088 Mon Sep 17 00:00:00 2001 From: Rripped <75929322+Rripped@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:36:14 +0100 Subject: [PATCH 01/91] Create README.md --- telegram_bot/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 telegram_bot/README.md diff --git a/telegram_bot/README.md b/telegram_bot/README.md new file mode 100644 index 0000000..abda9e2 --- /dev/null +++ b/telegram_bot/README.md @@ -0,0 +1,6 @@ +## Local setup for telegram bot +0. optional: build virtual env by ``python -m venv venv`` + ``env/Scripts/activate`` +2. create .env and set API keys etc. (use .env.example as a layout) +3. install required libs via ``pip install -r ./telegram_bot/requirements.txt`` +4. run bot.py via ``python ./telegram_bot/bot.py`` -- 2.45.2 From dc7415738e988c48f2ef9acbb9184869fab051f1 Mon Sep 17 00:00:00 2001 From: Rripped <75929322+Rripped@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:36:33 +0100 Subject: [PATCH 02/91] Update README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 96a70d7..1dbcb5d 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,3 @@ WebEngineering2 Projekt: Aktien und News Bot für Telegram ## Dokumentation - Postman-API -> docs/postman.json - Datenbank -> database/* - -## Local setup for telegram bot -0. optional: build virtual env by ``python -m venv venv`` - ``env/Scripts/activate`` -2. create .env and set API keys etc. (use .env.example as a layout) -3. install required libs via ``pip install -r ./telegram_bot/requirements.txt`` -4. run bot.py via ``python ./telegram_bot/bot.py`` -- 2.45.2 From 23e46635b31a92d123d7b99b5987ea7d12af600e Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 17:36:54 +0100 Subject: [PATCH 03/91] Updated docs path #2 --- api/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/config.py b/api/config.py index e7f323c..3e68c44 100644 --- a/api/config.py +++ b/api/config.py @@ -24,6 +24,7 @@ class ConfigClass(object): # openapi/Swagger config SPEC_FORMAT = 'yaml' + LOCAL_SPEC_PATH = 'docs/openapi.json' SERVERS = [ { "name": "Production", -- 2.45.2 From c13a980474049c9fa91d3dd18d3c0f8d6fc100ac Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 17:51:40 +0100 Subject: [PATCH 04/91] Updated docs --- api/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/api/config.py b/api/config.py index 3e68c44..0bff4a9 100644 --- a/api/config.py +++ b/api/config.py @@ -23,7 +23,6 @@ class ConfigClass(object): SQLALCHEMY_TRACK_MODIFICATIONS = False # Avoids SQLAlchemy warning # openapi/Swagger config - SPEC_FORMAT = 'yaml' LOCAL_SPEC_PATH = 'docs/openapi.json' SERVERS = [ { -- 2.45.2 From ef25a702dd88985f75c1c6aa9da6eba46d90e927 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 17:54:32 +0100 Subject: [PATCH 05/91] Try to fix cors --- api/app.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/app.py b/api/app.py index 88049f6..1c6d2e2 100644 --- a/api/app.py +++ b/api/app.py @@ -18,7 +18,11 @@ def create_app(): application = APIFlask(__name__, docs_path='/api/docs') application.config.from_object("config.ConfigClass") - CORS(application) + CORS(application, resource={ + r"/*": { + "origins": "*" + } + }) application.app_context().push() -- 2.45.2 From 54780c835953e99bc9efc83a00f9dfa1196e5086 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 18:43:06 +0100 Subject: [PATCH 06/91] Fixed login url --- frontend/src/app/Services/auth.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/Services/auth.service.ts b/frontend/src/app/Services/auth.service.ts index db051dc..ad8a3ee 100644 --- a/frontend/src/app/Services/auth.service.ts +++ b/frontend/src/app/Services/auth.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; -const AUTH_API = 'https://aktienbot.flokaiser.com/api/user'; +const AUTH_API = 'https://aktienbot.flokaiser.com/api/user/'; const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; -- 2.45.2 From 0f32c85c7cf9f2aef9dff75dbdf48f21586c0f1c Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 19:02:00 +0100 Subject: [PATCH 07/91] Try to fix docs --- api/app.py | 2 +- api/config.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/api/app.py b/api/app.py index 1c6d2e2..1fd2c9f 100644 --- a/api/app.py +++ b/api/app.py @@ -15,7 +15,7 @@ def create_app(): load_dotenv() # Create Flask app load app.config - application = APIFlask(__name__, docs_path='/api/docs') + application = APIFlask(__name__, openapi_blueprint_url_prefix='api/') application.config.from_object("config.ConfigClass") CORS(application, resource={ diff --git a/api/config.py b/api/config.py index 0bff4a9..923f3b8 100644 --- a/api/config.py +++ b/api/config.py @@ -23,7 +23,6 @@ class ConfigClass(object): SQLALCHEMY_TRACK_MODIFICATIONS = False # Avoids SQLAlchemy warning # openapi/Swagger config - LOCAL_SPEC_PATH = 'docs/openapi.json' SERVERS = [ { "name": "Production", -- 2.45.2 From b0e3650757b9fc0494011bc43a86d2a7b27a0661 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 19:09:14 +0100 Subject: [PATCH 08/91] Try to fix docs --- api/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/app.py b/api/app.py index 1fd2c9f..9a26db5 100644 --- a/api/app.py +++ b/api/app.py @@ -15,7 +15,7 @@ def create_app(): load_dotenv() # Create Flask app load app.config - application = APIFlask(__name__, openapi_blueprint_url_prefix='api/') + application = APIFlask(__name__, openapi_blueprint_url_prefix='/api') application.config.from_object("config.ConfigClass") CORS(application, resource={ -- 2.45.2 From 3bf24f493842443ef89159fb90e99384cfd3005b Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 19:33:38 +0100 Subject: [PATCH 09/91] Fix angular 404 --- frontend/Dockerfile | 1 + frontend/deploy/nginx.conf | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 frontend/deploy/nginx.conf diff --git a/frontend/Dockerfile b/frontend/Dockerfile index f298e1e..15ab872 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -13,6 +13,7 @@ RUN ls /usr/local/app/dist FROM nginx:latest COPY --from=build /usr/local/app/dist/aktienbot /usr/share/nginx/html +COPY frontend/deploy/nginx.conf /etc/nginx HEALTHCHECK --interval=15s --timeout=2s CMD ["./deploy/healthcheck.sh"] diff --git a/frontend/deploy/nginx.conf b/frontend/deploy/nginx.conf new file mode 100644 index 0000000..d8a200f --- /dev/null +++ b/frontend/deploy/nginx.conf @@ -0,0 +1,35 @@ +events { + worker_connections 1024; ## Default: 1024 +} + +http { + ## use mime types + include /etc/nginx/mime.types; + server { + listen 80; + + location / { + root /usr/share/nginx/html; + index index.html; + ## without this our .css are not loaded + try_files $uri $uri/ /index.html?$query_string; + } + } + + ## enable gzip compression + gzip on; + gzip_vary on; + gzip_min_length 256; + gzip_proxied any; + + gzip_types + ## text/html is always compressed : https://nginx.org/en/docs/http/ngx_http_gzip_module.html + text/plain + text/css + text/javascript + application/javascript + application/x-javascript + application/xml + application/json + application/ld+json; +} -- 2.45.2 From 9ea9c2175f38684ba25d2aaec6bf49ed642b41c5 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 19:44:47 +0100 Subject: [PATCH 10/91] Fixed healthcheck --- frontend/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 15ab872..7b8dde9 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -14,6 +14,7 @@ FROM nginx:latest COPY --from=build /usr/local/app/dist/aktienbot /usr/share/nginx/html COPY frontend/deploy/nginx.conf /etc/nginx +COPY frontend/deploy deploy/ HEALTHCHECK --interval=15s --timeout=2s CMD ["./deploy/healthcheck.sh"] -- 2.45.2 From 97d166d0b14e57684a56a5e8354dbf8c962cabeb Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 19:57:36 +0100 Subject: [PATCH 11/91] Fixed healthcheck --- frontend/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 7b8dde9..637f6aa 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -13,9 +13,12 @@ RUN ls /usr/local/app/dist FROM nginx:latest COPY --from=build /usr/local/app/dist/aktienbot /usr/share/nginx/html + COPY frontend/deploy/nginx.conf /etc/nginx COPY frontend/deploy deploy/ +RUN chmod +x ./deploy/healthcheck.sh + HEALTHCHECK --interval=15s --timeout=2s CMD ["./deploy/healthcheck.sh"] EXPOSE 80 -- 2.45.2 From 1f802703bd82402934e5d200d2face5d60292f82 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 22:58:17 +0100 Subject: [PATCH 12/91] Added openapi documentation, updated postman docs --- documentation/api/openapi.json | 1 + documentation/api/postman.json | 2483 ++++++++++++++++++++++++++++---- 2 files changed, 2198 insertions(+), 286 deletions(-) create mode 100644 documentation/api/openapi.json diff --git a/documentation/api/openapi.json b/documentation/api/openapi.json new file mode 100644 index 0000000..7c9d313 --- /dev/null +++ b/documentation/api/openapi.json @@ -0,0 +1 @@ +{"components":{"schemas":{"AdminData":{"properties":{"admin":{"type":"boolean"},"username":{"type":"string"}},"type":"object"},"DeleteSuccessful":{"properties":{},"type":"object"},"DeleteUser":{"properties":{"username":{"type":"string"}},"type":"object"},"HTTPError":{"properties":{"detail":{"type":"object"},"message":{"type":"string"}},"type":"object"},"Keyword":{"properties":{"keyword":{"type":"string"}},"type":"object"},"KeywordResponse":{"properties":{"keyword":{"type":"string"},"s_id":{"type":"integer"},"user_id":{"type":"integer"}},"type":"object"},"LoginData":{"properties":{"password":{"type":"string"},"username":{"type":"string"}},"type":"object"},"Symbol":{"properties":{"symbol":{"type":"string"}},"type":"object"},"SymbolResponse":{"properties":{"s_id":{"type":"integer"},"symbol":{"type":"string"},"user_id":{"type":"integer"}},"type":"object"},"Token":{"properties":{"token":{"type":"string"}},"type":"object"},"Transaction":{"properties":{"count":{"type":"integer"},"price":{"type":"number"},"symbol":{"type":"string"},"time":{"type":"string"},"user_id":{"type":"integer"}},"type":"object"},"Users":{"properties":{"admin":{"type":"boolean"},"password":{"type":"string"},"telegram_name":{"type":"string"},"user_id":{"type":"integer"},"username":{"type":"string"}},"type":"object"},"ValidationError":{"properties":{"detail":{"properties":{"":{"properties":{"":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"message":{"type":"string"}},"type":"object"}},"securitySchemes":{"BearerAuth":{"scheme":"Bearer","type":"http"}}},"info":{"description":"Webengineering 2 | Telegram Aktienbot","title":"APIFlask","version":"0.0.1"},"openapi":"3.0.3","paths":{"/api/keyword":{"delete":{"description":"Removes existing keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing keyword","tags":["Keyword"]},"post":{"description":"Adds new keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new keyword","tags":["Keyword"]}},"/api/keywords":{"get":{"description":"Returns all keywords for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all keywords","tags":["Keyword"]}},"/api/portfolio":{"get":{"description":"Returns all shares of current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/200"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns portfolio","tags":["Portfolio"]}},"/api/share":{"delete":{"description":"Removes existing symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing symbol","tags":["Share"]},"post":{"description":"Adds new symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new symbol","tags":["Share"]}},"/api/shares":{"get":{"description":"Returns all symbols for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all symbols","tags":["Share"]}},"/api/transaction":{"post":{"description":"Adds new transaction for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/()"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Adds new transaction","tags":["Transaction"]}},"/api/transactions":{"get":{"description":"Returns all transactions for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Transaction"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all transactions","tags":["Transaction"]}},"/api/user":{"delete":{"description":"Deletes user by username","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteUser"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Delete user","tags":["Users"]},"get":{"description":"Returns current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get current user","tags":["Users"]},"put":{"description":"Changes password and/or username of current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Update user","tags":["Users"]}},"/api/user/login":{"post":{"description":"Returns jwt token if username and password match, otherwise returns error","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Token"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Login","tags":["Users"]}},"/api/user/register":{"post":{"description":"Registers user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Register","tags":["Users"]}},"/api/user/setAdmin":{"put":{"description":"Set admin state of specified user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Set user admin state","tags":["Users"]}},"/api/users":{"get":{"description":"Returns all existing users as array","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Users"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get all users","tags":["Users"]}}},"servers":[{"name":"Production","url":"https://aktienbot.flokaiser.com"},{"name":"Local","url":"http://127.0.0.1:5000"}],"tags":[{"name":"Keyword"},{"name":"Share"},{"name":"Transaction"},{"name":"Portfolio"},{"name":"Users"}]} diff --git a/documentation/api/postman.json b/documentation/api/postman.json index f8260ec..e6fee89 100644 --- a/documentation/api/postman.json +++ b/documentation/api/postman.json @@ -1,21 +1,218 @@ { "info": { - "_postman_id": "67da7d20-d7df-4ad3-9289-a6e40b6cd2ec", - "name": "AktienBot", + "_postman_id": "b478b800-af91-45a7-8713-b199bcc41866", + "name": "APIFlask", + "description": "Webengineering 2 | Telegram Aktienbot", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { - "name": "User", + "name": "Keyword", "item": [ { - "name": "/api/register", + "name": "Removes existing keyword", "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + }, + "description": "Removes existing keyword for current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {},\n \"status\": 261201,\n \"text\": \"aliqua amet consectetur elit\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Add new keyword", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, "method": "POST", - "header": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], "body": { "mode": "raw", - "raw": "{\n \"username\": \"Username\",\n \"password\": \"Password\"\n}", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", "options": { "raw": { "language": "json" @@ -23,104 +220,251 @@ } }, "url": { - "raw": "{{BASE_URL}}/api/register", + "raw": "{{baseUrl}}/api/keyword", "host": [ - "{{BASE_URL}}" + "{{baseUrl}}" ], "path": [ "api", - "register" + "keyword" ] - } - }, - "response": [] - }, - { - "name": "/api/login", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"username\": \"Username\",\n \"password\": \"Password\"\n}", - "options": { - "raw": { - "language": "json" - } - } }, - "url": { - "raw": "{{BASE_URL}}/api/login", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "login" - ] - } + "description": "Adds new keyword for current user" }, - "response": [] + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": [\n {\n \"keyword\": \"tempor dolor commodo ipsum non\",\n \"s_id\": -64068772,\n \"user_id\": 82510382\n },\n {\n \"keyword\": \"in aute ex\",\n \"s_id\": 60028598,\n \"user_id\": -36905324\n }\n ],\n \"status\": 63124172,\n \"text\": \"amet\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/keyword", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keyword" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] }, { - "name": "/api/logout", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, + "name": "Returns all keywords", "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"username\": \"Username\",\n \"password\": \"Password\"\n}", - "options": { - "raw": { - "language": "json" - } + "header": [ + { + "key": "Accept", + "value": "application/json" } - }, + ], "url": { - "raw": "{{BASE_URL}}/api/logout", + "raw": "{{baseUrl}}/api/keywords", "host": [ - "{{BASE_URL}}" + "{{baseUrl}}" ], "path": [ "api", - "logout" + "keywords" ] - } - }, - "response": [] - }, - { - "name": "/api/users", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"username\": \"Username\",\n \"password\": \"Password\"\n}", - "options": { - "raw": { - "language": "json" - } - } }, - "url": { - "raw": "{{BASE_URL}}/api/users", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "users" - ] - } + "description": "Returns all keywords for current user" }, - "response": [] + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/keywords", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keywords" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": [\n {\n \"keyword\": \"tempor dolor commodo ipsum non\",\n \"s_id\": -64068772,\n \"user_id\": 82510382\n },\n {\n \"keyword\": \"in aute ex\",\n \"s_id\": 60028598,\n \"user_id\": -36905324\n }\n ],\n \"status\": 63124172,\n \"text\": \"amet\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/keywords", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "keywords" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] } ] }, @@ -128,115 +472,494 @@ "name": "Share", "item": [ { - "name": "/api/shares", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, + "name": "Removes existing symbol", "request": { - "method": "GET", - "header": [], + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], "body": { "mode": "raw", - "raw": "" + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } }, "url": { - "raw": "{{BASE_URL}}/api/shares", + "raw": "{{baseUrl}}/api/share", "host": [ - "{{BASE_URL}}" + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + }, + "description": "Removes existing symbol for current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {},\n \"status\": 261201,\n \"text\": \"aliqua amet consectetur elit\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Add new symbol", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + }, + "description": "Adds new symbol for current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": [\n {\n \"s_id\": -53227093,\n \"symbol\": \"veniam ea amet irure\",\n \"user_id\": 7468241\n },\n {\n \"s_id\": -37877246,\n \"symbol\": \"ut tempor labore non\",\n \"user_id\": -72644124\n }\n ],\n \"status\": 87653200,\n \"text\": \"aliquip reprehenderit dolore\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/share", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "share" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Returns all symbols", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/api/shares", + "host": [ + "{{baseUrl}}" ], "path": [ "api", "shares" ] - } - }, - "response": [] - }, - { - "name": "/api/share", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"symbol\": \"DTEGY\"\n}", - "options": { - "raw": { - "language": "json" - } - } }, - "url": { - "raw": "{{BASE_URL}}/api/share", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "share" - ] - } + "description": "Returns all symbols for current user" }, - "response": [] - }, - { - "name": "/api/share", - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"symbol\": \"DTEGY\"\n}", - "options": { - "raw": { - "language": "json" + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/shares", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "shares" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" } - } - }, - "url": { - "raw": "{{BASE_URL}}/api/share", - "host": [ - "{{BASE_URL}}" ], - "path": [ - "api", - "share" - ] + "cookie": [], + "body": "{\n \"data\": [\n {\n \"s_id\": -53227093,\n \"symbol\": \"veniam ea amet irure\",\n \"user_id\": 7468241\n },\n {\n \"s_id\": -37877246,\n \"symbol\": \"ut tempor labore non\",\n \"user_id\": -72644124\n }\n ],\n \"status\": 87653200,\n \"text\": \"aliquip reprehenderit dolore\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/shares", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "shares" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" } - }, - "response": [] + ] } ] }, { - "name": "Keyword", + "name": "Transaction", "item": [ { - "name": "/api/keywords", + "name": "Adds new transaction", "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/api/keywords", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "keywords" + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } ] - } - }, - "response": [] - }, - { - "name": "/api/keyword", - "request": { + }, "method": "POST", - "header": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"Elon\"\n}", + "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", "options": { "raw": { "language": "json" @@ -244,94 +967,251 @@ } }, "url": { - "raw": "{{BASE_URL}}/api/keyword", + "raw": "{{baseUrl}}/api/transaction", "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "keyword" - ] - } - }, - "response": [] - }, - { - "name": "/api/keyword", - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"keyword\": \"Elon\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/api/keyword", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "keyword" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "Transactions", - "item": [ - { - "name": "/api/transactions", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/api/transactions", - "host": [ - "{{BASE_URL}}" - ], - "path": [ - "api", - "transactions" - ] - } - }, - "response": [] - }, - { - "name": "/api/transaction", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"symbol\": \"DTEGY\",\n \"time\": \"2021-03-14T18:08:44.625Z\",\n \"count\": 1,\n \"price\": 10.0\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/api/transaction", - "host": [ - "{{BASE_URL}}" + "{{baseUrl}}" ], "path": [ "api", "transaction" ] - } + }, + "description": "Adds new transaction for current user" }, - "response": [] + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/transaction", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transaction" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"value\": \"reference #/components/schemas/() not found in the OpenAPI spec\"\n },\n \"status\": 14310780,\n \"text\": \"in sint sit\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/transaction", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transaction" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/transaction", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transaction" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Returns all transactions", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/api/transactions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transactions" + ] + }, + "description": "Returns all transactions for current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/transactions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transactions" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"count\": -19053100,\n \"price\": 39909986.26075193,\n \"symbol\": \"sit nisi\",\n \"time\": \"pariatur eu proident\",\n \"user_id\": 54782742\n },\n \"status\": 87070947,\n \"text\": \"null\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/transactions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "transactions" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] } ] }, @@ -339,61 +1219,1092 @@ "name": "Portfolio", "item": [ { - "name": "/api/portfolio", + "name": "Returns portfolio", "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, "method": "GET", - "header": [], + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], "url": { - "raw": "{{BASE_URL}}/api/portfolio", + "raw": "{{baseUrl}}/api/portfolio", "host": [ - "{{BASE_URL}}" + "{{baseUrl}}" ], "path": [ "api", "portfolio" ] - } + }, + "description": "Returns all shares of current user" }, - "response": [] + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/portfolio", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "portfolio" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"value\": \"reference #/components/schemas/200 not found in the OpenAPI spec\"\n },\n \"status\": 14426134,\n \"text\": \"velit in ad dolore\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/portfolio", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "portfolio" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + } + ] + }, + { + "name": "Users", + "item": [ + { + "name": "Delete user", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + }, + "description": "Deletes user by username" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": "text", + "header": [ + { + "key": "Content-Type", + "value": "text/plain" + } + ], + "cookie": [], + "body": "" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"cupidatat mollit laborum aute\",\n \"aute in laboris dolor\"\n ]\n }\n },\n \"message\": \"in dolore exercitation eu elit\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "DELETE", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Get current user", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + }, + "description": "Returns current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"admin\": false,\n \"password\": \"voluptate magna esse\",\n \"telegram_name\": \"id\",\n \"user_id\": -55336867,\n \"username\": \"do exercitation\"\n },\n \"status\": -11469710,\n \"text\": \"aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Update user", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + }, + "description": "Changes password and/or username of current user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": "text", + "header": [ + { + "key": "Content-Type", + "value": "text/plain" + } + ], + "cookie": [], + "body": "" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Login", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/login", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "login" + ] + }, + "description": "Returns jwt token if username and password match, otherwise returns error" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/login", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "login" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"token\": \"minim\"\n },\n \"status\": 86563099,\n \"text\": \"non tempor quis ullamco est\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/login", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "login" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + } + ] + }, + { + "name": "Register", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/register", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "register" + ] + }, + "description": "Registers user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/register", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "register" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"admin\": false,\n \"password\": \"voluptate magna esse\",\n \"telegram_name\": \"id\",\n \"user_id\": -55336867,\n \"username\": \"do exercitation\"\n },\n \"status\": -11469710,\n \"text\": \"aute\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/register", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "register" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + } + ] + }, + { + "name": "Set user admin state", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/setAdmin", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "setAdmin" + ] + }, + "description": "Set admin state of specified user" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/setAdmin", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "setAdmin" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": "text", + "header": [ + { + "key": "Content-Type", + "value": "text/plain" + } + ], + "cookie": [], + "body": "" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/setAdmin", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "setAdmin" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "PUT", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/user/setAdmin", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "user", + "setAdmin" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] + }, + { + "name": "Get all users", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/api/users", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "users" + ] + }, + "description": "Returns all existing users as array" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/users", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "users" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": [\n {\n \"admin\": true,\n \"password\": \"incididunt id dolore\",\n \"telegram_name\": \"id sed\",\n \"user_id\": 15906508,\n \"username\": \"dolor consequat ullamco\"\n },\n {\n \"admin\": true,\n \"password\": \"voluptate non\",\n \"telegram_name\": \"dolor sunt fugiat exercitation\",\n \"user_id\": 95246024,\n \"username\": \"Duis qui culpa Ut labore\"\n }\n ],\n \"status\": 81180129,\n \"text\": \"in ullamco\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "GET", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "url": { + "raw": "{{baseUrl}}/api/users", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "users" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + } + ] } ] } ], - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IlVzZXJuYW1lIiwiZXhwIjoxNjQ3Mjk5MzIxfQ.5UoHi9Zu6p9szSVKK2_1Ln2uru4RVTGQl0MyHDB4sqg", - "type": "string" - } - ] - }, - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], "variable": [ { - "key": "BASE_URL", - "value": "https://aktienbot.flokaiser.com/", - "type": "default" + "key": "baseUrl", + "value": "https://aktienbot.flokaiser.com", + "type": "string" } ] } \ No newline at end of file -- 2.45.2 From 135206b3ad12f1748ff1fe58fe85b036eb598d15 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 23:18:36 +0100 Subject: [PATCH 13/91] Updated README.md --- documentation/README.md | 20 ++++++++++++++++++++ documentation/database/README.md | 1 - 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 documentation/README.md delete mode 100644 documentation/database/README.md diff --git a/documentation/README.md b/documentation/README.md new file mode 100644 index 0000000..bce18b4 --- /dev/null +++ b/documentation/README.md @@ -0,0 +1,20 @@ +# Dokumentation + +## API +- `api/openapi.json` + - OpenAPI-Dokumentation + - von APIFlask generiert + - kann in Postman importiert werden +- `api/postman.json` + - Postman Collection + +## Database +- `database/structure_database.pdf` + - Relationales Modell der Datenbank +- `database/structure_database.uxf` + - Relationales Modell der Datenbank + - Source Datei des Modells + +## Requirements +- `requirements/2022-03-15 Anforderungen an Projekt.pdf` + - Anforderungen an dieses Projekt \ No newline at end of file diff --git a/documentation/database/README.md b/documentation/database/README.md deleted file mode 100644 index 26568bd..0000000 --- a/documentation/database/README.md +++ /dev/null @@ -1 +0,0 @@ -This is the database folder -- 2.45.2 From d13ba5f5efce1881075b75d403def5c3ae8b2a58 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Thu, 17 Mar 2022 23:49:39 +0100 Subject: [PATCH 14/91] Updated README files, .gitignore and .env.example --- .gitignore | 1 - .env.example => api/.env.example | 4 ---- api/README.md | 41 ++++++++++++++++++++++++++++++++ telegram_bot/.env.example | 8 +++++++ telegram_bot/README.md | 39 +++++++++++++++++++++++++----- 5 files changed, 82 insertions(+), 11 deletions(-) rename .env.example => api/.env.example (68%) create mode 100644 api/README.md create mode 100644 telegram_bot/.env.example diff --git a/.gitignore b/.gitignore index fba0141..ac68c97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .idea/* .env -.env.example env Lib Include diff --git a/.env.example b/api/.env.example similarity index 68% rename from .env.example rename to api/.env.example index 921ca00..af67b58 100644 --- a/.env.example +++ b/api/.env.example @@ -5,9 +5,5 @@ MYSQL_DATABASE= MYSQL_USER= MYSQL_PASSWORD= -# Telegram bot api key -BOT_API_KEY="" -NEWS_API_KEY="" - # Flask secret key SECRET_KEY= diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..e771473 --- /dev/null +++ b/api/README.md @@ -0,0 +1,41 @@ +# API + +Aktienbot API + +## Development +1. Create virtual environment `python -m venv venv env/Scripts/activate` +2. Install requirements `pip install -r api/requirements.txt` +3. Set environment variables (see list below) + 1. Use `.env`-file in `api` directory like `.env.example` + 2. Or set variables using `export` or `set` commands. (Windows `set`, Linux `export`) +4. Run api `python api/app.py` + +## Environment variables +``` + # Flask secret key + SECRET_KEY= + + # MYSQL Connection + MYSQL_USER= + MYSQL_PASSWORD= + MYSQL_HOST= + MYSQL_PORT= + MYSQL_DATABASE= +``` + +## Docker +``` +docker run -d \ + --name aktienbot_api \ + --hostname aktienbot_api \ + --publish 80:80 \ + --env "SECRET_KEY=" \ + --env "MYSQL_USER=" \ + --env "MYSQL_PASSWORD=" \ + --env "MYSQL_HOST=" \ + --env "MYSQL_PORT=" \ + --env "MYSQL_DATABASE=" \ + --restart unless-stopped \ + registry.flokaiser.com/aktienbot/api:latest +``` +or load environment variables from file by using `--env-file ` \ No newline at end of file diff --git a/telegram_bot/.env.example b/telegram_bot/.env.example new file mode 100644 index 0000000..bcd6a02 --- /dev/null +++ b/telegram_bot/.env.example @@ -0,0 +1,8 @@ +# Telegram bot api key +BOT_API_KEY= + +# News api key +NEWS_API_KEY= + +# Flask secret key +SECRET_KEY= diff --git a/telegram_bot/README.md b/telegram_bot/README.md index abda9e2..05ac44d 100644 --- a/telegram_bot/README.md +++ b/telegram_bot/README.md @@ -1,6 +1,33 @@ -## Local setup for telegram bot -0. optional: build virtual env by ``python -m venv venv`` - ``env/Scripts/activate`` -2. create .env and set API keys etc. (use .env.example as a layout) -3. install required libs via ``pip install -r ./telegram_bot/requirements.txt`` -4. run bot.py via ``python ./telegram_bot/bot.py`` +# Telegram bot + +Aktienbot telegram bot + +## Development +1. Create virtual environment `python -m venv venv env/Scripts/activate` +2. Install requirements `pip install -r telegram_bot/requirements.txt` +3. Set environment variables (see list below) + 1. Use `.env`-file in `api` directory like `.env.example` + 2. Or set variables using `export` or `set` commands. (Windows `set`, Linux `export`) +4. Run api `python telegram_bot/bot.py` + +## Environment variables +``` + # Telegram bot api key + BOT_API_KEY= + + # News api key + NEWS_API_KEY= +``` + +## Docker +``` +docker run -d \ + --name aktienbot_bot \ + --hostname aktienbot_bot \ + --publish 80:80 \ + --env "BOT_API_KEY=" \ + --env "NEWS_API_KEY=" \ + --restart unless-stopped \ + registry.flokaiser.com/aktienbot/bot:latest +``` +or load environment variables from file by using `--env-file ` \ No newline at end of file -- 2.45.2 From 5dd17c7cf9b2f1efeeb18d1839fbde00291af8f3 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Fri, 18 Mar 2022 00:06:24 +0100 Subject: [PATCH 15/91] Updated README files, .gitignore and .env.example --- documentation/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/documentation/README.md b/documentation/README.md index bce18b4..b575c73 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -17,4 +17,12 @@ ## Requirements - `requirements/2022-03-15 Anforderungen an Projekt.pdf` - - Anforderungen an dieses Projekt \ No newline at end of file + - Anforderungen an dieses Projekt + +## Role-model +Function|Admin|No Admin| +|---|---|---| +|Delete user|yes|only current user| +|Update users|yes|only current user| +|Set admin state|yes|no| +|Show all users|yes|no| \ No newline at end of file -- 2.45.2 From 675dd242ec58891475bbd084035928cd1d939151 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 18 Mar 2022 00:13:09 +0100 Subject: [PATCH 16/91] Create dependabot.yml --- .github/dependabot.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..96a2e95 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,24 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + # API + - package-ecosystem: "pip" + directory: "/api" + schedule: + interval: "daily" + + # Bot + - package-ecosystem: "pip" + directory: "/telegram_bot" + schedule: + interval: "daily" + + # Frontend + - package-ecosystem: "npm" + directory: "/frontend" + schedule: + interval: "daily" -- 2.45.2 From cc7aceb2fc65ab5c61d6d1f089de79d441ef7537 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:13:30 +0000 Subject: [PATCH 17/91] Bump pyjwt from 2.0.0 to 2.3.0 in /api Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.0.0 to 2.3.0. - [Release notes](https://github.com/jpadilla/pyjwt/releases) - [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst) - [Commits](https://github.com/jpadilla/pyjwt/compare/2.0.0...2.3.0) --- updated-dependencies: - dependency-name: pyjwt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- api/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/requirements.txt b/api/requirements.txt index d37bc8e..91de9c7 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -5,7 +5,7 @@ uwsgi==2.0.20 Flask_SQLAlchemy==2.5.1 python-dotenv==0.19.2 pymysql==1.0.2 -pyjwt==2.0.0 +pyjwt==2.3.0 apiflask==0.12.0 flask-swagger-ui==3.36.0 flask-cors==3.0.10 -- 2.45.2 From ffe58e13b98247e9f5ca9a74a376690335f705ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:14:16 +0000 Subject: [PATCH 18/91] Bump @angular/material from 13.2.6 to 13.3.0 in /frontend Bumps [@angular/material](https://github.com/angular/components) from 13.2.6 to 13.3.0. - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/13.2.6...13.3.0) --- updated-dependencies: - dependency-name: "@angular/material" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 28 ++++++++++++++-------------- frontend/package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c412349..22c8c14 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,7 +14,7 @@ "@angular/compiler": "~13.2.0", "@angular/core": "~13.2.0", "@angular/forms": "~13.2.0", - "@angular/material": "^13.2.6", + "@angular/material": "^13.3.0", "@angular/platform-browser": "~13.2.0", "@angular/platform-browser-dynamic": "~13.2.0", "@angular/router": "~13.2.0", @@ -345,9 +345,9 @@ } }, "node_modules/@angular/cdk": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.6.tgz", - "integrity": "sha512-epuXmaHqfukwPsYvIksbuHLXDtb6GALV2Vgv6W2asj4TorD584CeQTs0EcdPGmCzhGUYI8U8QV63WOxu9YFcNA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.0.tgz", + "integrity": "sha512-TyTcs9/Vd0TyQIjRf40xCDrTBK2GGCUrrHCVuHTXIqL8yvaGRnz815fL9X3hSZySCcbRV4NeK1yWeiZ9jf4Vxw==", "dependencies": { "tslib": "^2.3.0" }, @@ -577,15 +577,15 @@ } }, "node_modules/@angular/material": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.6.tgz", - "integrity": "sha512-/h5wa/tXE0DMIIEQX+rozFkUWHYUWg1Xf1R2tXUFLslLQ0KRCGyNo225Sv/1wrxXHxfrML787lA9ex4p90Feqw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.0.tgz", + "integrity": "sha512-g9WRuzUo0HPeEZKQi3uRZU3lfFwcdVqdXL8F9vxpR6fg0u9jNF+Wm+sIlsADS93h/zS0IZXYecge0NU8T7Kd0g==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^13.0.0 || ^14.0.0-0", - "@angular/cdk": "13.2.6", + "@angular/cdk": "13.3.0", "@angular/common": "^13.0.0 || ^14.0.0-0", "@angular/core": "^13.0.0 || ^14.0.0-0", "@angular/forms": "^13.0.0 || ^14.0.0-0", @@ -11671,9 +11671,9 @@ } }, "@angular/cdk": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.6.tgz", - "integrity": "sha512-epuXmaHqfukwPsYvIksbuHLXDtb6GALV2Vgv6W2asj4TorD584CeQTs0EcdPGmCzhGUYI8U8QV63WOxu9YFcNA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.0.tgz", + "integrity": "sha512-TyTcs9/Vd0TyQIjRf40xCDrTBK2GGCUrrHCVuHTXIqL8yvaGRnz815fL9X3hSZySCcbRV4NeK1yWeiZ9jf4Vxw==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" @@ -11833,9 +11833,9 @@ } }, "@angular/material": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.6.tgz", - "integrity": "sha512-/h5wa/tXE0DMIIEQX+rozFkUWHYUWg1Xf1R2tXUFLslLQ0KRCGyNo225Sv/1wrxXHxfrML787lA9ex4p90Feqw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.0.tgz", + "integrity": "sha512-g9WRuzUo0HPeEZKQi3uRZU3lfFwcdVqdXL8F9vxpR6fg0u9jNF+Wm+sIlsADS93h/zS0IZXYecge0NU8T7Kd0g==", "requires": { "tslib": "^2.3.0" } diff --git a/frontend/package.json b/frontend/package.json index 488a7aa..94d319a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,7 +16,7 @@ "@angular/compiler": "~13.2.0", "@angular/core": "~13.2.0", "@angular/forms": "~13.2.0", - "@angular/material": "^13.2.6", + "@angular/material": "^13.3.0", "@angular/platform-browser": "~13.2.0", "@angular/platform-browser-dynamic": "~13.2.0", "@angular/router": "~13.2.0", -- 2.45.2 From f3b028e2aa8b990ae3fd2a7b980095d947602fee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:15:11 +0000 Subject: [PATCH 19/91] Bump @types/jasmine from 3.10.3 to 4.0.0 in /frontend Bumps [@types/jasmine](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jasmine) from 3.10.3 to 4.0.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jasmine) --- updated-dependencies: - dependency-name: "@types/jasmine" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c412349..7bb67ac 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -27,7 +27,7 @@ "@angular-devkit/build-angular": "~13.2.5", "@angular/cli": "~13.2.5", "@angular/compiler-cli": "~13.2.0", - "@types/jasmine": "~3.10.0", + "@types/jasmine": "~4.0.0", "@types/node": "^12.11.1", "jasmine-core": "~4.0.0", "karma": "~6.3.0", @@ -2712,9 +2712,9 @@ } }, "node_modules/@types/jasmine": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.3.tgz", - "integrity": "sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.0.tgz", + "integrity": "sha512-KvhqNz4NaONk7cfp4E9x+uXOUp7x4H2Zeyb4yXnw2vIuxD5YfSi1767x+aF7z54elhZcC0OH9/78/WL6+5jcDg==", "dev": true }, "node_modules/@types/json-schema": { @@ -13367,9 +13367,9 @@ } }, "@types/jasmine": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.3.tgz", - "integrity": "sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.0.tgz", + "integrity": "sha512-KvhqNz4NaONk7cfp4E9x+uXOUp7x4H2Zeyb4yXnw2vIuxD5YfSi1767x+aF7z54elhZcC0OH9/78/WL6+5jcDg==", "dev": true }, "@types/json-schema": { diff --git a/frontend/package.json b/frontend/package.json index 488a7aa..ec2c672 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,7 +29,7 @@ "@angular-devkit/build-angular": "~13.2.5", "@angular/cli": "~13.2.5", "@angular/compiler-cli": "~13.2.0", - "@types/jasmine": "~3.10.0", + "@types/jasmine": "~4.0.0", "@types/node": "^12.11.1", "jasmine-core": "~4.0.0", "karma": "~6.3.0", -- 2.45.2 From 9e7042984cdc663a67faca8eaa18f502010acaac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:15:30 +0000 Subject: [PATCH 20/91] Bump karma-coverage from 2.1.1 to 2.2.0 in /frontend Bumps [karma-coverage](https://github.com/karma-runner/karma-coverage) from 2.1.1 to 2.2.0. - [Release notes](https://github.com/karma-runner/karma-coverage/releases) - [Changelog](https://github.com/karma-runner/karma-coverage/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma-coverage/compare/v2.1.1...v2.2.0) --- updated-dependencies: - dependency-name: karma-coverage dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 62 ++++++-------------------------------- frontend/package.json | 2 +- 2 files changed, 10 insertions(+), 54 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c412349..0acb540 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -32,7 +32,7 @@ "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.1.0", + "karma-coverage": "~2.2.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.5.2" @@ -7002,13 +7002,13 @@ } }, "node_modules/karma-coverage": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.1.1.tgz", - "integrity": "sha512-oxeOSBVK/jdZsiX03LhHQkO4eISSQb5GbHi6Nsw3Mw7G4u6yUgacBAftnO7q+emPBLMsrNbz1pGIrj+Jb3z17A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.1", "istanbul-reports": "^3.0.5", @@ -7018,30 +7018,6 @@ "node": ">=10.0.0" } }, - "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/karma-jasmine": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", @@ -16615,37 +16591,17 @@ } }, "karma-coverage": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.1.1.tgz", - "integrity": "sha512-oxeOSBVK/jdZsiX03LhHQkO4eISSQb5GbHi6Nsw3Mw7G4u6yUgacBAftnO7q+emPBLMsrNbz1pGIrj+Jb3z17A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.1", "istanbul-reports": "^3.0.5", "minimatch": "^3.0.4" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "karma-jasmine": { diff --git a/frontend/package.json b/frontend/package.json index 488a7aa..7818bfe 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -34,7 +34,7 @@ "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.1.0", + "karma-coverage": "~2.2.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "~1.7.0", "typescript": "~4.5.2" -- 2.45.2 From d3fbc590658174ebe037f9dd76b36567bb800d37 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 18 Mar 2022 00:25:27 +0100 Subject: [PATCH 21/91] Update dependabot.yml --- .github/dependabot.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 96a2e95..0cba6af 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,15 +10,26 @@ updates: directory: "/api" schedule: interval: "daily" + assignees: + - "H4CK3R-01" + open-pull-requests-limit: 0 # Bot - package-ecosystem: "pip" directory: "/telegram_bot" schedule: interval: "daily" + assignees: + - "NormalParameter" + - "Rripped" + - "FlorianKellermann" + open-pull-requests-limit: 0 # Frontend - - package-ecosystem: "npm" - directory: "/frontend" - schedule: - interval: "daily" + # - package-ecosystem: "npm" + # directory: "/frontend" + # schedule: + # interval: "daily" + # assignees: + # - "kevinpauer" + # open-pull-requests-limit: 0 -- 2.45.2 From 9ef33fc38a0223393b37896f7bed85890b57ef03 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 18 Mar 2022 00:26:23 +0100 Subject: [PATCH 22/91] Update dependabot.yml --- .github/dependabot.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0cba6af..89a1b72 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -26,10 +26,10 @@ updates: open-pull-requests-limit: 0 # Frontend - # - package-ecosystem: "npm" - # directory: "/frontend" - # schedule: - # interval: "daily" - # assignees: - # - "kevinpauer" - # open-pull-requests-limit: 0 + - package-ecosystem: "npm" + directory: "/frontend" + schedule: + interval: "daily" + assignees: + - "kevinpauer" + open-pull-requests-limit: 0 -- 2.45.2 From 2be454c0c56b3c2021bfeae1fc10305c16af4604 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 18 Mar 2022 00:26:53 +0100 Subject: [PATCH 23/91] Update dependabot.yml --- .github/dependabot.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 89a1b72..cd66a59 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -27,9 +27,9 @@ updates: # Frontend - package-ecosystem: "npm" - directory: "/frontend" - schedule: - interval: "daily" - assignees: - - "kevinpauer" - open-pull-requests-limit: 0 + directory: "/frontend" + schedule: + interval: "daily" + assignees: + - "kevinpauer" + open-pull-requests-limit: 0 -- 2.45.2 From fc993c0138e2e1bda45522ed50bba6c772f301da Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 18 Mar 2022 00:31:50 +0100 Subject: [PATCH 24/91] Update dependabot.yml --- .github/dependabot.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cd66a59..76ca8b1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,7 +12,7 @@ updates: interval: "daily" assignees: - "H4CK3R-01" - open-pull-requests-limit: 0 + open-pull-requests-limit: 100 # Bot - package-ecosystem: "pip" @@ -23,7 +23,7 @@ updates: - "NormalParameter" - "Rripped" - "FlorianKellermann" - open-pull-requests-limit: 0 + open-pull-requests-limit: 100 # Frontend - package-ecosystem: "npm" @@ -32,4 +32,4 @@ updates: interval: "daily" assignees: - "kevinpauer" - open-pull-requests-limit: 0 + open-pull-requests-limit: 100 -- 2.45.2 From 5d14c6a97dc483e82edb1eec7b216f088a2ffcfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:33:41 +0000 Subject: [PATCH 25/91] Bump @angular/cli from 13.2.6 to 13.3.0 in /frontend Bumps [@angular/cli](https://github.com/angular/angular-cli) from 13.2.6 to 13.3.0. - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/13.2.6...13.3.0) --- updated-dependencies: - dependency-name: "@angular/cli" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 284 ++++++++++++++++++++++++++++++++----- frontend/package.json | 2 +- 2 files changed, 252 insertions(+), 34 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c412349..f88e4aa 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~13.2.5", - "@angular/cli": "~13.2.5", + "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~3.10.0", "@types/node": "^12.11.1", @@ -295,12 +295,12 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.6.tgz", - "integrity": "sha512-mPgSqdnZRuPSMeUA+T+mwVCrq2yhXpcYm1/Rjbhy09CyHs4wSrFv21WHCrE6shlvXpcmwr0n+I0DIeagAPmjUA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.0.tgz", + "integrity": "sha512-hq7tqnB3uVT/iDgqWWZ4kvnijeAcgd4cfLzZiCPaYn1nuhZf0tWsho6exhJ/odMZHvVp7w8OibqWiUKxNY9zHA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -312,6 +312,33 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -367,16 +394,16 @@ "optional": true }, "node_modules/@angular/cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.6.tgz", - "integrity": "sha512-xIjEaQI5sWemXXc7GXLm4u9UL5sjtrQL/y1PJvvk/Jsa8+kIT+MutOfZfC7zcdAh9fqHd8mokH3guFV8BJdFxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.0.tgz", + "integrity": "sha512-2qCKP/QsyxrJnpd3g4P/iTQ4TjI04N8r+bG5YLLfudoMDsQ/Ti4ogdI7PBeG2IMbRylZW9XLjHraWG42+Y9tWw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", - "@schematics/angular": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", + "@schematics/angular": "13.3.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -402,6 +429,66 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.0", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular/cli/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/@angular/common": { "version": "13.2.6", "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.6.tgz", @@ -2564,13 +2651,13 @@ } }, "node_modules/@schematics/angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.6.tgz", - "integrity": "sha512-8NzHMX9+FSgaB0lJYxlTJv9OcBuolwZJqo9M/yX3RPSqSHghA33jWwgVbV551hBJOpbVEePerG1DQkIC99DXKA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.0.tgz", + "integrity": "sha512-WND6DXWf0ZFefqlC2hUm1FzHDonRfGpDEPWVhVulhYkB7IUUaXuCz8K41HAScyJ3bxUngs2Lx9+4omikc05fxA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", "jsonc-parser": "3.0.0" }, "engines": { @@ -2579,6 +2666,51 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@schematics/angular/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/@socket.io/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -11633,18 +11765,32 @@ } }, "@angular-devkit/schematics": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.6.tgz", - "integrity": "sha512-mPgSqdnZRuPSMeUA+T+mwVCrq2yhXpcYm1/Rjbhy09CyHs4wSrFv21WHCrE6shlvXpcmwr0n+I0DIeagAPmjUA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.0.tgz", + "integrity": "sha512-hq7tqnB3uVT/iDgqWWZ4kvnijeAcgd4cfLzZiCPaYn1nuhZf0tWsho6exhJ/odMZHvVp7w8OibqWiUKxNY9zHA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", "rxjs": "6.6.7" }, "dependencies": { + "@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -11688,15 +11834,15 @@ } }, "@angular/cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.6.tgz", - "integrity": "sha512-xIjEaQI5sWemXXc7GXLm4u9UL5sjtrQL/y1PJvvk/Jsa8+kIT+MutOfZfC7zcdAh9fqHd8mokH3guFV8BJdFxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.0.tgz", + "integrity": "sha512-2qCKP/QsyxrJnpd3g4P/iTQ4TjI04N8r+bG5YLLfudoMDsQ/Ti4ogdI7PBeG2IMbRylZW9XLjHraWG42+Y9tWw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", - "@schematics/angular": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", + "@schematics/angular": "13.3.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -11712,6 +11858,47 @@ "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.0", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular/common": { @@ -13230,14 +13417,45 @@ "peer": true }, "@schematics/angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.6.tgz", - "integrity": "sha512-8NzHMX9+FSgaB0lJYxlTJv9OcBuolwZJqo9M/yX3RPSqSHghA33jWwgVbV551hBJOpbVEePerG1DQkIC99DXKA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.0.tgz", + "integrity": "sha512-WND6DXWf0ZFefqlC2hUm1FzHDonRfGpDEPWVhVulhYkB7IUUaXuCz8K41HAScyJ3bxUngs2Lx9+4omikc05fxA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", "jsonc-parser": "3.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@socket.io/base64-arraybuffer": { diff --git a/frontend/package.json b/frontend/package.json index 488a7aa..94ba1f8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,7 +27,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~13.2.5", - "@angular/cli": "~13.2.5", + "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~3.10.0", "@types/node": "^12.11.1", -- 2.45.2 From e8137cada10ea1bd0029cb034ef3897acf4b437c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Mar 2022 12:05:47 +0000 Subject: [PATCH 26/91] Bump @types/node from 12.20.47 to 17.0.21 in /frontend Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 12.20.47 to 17.0.21. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5044f2f..f6df079 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,7 +28,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^12.11.1", + "@types/node": "^17.0.21", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -2862,9 +2862,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "12.20.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.47.tgz", - "integrity": "sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg==", + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -13579,9 +13579,9 @@ "dev": true }, "@types/node": { - "version": "12.20.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.47.tgz", - "integrity": "sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg==", + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, "@types/parse-json": { diff --git a/frontend/package.json b/frontend/package.json index a0e8455..2371578 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^12.11.1", + "@types/node": "^17.0.21", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", -- 2.45.2 From f11b50d6cbe4b23a5ae1cf5a46b7fe8973c22a7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Mar 2022 12:06:18 +0000 Subject: [PATCH 27/91] Bump @angular-devkit/build-angular from 13.2.6 to 13.3.0 in /frontend Bumps [@angular-devkit/build-angular](https://github.com/angular/angular-cli) from 13.2.6 to 13.3.0. - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/13.2.6...13.3.0) --- updated-dependencies: - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 366 ++++++++----------------------------- frontend/package.json | 2 +- 2 files changed, 75 insertions(+), 293 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5044f2f..a8efd8a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -24,7 +24,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.2.5", + "@angular-devkit/build-angular": "~13.3.0", "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", @@ -52,12 +52,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.6.tgz", - "integrity": "sha512-NztzorUMfwJeRaT7SY00Y8WSqc2lQYuF11yNoyEm7Dae3V7VZ28rW2Z9RwibP27rYQL0RjSMaz2wKITHX2vOAw==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "rxjs": "6.6.7" }, "engines": { @@ -85,15 +85,15 @@ "dev": true }, "node_modules/@angular-devkit/build-angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.6.tgz", - "integrity": "sha512-Y2ojy6xbZ0kwScppcutLHBP8eW0qNOjburTISSBU/L5l/9FOeZ1E7yAreKuVu/qibZiLbSJfAhk+SLwhRHFSSQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.0.tgz", + "integrity": "sha512-3Ji7EeqGHj7i1Jgmeo3aIEXsnfKyFeQPpl65gcYmHwj5dP4lZzLSU4rMaWWUKksccgqCUXgPI2vKePTPazmikg==", "dev": true, "dependencies": { "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/build-webpack": "0.1302.6", - "@angular-devkit/core": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/build-webpack": "0.1303.0", + "@angular-devkit/core": "13.3.0", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -104,7 +104,7 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.6", + "@ngtools/webpack": "13.3.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -149,7 +149,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", @@ -164,14 +164,14 @@ "esbuild": "0.14.22" }, "peerDependencies": { - "@angular/compiler-cli": "^13.0.0", - "@angular/localize": "^13.0.0", - "@angular/service-worker": "^13.0.0", + "@angular/compiler-cli": "^13.0.0 || ^13.3.0-rc.0", + "@angular/localize": "^13.0.0 || ^13.3.0-rc.0", + "@angular/service-worker": "^13.0.0 || ^13.3.0-rc.0", "karma": "^6.3.0", "ng-packagr": "^13.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.4.3 <4.6" + "typescript": ">=4.4.3 <4.7" }, "peerDependenciesMeta": { "@angular/localize": { @@ -213,12 +213,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.6.tgz", - "integrity": "sha512-TYEh2n9tPe932rEIgdiSpojOqtDppW2jzb/empVqCkLF7WUZsXKvTanttZC34L6R2VD6SAGWhb6JDg75ghUVYA==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.0.tgz", + "integrity": "sha512-a+Veg2oYn3RM2Kl148BReuONmD1kjbbYBnMUVi8nD6rvJPStFZkqN5s5ZkYybKeWnzMGaB3VasKR88z5XeH22A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1302.6", + "@angular-devkit/architect": "0.1303.0", "rxjs": "6.6.7" }, "engines": { @@ -250,9 +250,9 @@ "dev": true }, "node_modules/@angular-devkit/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.6.tgz", - "integrity": "sha512-8h2mWdBTN/dYwZuzKMg2IODlOWMdbJcpQG4XVrkk9ejCPP+3aX5Aa3glCe/voN6eBNiRfs8YDM0jxmpN2aWVtg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", "dev": true, "dependencies": { "ajv": "8.9.0", @@ -312,33 +312,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "dependencies": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -429,66 +402,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1303.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", - "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "13.3.0", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "dependencies": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular/cli/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular/common": { "version": "13.2.6", "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.6.tgz", @@ -2493,9 +2406,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.6.tgz", - "integrity": "sha512-N8SvRV91+/57TcAfbghc0k0tKCukw/7KqbDaLPAQTGFekJ4xMGT3elMzOyBXTH3Hvp5HL8/hiBt2tG04qiMf+w==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.0.tgz", + "integrity": "sha512-QbTQWXK2WzYU+aKKVDG0ya7WYT+6rNAUXVt5ov9Nz1SGgDeozpiOx8ZqPWUvnToTY8EoodwWFGCVtkLHXUR+wA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.15.0 || >=16.10.0", @@ -2504,7 +2417,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^13.0.0", - "typescript": ">=4.4.3 <4.6", + "typescript": ">=4.4.3 <4.7", "webpack": "^5.30.0" } }, @@ -2666,51 +2579,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "dependencies": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@schematics/angular/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@socket.io/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -2806,9 +2674,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/express": { @@ -8000,9 +7868,9 @@ "optional": true }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -11088,13 +10956,13 @@ } }, "node_modules/webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -11102,7 +10970,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -11564,12 +11432,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.6.tgz", - "integrity": "sha512-NztzorUMfwJeRaT7SY00Y8WSqc2lQYuF11yNoyEm7Dae3V7VZ28rW2Z9RwibP27rYQL0RjSMaz2wKITHX2vOAw==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "rxjs": "6.6.7" }, "dependencies": { @@ -11591,15 +11459,15 @@ } }, "@angular-devkit/build-angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.6.tgz", - "integrity": "sha512-Y2ojy6xbZ0kwScppcutLHBP8eW0qNOjburTISSBU/L5l/9FOeZ1E7yAreKuVu/qibZiLbSJfAhk+SLwhRHFSSQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.0.tgz", + "integrity": "sha512-3Ji7EeqGHj7i1Jgmeo3aIEXsnfKyFeQPpl65gcYmHwj5dP4lZzLSU4rMaWWUKksccgqCUXgPI2vKePTPazmikg==", "dev": true, "requires": { "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/build-webpack": "0.1302.6", - "@angular-devkit/core": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/build-webpack": "0.1303.0", + "@angular-devkit/core": "13.3.0", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -11610,7 +11478,7 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.6", + "@ngtools/webpack": "13.3.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -11656,7 +11524,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", @@ -11683,12 +11551,12 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.6.tgz", - "integrity": "sha512-TYEh2n9tPe932rEIgdiSpojOqtDppW2jzb/empVqCkLF7WUZsXKvTanttZC34L6R2VD6SAGWhb6JDg75ghUVYA==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.0.tgz", + "integrity": "sha512-a+Veg2oYn3RM2Kl148BReuONmD1kjbbYBnMUVi8nD6rvJPStFZkqN5s5ZkYybKeWnzMGaB3VasKR88z5XeH22A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.6", + "@angular-devkit/architect": "0.1303.0", "rxjs": "6.6.7" }, "dependencies": { @@ -11710,9 +11578,9 @@ } }, "@angular-devkit/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.6.tgz", - "integrity": "sha512-8h2mWdBTN/dYwZuzKMg2IODlOWMdbJcpQG4XVrkk9ejCPP+3aX5Aa3glCe/voN6eBNiRfs8YDM0jxmpN2aWVtg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", "dev": true, "requires": { "ajv": "8.9.0", @@ -11753,20 +11621,6 @@ "rxjs": "6.6.7" }, "dependencies": { - "@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "requires": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -11834,47 +11688,6 @@ "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1303.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", - "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", - "dev": true, - "requires": { - "@angular-devkit/core": "13.3.0", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "requires": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular/common": { @@ -13270,9 +13083,9 @@ } }, "@ngtools/webpack": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.6.tgz", - "integrity": "sha512-N8SvRV91+/57TcAfbghc0k0tKCukw/7KqbDaLPAQTGFekJ4xMGT3elMzOyBXTH3Hvp5HL8/hiBt2tG04qiMf+w==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.0.tgz", + "integrity": "sha512-QbTQWXK2WzYU+aKKVDG0ya7WYT+6rNAUXVt5ov9Nz1SGgDeozpiOx8ZqPWUvnToTY8EoodwWFGCVtkLHXUR+wA==", "dev": true, "requires": {} }, @@ -13401,37 +13214,6 @@ "@angular-devkit/core": "13.3.0", "@angular-devkit/schematics": "13.3.0", "jsonc-parser": "3.0.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", - "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", - "dev": true, - "requires": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@socket.io/base64-arraybuffer": { @@ -13523,9 +13305,9 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/express": { @@ -17408,9 +17190,9 @@ "optional": true }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true }, "node-gyp": { @@ -19677,13 +19459,13 @@ } }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -19691,7 +19473,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/frontend/package.json b/frontend/package.json index a0e8455..b3e0baf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -26,7 +26,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.2.5", + "@angular-devkit/build-angular": "~13.3.0", "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", -- 2.45.2 From 9fa123489abf52ccfc7ebbc7048d5c6ad63146b3 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sat, 19 Mar 2022 20:25:34 +0100 Subject: [PATCH 28/91] Try to fix cors --- api/app.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/api/app.py b/api/app.py index 9a26db5..193bb4b 100644 --- a/api/app.py +++ b/api/app.py @@ -18,11 +18,7 @@ def create_app(): application = APIFlask(__name__, openapi_blueprint_url_prefix='/api') application.config.from_object("config.ConfigClass") - CORS(application, resource={ - r"/*": { - "origins": "*" - } - }) + CORS(application, resources={r"*": {"origins": "*"}}) application.app_context().push() -- 2.45.2 From 1f31311b4e06101d0b2c243195e5b515aac70f88 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Mon, 21 Mar 2022 10:30:27 +0100 Subject: [PATCH 29/91] Set pool_recycle and pool_size to maybe fix database errors --- api/config.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/config.py b/api/config.py index 923f3b8..d3f69e6 100644 --- a/api/config.py +++ b/api/config.py @@ -21,6 +21,10 @@ class ConfigClass(object): (os.getenv("MYSQL_PORT") or str(3306)) + "/" + \ os.getenv('MYSQL_DATABASE') SQLALCHEMY_TRACK_MODIFICATIONS = False # Avoids SQLAlchemy warning + SQLALCHEMY_ENGINE_OPTIONS = { + 'pool_size': 100, + 'pool_recycle': 240 # 4 minutes + } # openapi/Swagger config SERVERS = [ -- 2.45.2 From a9effa751d9b375131617e86173d78319c8c2c31 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Tue, 22 Mar 2022 08:14:04 +0100 Subject: [PATCH 30/91] Removed unnecessary requirements --- api/requirements.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/api/requirements.txt b/api/requirements.txt index 91de9c7..70218cf 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,12 +1,9 @@ Flask~=2.0.3 python-dotenv==0.19.2 -requests==2.27.1 uwsgi==2.0.20 Flask_SQLAlchemy==2.5.1 python-dotenv==0.19.2 pymysql==1.0.2 pyjwt==2.3.0 apiflask==0.12.0 -flask-swagger-ui==3.36.0 -flask-cors==3.0.10 - +flask-cors==3.0.10 \ No newline at end of file -- 2.45.2 From 672f1cc2845c22dcb17ec5255f08875c50a18c66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 09:35:49 +0000 Subject: [PATCH 31/91] Bump @types/node from 17.0.21 to 17.0.22 in /frontend Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 17.0.21 to 17.0.22. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d149dc2..1eb150b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,7 +28,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^17.0.21", + "@types/node": "^17.0.22", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -2730,9 +2730,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", "dev": true }, "node_modules/@types/parse-json": { @@ -13361,9 +13361,9 @@ "dev": true }, "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", "dev": true }, "@types/parse-json": { diff --git a/frontend/package.json b/frontend/package.json index 8b58ec3..21e5411 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^17.0.21", + "@types/node": "^17.0.22", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", -- 2.45.2 From 7f90f2c8127e83480dc59e04aa494b2c98607f41 Mon Sep 17 00:00:00 2001 From: Rripped <75929322+Rripped@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:44:01 +0100 Subject: [PATCH 32/91] Update README.md --- documentation/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/documentation/README.md b/documentation/README.md index b575c73..2478c4d 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1,5 +1,8 @@ # Dokumentation +##Swagger Documentation +Visit https://aktienbot.flokaiser.com/api/docs + ## API - `api/openapi.json` - OpenAPI-Dokumentation @@ -25,4 +28,4 @@ Function|Admin|No Admin| |Delete user|yes|only current user| |Update users|yes|only current user| |Set admin state|yes|no| -|Show all users|yes|no| \ No newline at end of file +|Show all users|yes|no| -- 2.45.2 From f5f7ccd5a9c55bf5b2f835addefa845b29eb3b83 Mon Sep 17 00:00:00 2001 From: Rripped <75929322+Rripped@users.noreply.github.com> Date: Tue, 22 Mar 2022 10:44:28 +0100 Subject: [PATCH 33/91] Update README.md --- documentation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/README.md b/documentation/README.md index 2478c4d..3bdec2f 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1,6 +1,6 @@ # Dokumentation -##Swagger Documentation +## Swagger Documentation Visit https://aktienbot.flokaiser.com/api/docs ## API -- 2.45.2 From bd5768527e6cec8966c451bb30159b018a5355be Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Tue, 22 Mar 2022 11:20:04 +0100 Subject: [PATCH 34/91] Improve api for bot --- api/auth.py | 3 +++ api/helper_functions.py | 31 +++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/api/auth.py b/api/auth.py index 7db89a7..8096012 100644 --- a/api/auth.py +++ b/api/auth.py @@ -11,6 +11,9 @@ def verify_token(token): if token is None: return False + if ':' in token: # Bot token + token = token.split(":")[0] + try: jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"]) return True diff --git a/api/helper_functions.py b/api/helper_functions.py index 2791494..f5e6862 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -38,11 +38,30 @@ def extract_token_data(token): return None -def get_username_from_token_data(token_data): - if token_data is not None: - return token_data['username'] - else: - return None +def get_username_from_token_data(): + if 'Authorization' in request.headers: + token = request.headers['Authorization'].split(" ")[1] + + if token is not None: + if ':' in token: # Maybe bot token, check if token valid and return username after ":" then + username = token.split(":")[1] + token = token.split(":")[0] + + try: + if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['username'] == "bot": + return username + else: + return None + except jwt.exceptions.DecodeError: + return None + + else: # "Normal" token, extract username from token + try: + return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['username'] + except jwt.exceptions.DecodeError: + return None + + return None def get_user_id_from_username(username): @@ -54,7 +73,7 @@ def get_user_id_from_username(username): def get_username_or_abort_401(): # get username from jwt token - username = get_username_from_token_data(extract_token_data(get_token())) + username = get_username_from_token_data() if username is None: # If token not provided or invalid -> return 401 code abort(401, message="Unable to login") -- 2.45.2 From 40d3e3238d16fb4ff5e1008ab0af78d29f9a1845 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Tue, 22 Mar 2022 11:21:39 +0100 Subject: [PATCH 35/91] Standardization of json responses --- api/api_blueprint_keyword.py | 11 +++++------ api/api_blueprint_portfolio.py | 5 ++--- api/api_blueprint_shares.py | 13 ++++++------- api/api_blueprint_transactions.py | 9 ++++----- api/api_blueprint_user.py | 20 ++++++++++---------- api/config.py | 2 +- api/helper_functions.py | 6 +++++- api/{scheme.py => schema.py} | 0 8 files changed, 33 insertions(+), 33 deletions(-) rename api/{scheme.py => schema.py} (100%) diff --git a/api/api_blueprint_keyword.py b/api/api_blueprint_keyword.py index 7474bcb..232a97b 100644 --- a/api/api_blueprint_keyword.py +++ b/api/api_blueprint_keyword.py @@ -1,12 +1,11 @@ import os from apiflask import APIBlueprint, abort -from flask import jsonify from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401 +from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response from auth import auth -from scheme import KeywordResponseSchema, KeywordSchema, DeleteSuccessfulSchema +from schema import KeywordResponseSchema, KeywordSchema, DeleteSuccessfulSchema from models import Keyword keyword_blueprint = APIBlueprint('keyword', __name__, url_prefix='/api') @@ -35,7 +34,7 @@ def add_keyword(data): db.session.add(new_keyword) db.session.commit() - return jsonify({"status": 200, "text": "Successfully added keyword", "data": new_keyword.as_dict()}) + return make_response(new_keyword.as_dict(), 200, "Successfully added keyword") else: abort(500, message="Keyword already exist for this user") @@ -55,7 +54,7 @@ def remove_keyword(data): db.session.query(Keyword).filter_by(keyword=key, user_id=get_user_id_from_username(username)).delete() db.session.commit() - return jsonify({"status": 200, "text": "Successfully removed keyword", "data": {}}) + return make_response({}, 200, "Successfully removed keyword") @keyword_blueprint.route('/keywords', methods=['GET']) @@ -72,7 +71,7 @@ def get_keywords(): for row in keywords: return_keywords.append(row.as_dict()) - return jsonify({"status": 200, "text": "Successfully loaded keywords", "data": return_keywords}) + return make_response(return_keywords, 200, "Successfully loaded keywords") def check_if_keyword_data_exists(data): diff --git a/api/api_blueprint_portfolio.py b/api/api_blueprint_portfolio.py index 2a54275..5970ced 100644 --- a/api/api_blueprint_portfolio.py +++ b/api/api_blueprint_portfolio.py @@ -1,10 +1,9 @@ import os from apiflask import APIBlueprint -from flask import jsonify from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401 +from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response from models import Transaction from auth import auth @@ -30,4 +29,4 @@ def get_portfolio(): else: return_portfolio[row.symbol] = {"count": row.count, "last_transaction": row.time} - return jsonify({"status": 200, "text": "Successfully loaded symbols", "data": return_portfolio}) + return make_response(return_portfolio, 200, "Successfully loaded symbols") diff --git a/api/api_blueprint_shares.py b/api/api_blueprint_shares.py index ef68d99..3e18e8c 100644 --- a/api/api_blueprint_shares.py +++ b/api/api_blueprint_shares.py @@ -1,13 +1,12 @@ import os from apiflask import APIBlueprint, abort -from flask import jsonify from auth import auth from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401 +from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response from models import Share -from scheme import SymbolSchema, SymbolResponseSchema, DeleteSuccessfulSchema +from schema import SymbolSchema, SymbolResponseSchema, DeleteSuccessfulSchema shares_blueprint = APIBlueprint('share', __name__, url_prefix='/api') __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) @@ -35,9 +34,9 @@ def add_symbol(data): db.session.add(new_symbol) db.session.commit() - return jsonify({"status": 200, "text": "Successfully added symbol", "data": new_symbol.as_dict()}) + return make_response(new_symbol.as_dict(), 200, "Successfully added symbol") else: - return jsonify({"status": 500, "text": "Symbol already exist for this user"}) + return make_response({}, 500, "Symbol already exist for this user") @shares_blueprint.route('/share', methods=['DELETE']) @@ -55,7 +54,7 @@ def remove_symbol(data): db.session.query(Share).filter_by(symbol=symbol, user_id=get_user_id_from_username(username)).delete() db.session.commit() - return jsonify({"status": 200, "text": "Successfully removed symbol", "data": {}}) + return make_response({}, 200, "Successfully removed symbol") @shares_blueprint.route('/shares', methods=['GET']) @@ -72,7 +71,7 @@ def get_symbol(): for row in symbols: return_symbols.append(row.as_dict()) - return jsonify({"status": 200, "text": "Successfully loaded symbols", "data": return_symbols}) + return make_response(return_symbols, 200, "Successfully loaded symbols") def check_if_symbol_data_exists(data): diff --git a/api/api_blueprint_transactions.py b/api/api_blueprint_transactions.py index 2a8fed2..b0e58fc 100644 --- a/api/api_blueprint_transactions.py +++ b/api/api_blueprint_transactions.py @@ -2,12 +2,11 @@ import os import datetime from apiflask import abort, APIBlueprint -from flask import jsonify from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401 +from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response from models import Transaction -from scheme import TransactionSchema +from schema import TransactionSchema from auth import auth transaction_blueprint = APIBlueprint('transaction', __name__, url_prefix='/api') @@ -34,7 +33,7 @@ def add_transaction(data): db.session.add(new_transaction) db.session.commit() - return jsonify({"status": 200, "text": "Successfully added transaction", "data": new_transaction.as_dict()}) + return make_response(new_transaction.as_dict(), 200, "Successfully added transaction") @transaction_blueprint.route('/transactions', methods=['GET']) @@ -51,7 +50,7 @@ def get_transaction(): for row in transactions: return_transactions.append(row.as_dict()) - return jsonify({"status": 200, "text": "Successfully loaded transactions", "data": return_transactions}) + return make_response(return_transactions, 200, "Successfully loaded transactions") def check_if_transaction_data_exists(data): diff --git a/api/api_blueprint_user.py b/api/api_blueprint_user.py index c7e6940..747a82f 100644 --- a/api/api_blueprint_user.py +++ b/api/api_blueprint_user.py @@ -3,12 +3,11 @@ import os import jwt from apiflask import APIBlueprint, abort -from flask import jsonify from db import db -from helper_functions import check_password, hash_password, get_username_or_abort_401, abort_if_no_admin +from helper_functions import check_password, hash_password, get_username_or_abort_401, abort_if_no_admin, make_response from models import User -from scheme import UsersSchema, TokenSchema, LoginDataSchema, AdminDataSchema, DeleteUserSchema +from schema import UsersSchema, TokenSchema, LoginDataSchema, AdminDataSchema, DeleteUserSchema from auth import auth users_blueprint = APIBlueprint('users', __name__, url_prefix='/api') @@ -26,7 +25,7 @@ def users(): for i in User.query.all(): res.append(i.as_dict()) - return jsonify({"status": 200, "data": res}) + return make_response(res, 200, "Successfully received all users") @users_blueprint.route('/user', methods=['GET']) @@ -38,7 +37,7 @@ def user(): res = db.session.query(User).filter_by(username=username).first().as_dict() - return jsonify({"status": 200, "data": res}) + return make_response(res, 200, "Successfully received current user data") @users_blueprint.route('/user/login', methods=['POST']) @@ -60,7 +59,8 @@ def login(data): abort(500, message="Unable to login") token = jwt.encode({'username': query_user.username, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=45)}, os.getenv('SECRET_KEY'), "HS256") - return jsonify({"status": 200, "text": "Successfully logged in", "data": {"token": token}}) + + return make_response({"token": token}, 200, "Successfully logged in") @users_blueprint.route('/user/register', methods=['POST']) @@ -86,7 +86,7 @@ def register(data): db.session.add(new_user) db.session.commit() - return jsonify({"status": 200, "text": "Successfully registered user", "data": new_user.as_dict()}) + return make_response(new_user.as_dict(), 200, "Successfully registered user") @users_blueprint.route('/user', methods=['PUT']) @@ -114,7 +114,7 @@ def update_user(data): db.session.commit() - return jsonify({"status": 200, "text": "Successfully updated user", "data": {}}) + return make_response({}, 200, "Successfully updated user") @users_blueprint.route('/user/setAdmin', methods=['PUT']) @@ -138,7 +138,7 @@ def set_admin(data): query_user.admin = admin db.session.commit() - return jsonify({"status": 200, "text": "Successfully updated users admin rights", "data": {}}) + return make_response({}, 200, "Successfully updated users admin rights") @users_blueprint.route('/user', methods=['DELETE']) @@ -160,7 +160,7 @@ def delete_user(data): db.session.query(User).filter_by(username=username).delete() db.session.commit() - return jsonify({"status": 200, "text": "Successfully removed user", "data": {}}) + return make_response({}, 200, "Successfully removed user") def check_if_user_data_exists(data): diff --git a/api/config.py b/api/config.py index d3f69e6..a12c60a 100644 --- a/api/config.py +++ b/api/config.py @@ -2,7 +2,7 @@ import os from dotenv import load_dotenv -from scheme import BaseResponseSchema +from schema import BaseResponseSchema load_dotenv() diff --git a/api/helper_functions.py b/api/helper_functions.py index f5e6862..59991c6 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -4,7 +4,7 @@ import uuid import jwt from apiflask import abort -from flask import request +from flask import request, jsonify from db import db from models import User @@ -90,3 +90,7 @@ def is_user_admin(): username = get_username_or_abort_401() return db.session.query(User).filter_by(username=username).first().admin + + +def make_response(data, status=200, text=""): + return jsonify({"status": status, "text": text, "data": {"token": data}}) diff --git a/api/scheme.py b/api/schema.py similarity index 100% rename from api/scheme.py rename to api/schema.py -- 2.45.2 From 769c8006caf0b20f324754bb0e1601d3c7fe8f86 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Tue, 22 Mar 2022 11:21:58 +0100 Subject: [PATCH 36/91] Create database before request --- api/app.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/app.py b/api/app.py index 193bb4b..933b471 100644 --- a/api/app.py +++ b/api/app.py @@ -24,9 +24,6 @@ def create_app(): db.init_app(application) - # Create all tables - db.create_all() - # api blueprints application.register_blueprint(keyword_blueprint) application.register_blueprint(shares_blueprint) @@ -34,6 +31,10 @@ def create_app(): application.register_blueprint(portfolio_blueprint) application.register_blueprint(users_blueprint) + @application.before_first_request + def init_database(): + db.create_all() + return application -- 2.45.2 From af1751657db27750780a23e078f21ea86b44f1e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Mar 2022 09:39:03 +0000 Subject: [PATCH 37/91] Bump @types/node from 17.0.22 to 17.0.23 in /frontend Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 17.0.22 to 17.0.23. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1eb150b..7999205 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,7 +28,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^17.0.22", + "@types/node": "^17.0.23", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -2730,9 +2730,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "node_modules/@types/parse-json": { @@ -13361,9 +13361,9 @@ "dev": true }, "@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/parse-json": { diff --git a/frontend/package.json b/frontend/package.json index 21e5411..ba1bbcb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "@angular/cli": "~13.3.0", "@angular/compiler-cli": "~13.2.0", "@types/jasmine": "~4.0.0", - "@types/node": "^17.0.22", + "@types/node": "^17.0.23", "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", -- 2.45.2 From 8aa5ea9e6beb36995b5d039a1975397535607765 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Mar 2022 09:39:13 +0000 Subject: [PATCH 38/91] Bump @angular/material from 13.3.0 to 13.3.1 in /frontend Bumps [@angular/material](https://github.com/angular/components) from 13.3.0 to 13.3.1. - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/13.3.0...13.3.1) --- updated-dependencies: - dependency-name: "@angular/material" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 28 ++++++++++++++-------------- frontend/package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1eb150b..7134c78 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,7 +14,7 @@ "@angular/compiler": "~13.2.0", "@angular/core": "~13.2.0", "@angular/forms": "~13.2.0", - "@angular/material": "^13.3.0", + "@angular/material": "^13.3.1", "@angular/platform-browser": "~13.2.0", "@angular/platform-browser-dynamic": "~13.2.0", "@angular/router": "~13.2.0", @@ -345,9 +345,9 @@ } }, "node_modules/@angular/cdk": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.0.tgz", - "integrity": "sha512-TyTcs9/Vd0TyQIjRf40xCDrTBK2GGCUrrHCVuHTXIqL8yvaGRnz815fL9X3hSZySCcbRV4NeK1yWeiZ9jf4Vxw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.1.tgz", + "integrity": "sha512-JUCvhN6XomY5JOMH7Qyj/JodAuAtKgLlJYKs0tPmjCkGcBdR/T3/hOJ9gSRhz8PCOoiEORj+3xCh547oJRyesA==", "dependencies": { "tslib": "^2.3.0" }, @@ -577,15 +577,15 @@ } }, "node_modules/@angular/material": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.0.tgz", - "integrity": "sha512-g9WRuzUo0HPeEZKQi3uRZU3lfFwcdVqdXL8F9vxpR6fg0u9jNF+Wm+sIlsADS93h/zS0IZXYecge0NU8T7Kd0g==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.1.tgz", + "integrity": "sha512-c9BYNxvZvxuCA5QticqfEhn3nuspUnwxIVejjO5ZTqKlkK+vQGKN3QhshHLrMHeFYyjao/E8jVnJX7ahitPM9w==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^13.0.0 || ^14.0.0-0", - "@angular/cdk": "13.3.0", + "@angular/cdk": "13.3.1", "@angular/common": "^13.0.0 || ^14.0.0-0", "@angular/core": "^13.0.0 || ^14.0.0-0", "@angular/forms": "^13.0.0 || ^14.0.0-0", @@ -11647,9 +11647,9 @@ } }, "@angular/cdk": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.0.tgz", - "integrity": "sha512-TyTcs9/Vd0TyQIjRf40xCDrTBK2GGCUrrHCVuHTXIqL8yvaGRnz815fL9X3hSZySCcbRV4NeK1yWeiZ9jf4Vxw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.1.tgz", + "integrity": "sha512-JUCvhN6XomY5JOMH7Qyj/JodAuAtKgLlJYKs0tPmjCkGcBdR/T3/hOJ9gSRhz8PCOoiEORj+3xCh547oJRyesA==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" @@ -11809,9 +11809,9 @@ } }, "@angular/material": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.0.tgz", - "integrity": "sha512-g9WRuzUo0HPeEZKQi3uRZU3lfFwcdVqdXL8F9vxpR6fg0u9jNF+Wm+sIlsADS93h/zS0IZXYecge0NU8T7Kd0g==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.1.tgz", + "integrity": "sha512-c9BYNxvZvxuCA5QticqfEhn3nuspUnwxIVejjO5ZTqKlkK+vQGKN3QhshHLrMHeFYyjao/E8jVnJX7ahitPM9w==", "requires": { "tslib": "^2.3.0" } diff --git a/frontend/package.json b/frontend/package.json index 21e5411..1c09893 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,7 +16,7 @@ "@angular/compiler": "~13.2.0", "@angular/core": "~13.2.0", "@angular/forms": "~13.2.0", - "@angular/material": "^13.3.0", + "@angular/material": "^13.3.1", "@angular/platform-browser": "~13.2.0", "@angular/platform-browser-dynamic": "~13.2.0", "@angular/router": "~13.2.0", -- 2.45.2 From 047d4a7dc21f982b2f6122ee86933650d7a6a955 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Mar 2022 08:07:18 +0000 Subject: [PATCH 39/91] Bump minimist from 1.2.5 to 1.2.6 in /frontend Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1eb150b..1d6746b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7642,9 +7642,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { @@ -17013,9 +17013,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { -- 2.45.2 From ef0b6800159e1c176f4d8bf21a680553b96385fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Mar 2022 09:41:06 +0000 Subject: [PATCH 40/91] Bump python-dotenv from 0.19.2 to 0.20.0 in /api Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 0.19.2 to 0.20.0. - [Release notes](https://github.com/theskumar/python-dotenv/releases) - [Changelog](https://github.com/theskumar/python-dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0) --- updated-dependencies: - dependency-name: python-dotenv dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- api/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/requirements.txt b/api/requirements.txt index 70218cf..bcc5fee 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,8 +1,8 @@ Flask~=2.0.3 -python-dotenv==0.19.2 +python-dotenv==0.20.0 uwsgi==2.0.20 Flask_SQLAlchemy==2.5.1 -python-dotenv==0.19.2 +python-dotenv==0.20.0 pymysql==1.0.2 pyjwt==2.3.0 apiflask==0.12.0 -- 2.45.2 From d41c8876568bdfb76745e2b190eacf3559b027db Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:03:29 +0100 Subject: [PATCH 41/91] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dbcb5d..d4b31d9 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,4 @@ WebEngineering2 Projekt: Aktien und News Bot für Telegram - Update auf Anfrage ## Dokumentation -- Postman-API -> docs/postman.json -- Datenbank -> database/* +-> README.md in /documentation -- 2.45.2 From 49acdcaad0e08468cea75aa8ee67601055df3a36 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:10:14 +0100 Subject: [PATCH 42/91] Create pipeline.yml --- .woodpecker/pipeline.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .woodpecker/pipeline.yml diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml new file mode 100644 index 0000000..8eb6d4b --- /dev/null +++ b/.woodpecker/pipeline.yml @@ -0,0 +1,5 @@ +pipeline: + backend: + image: golang + commands: + - echo "Test123" -- 2.45.2 From 5d67cd12730384cfc74e30902a630ff2175e9858 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:16:14 +0100 Subject: [PATCH 43/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 66 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 8eb6d4b..5f6e698 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,5 +1,67 @@ pipeline: - backend: + generate_tag: image: golang commands: - - echo "Test123" + - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags + + publish_api: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_api + dockerfile: api/Dockerfile + + publish_frontend: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_frontend + dockerfile: frontend/Dockerfile + + publish_bot: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_bot + dockerfile: telegram_bot/Dockerfile + + deploy: + image: appleboy/drone-ssh + network_mode: host + environment: + REPO: + from_secret: repo + IP: + from_secret: deploy_ip + NET: + from_secret: deploy_net + NAME: + from_secret: deploy_name + PLUGIN_HOST: + from_secret: ssh_host + PLUGIN_USERNAME: + from_secret: ssh_user + PLUGIN_PASSWORD: + from_secret: ssh_password + PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh + +branches: + include: [ main ] -- 2.45.2 From 9303943199ccdc8fc13fdfef559f7245417515ae Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:18:52 +0100 Subject: [PATCH 44/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 5f6e698..e2df389 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -63,5 +63,4 @@ pipeline: from_secret: ssh_password PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh -branches: - include: [ main ] +branches: main -- 2.45.2 From 433b6cc50dbf9cb68087644bfc2aa8a6ed1e88e7 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:19:13 +0100 Subject: [PATCH 45/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 61 ---------------------------------------- 1 file changed, 61 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index e2df389..b2df43f 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -3,64 +3,3 @@ pipeline: image: golang commands: - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags - - publish_api: - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_api - dockerfile: api/Dockerfile - - publish_frontend: - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_frontend - dockerfile: frontend/Dockerfile - - publish_bot: - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_bot - dockerfile: telegram_bot/Dockerfile - - deploy: - image: appleboy/drone-ssh - network_mode: host - environment: - REPO: - from_secret: repo - IP: - from_secret: deploy_ip - NET: - from_secret: deploy_net - NAME: - from_secret: deploy_name - PLUGIN_HOST: - from_secret: ssh_host - PLUGIN_USERNAME: - from_secret: ssh_user - PLUGIN_PASSWORD: - from_secret: ssh_password - PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh - -branches: main -- 2.45.2 From c9785d86ac972e4e1167c7955738d69f97f9d5c7 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:20:35 +0100 Subject: [PATCH 46/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index b2df43f..3d04b7e 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -3,3 +3,64 @@ pipeline: image: golang commands: - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags + + publish_api: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_api + dockerfile: api/Dockerfile + + publish_frontend: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_frontend + dockerfile: frontend/Dockerfile + + publish_bot: + image: plugins/docker + settings: + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + repo: + from_secret: repo_bot + dockerfile: telegram_bot/Dockerfile + + deploy: + image: appleboy/drone-ssh + network_mode: host + environment: + REPO: + from_secret: repo + IP: + from_secret: deploy_ip + NET: + from_secret: deploy_net + NAME: + from_secret: deploy_name + PLUGIN_HOST: + from_secret: ssh_host + PLUGIN_USERNAME: + from_secret: ssh_user + PLUGIN_PASSWORD: + from_secret: ssh_password + PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh + +branches: main -- 2.45.2 From 5acd9ee60bc3ab8ae7c65d02c2c5a8c99d6927b7 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:25:16 +0100 Subject: [PATCH 47/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 3d04b7e..6f6a4d3 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -46,21 +46,22 @@ pipeline: deploy: image: appleboy/drone-ssh network_mode: host + secrets: + - repo + target: REPO + - deploy_ip + target: IP + - deploy_net + target: NET + - deploy_name + target: NAME + - ssh_host + target: PLUGIN_HOST + - ssh_user + target: PLUGIN_USERNAME + - ssh_password + target: PLUGIN_PASSWORD environment: - REPO: - from_secret: repo - IP: - from_secret: deploy_ip - NET: - from_secret: deploy_net - NAME: - from_secret: deploy_name - PLUGIN_HOST: - from_secret: ssh_host - PLUGIN_USERNAME: - from_secret: ssh_user - PLUGIN_PASSWORD: - from_secret: ssh_password - PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh + PLUGIN_SCRIPT=/opt/docker/TelegramAktienBot/deploy.sh branches: main -- 2.45.2 From d5d5796c9b71385f07013da460cac3c9e51858a9 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:26:10 +0100 Subject: [PATCH 48/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 90 ++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 6f6a4d3..057e1d8 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -17,51 +17,51 @@ pipeline: from_secret: repo_api dockerfile: api/Dockerfile - publish_frontend: - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_frontend - dockerfile: frontend/Dockerfile +# publish_frontend: +# image: plugins/docker +# settings: +# username: +# from_secret: username +# password: +# from_secret: password +# registry: +# from_secret: registry +# repo: +# from_secret: repo_frontend +# dockerfile: frontend/Dockerfile - publish_bot: - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_bot - dockerfile: telegram_bot/Dockerfile +# publish_bot: +# image: plugins/docker +# settings: +# username: +# from_secret: username +# password: +# from_secret: password +# registry: +# from_secret: registry +# repo: +# from_secret: repo_bot +# dockerfile: telegram_bot/Dockerfile - deploy: - image: appleboy/drone-ssh - network_mode: host - secrets: - - repo - target: REPO - - deploy_ip - target: IP - - deploy_net - target: NET - - deploy_name - target: NAME - - ssh_host - target: PLUGIN_HOST - - ssh_user - target: PLUGIN_USERNAME - - ssh_password - target: PLUGIN_PASSWORD - environment: - PLUGIN_SCRIPT=/opt/docker/TelegramAktienBot/deploy.sh +# deploy: +# image: appleboy/drone-ssh +# network_mode: host +# secrets: +# - repo +# target: REPO +# - deploy_ip +# target: IP +# - deploy_net +# target: NET +# - deploy_name +# target: NAME +# - ssh_host +# target: PLUGIN_HOST +# - ssh_user +# target: PLUGIN_USERNAME +# - ssh_password +# target: PLUGIN_PASSWORD +# environment: +# PLUGIN_SCRIPT=/opt/docker/TelegramAktienBot/deploy.sh -branches: main +# branches: main -- 2.45.2 From 8209ae91667dc8e16a82dfa5bac94d0a80574e77 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:31:59 +0100 Subject: [PATCH 49/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 057e1d8..e4cabb2 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -3,6 +3,7 @@ pipeline: image: golang commands: - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags + - ls publish_api: image: plugins/docker -- 2.45.2 From 1ee0d8fdf8c5e18fcf40fd1a9a3ff48bed70653b Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:32:54 +0100 Subject: [PATCH 50/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index e4cabb2..3e63d5f 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -3,7 +3,7 @@ pipeline: image: golang commands: - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags - - ls + - ls api/ publish_api: image: plugins/docker -- 2.45.2 From 736f895542a65263efc7bd27029f8506cf751202 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:37:56 +0100 Subject: [PATCH 51/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 3e63d5f..a5ad07f 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,22 +1,22 @@ pipeline: - generate_tag: - image: golang - commands: - - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags - - ls api/ +# generate_tag: +# image: golang +# commands: +# - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags +# - ls api/ publish_api: image: plugins/docker settings: - username: + - username: from_secret: username - password: + - password: from_secret: password - registry: + - registry: from_secret: registry - repo: + - repo: from_secret: repo_api - dockerfile: api/Dockerfile + - dockerfile: api/Dockerfile # publish_frontend: # image: plugins/docker -- 2.45.2 From e3bb35fde7f041bc61e997e9438fb0d56d37aeba Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:43:18 +0100 Subject: [PATCH 52/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index a5ad07f..128c02a 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -5,18 +5,14 @@ pipeline: # - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags # - ls api/ + publish_api: - image: plugins/docker + image: woodpeckerci/plugin-docker-buildx settings: - - username: - from_secret: username - - password: - from_secret: password - - registry: - from_secret: registry - - repo: + repo: from_secret: repo_api - - dockerfile: api/Dockerfile + dockerfile: api/Dockerfile + platforms: linux/amd64 # publish_frontend: # image: plugins/docker -- 2.45.2 From 69be6a2288604ef696c441589849016ec1f60386 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:44:05 +0100 Subject: [PATCH 53/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 128c02a..b00d43a 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,10 +1,8 @@ pipeline: -# generate_tag: -# image: golang -# commands: -# - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags -# - ls api/ - + generate_tag: + image: golang + commands: + - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags publish_api: image: woodpeckerci/plugin-docker-buildx -- 2.45.2 From 173ef5e577a0c4152942c7b165d4b4807dab5f42 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:45:14 +0100 Subject: [PATCH 54/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index b00d43a..7e6ef71 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -2,7 +2,7 @@ pipeline: generate_tag: image: golang commands: - - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags + - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags publish_api: image: woodpeckerci/plugin-docker-buildx -- 2.45.2 From e0c39baf349c51ac663fd20e48a957dab25be5aa Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:47:07 +0100 Subject: [PATCH 55/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 7e6ef71..b735914 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -7,8 +7,7 @@ pipeline: publish_api: image: woodpeckerci/plugin-docker-buildx settings: - repo: - from_secret: repo_api + repo: registry.flokaiser.com/aktienbot/api dockerfile: api/Dockerfile platforms: linux/amd64 -- 2.45.2 From 4dc9c873794701fa1b119f98e9b919f0f97b0aaa Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:00:43 +0100 Subject: [PATCH 56/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index b735914..7e6ef71 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -7,7 +7,8 @@ pipeline: publish_api: image: woodpeckerci/plugin-docker-buildx settings: - repo: registry.flokaiser.com/aktienbot/api + repo: + from_secret: repo_api dockerfile: api/Dockerfile platforms: linux/amd64 -- 2.45.2 From 31f8ec5d2257988bfb3accce1edcd1b3fac795c8 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:02:20 +0100 Subject: [PATCH 57/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 7e6ef71..fbe7bf1 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -9,6 +9,12 @@ pipeline: settings: repo: from_secret: repo_api + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry dockerfile: api/Dockerfile platforms: linux/amd64 -- 2.45.2 From 1855c9966c65b205935e5c5ddabc6527f7793688 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:05:30 +0100 Subject: [PATCH 58/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 56 +++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index fbe7bf1..4c1c6b5 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -4,7 +4,7 @@ pipeline: commands: - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags - publish_api: + build_api: image: woodpeckerci/plugin-docker-buildx settings: repo: @@ -18,32 +18,34 @@ pipeline: dockerfile: api/Dockerfile platforms: linux/amd64 -# publish_frontend: -# image: plugins/docker -# settings: -# username: -# from_secret: username -# password: -# from_secret: password -# registry: -# from_secret: registry -# repo: -# from_secret: repo_frontend -# dockerfile: frontend/Dockerfile - -# publish_bot: -# image: plugins/docker -# settings: -# username: -# from_secret: username -# password: -# from_secret: password -# registry: -# from_secret: registry -# repo: -# from_secret: repo_bot -# dockerfile: telegram_bot/Dockerfile - + build_bot: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: + from_secret: repo_bot + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + dockerfile: telegram_bot/Dockerfile + platforms: linux/amd64 + + build_frontend: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: + from_secret: repo_frontend + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + dockerfile: frontend/Dockerfile + platforms: linux/amd64 + # deploy: # image: appleboy/drone-ssh # network_mode: host -- 2.45.2 From c5c9a70df981f346745b06c8947360485b643d98 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:09:57 +0100 Subject: [PATCH 59/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 41 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 4c1c6b5..611b424 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -46,25 +46,24 @@ pipeline: dockerfile: frontend/Dockerfile platforms: linux/amd64 -# deploy: -# image: appleboy/drone-ssh -# network_mode: host -# secrets: -# - repo -# target: REPO -# - deploy_ip -# target: IP -# - deploy_net -# target: NET -# - deploy_name -# target: NAME -# - ssh_host -# target: PLUGIN_HOST -# - ssh_user -# target: PLUGIN_USERNAME -# - ssh_password -# target: PLUGIN_PASSWORD -# environment: -# PLUGIN_SCRIPT=/opt/docker/TelegramAktienBot/deploy.sh + deploy: + image: appleboy/drone-ssh + network_mode: host + settings: + REPO: + from_secret: repo + IP: + from_secret: deploy_ip + NET: + from_secret: deploy_net + NAME: + from_secret: deploy_name + PLUGIN_HOST: + from_secret: ssh_host + PLUGIN_USERNAME: + from_secret: ssh_user + PLUGIN_PASSWORD: + from_secret: ssh_password + PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh -# branches: main +branches: main -- 2.45.2 From f97354cfd1545f3afb5fcd6bced5efc7a500da60 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:16:55 +0100 Subject: [PATCH 60/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 86 ++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 611b424..83ce309 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,50 +1,50 @@ pipeline: - generate_tag: - image: golang - commands: - - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags +# generate_tag: +# image: golang +# commands: +# - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags - build_api: - image: woodpeckerci/plugin-docker-buildx - settings: - repo: - from_secret: repo_api - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - dockerfile: api/Dockerfile - platforms: linux/amd64 +# build_api: +# image: woodpeckerci/plugin-docker-buildx +# settings: +# repo: +# from_secret: repo_api +# username: +# from_secret: username +# password: +# from_secret: password +# registry: +# from_secret: registry +# dockerfile: api/Dockerfile +# platforms: linux/amd64 - build_bot: - image: woodpeckerci/plugin-docker-buildx - settings: - repo: - from_secret: repo_bot - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - dockerfile: telegram_bot/Dockerfile - platforms: linux/amd64 +# build_bot: +# image: woodpeckerci/plugin-docker-buildx +# settings: +# repo: +# from_secret: repo_bot +# username: +# from_secret: username +# password: +# from_secret: password +# registry: +# from_secret: registry +# dockerfile: telegram_bot/Dockerfile +# platforms: linux/amd64 - build_frontend: - image: woodpeckerci/plugin-docker-buildx - settings: - repo: - from_secret: repo_frontend - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - dockerfile: frontend/Dockerfile - platforms: linux/amd64 +# build_frontend: +# image: woodpeckerci/plugin-docker-buildx +# settings: +# repo: +# from_secret: repo_frontend +# username: +# from_secret: username +# password: +# from_secret: password +# registry: +# from_secret: registry +# dockerfile: frontend/Dockerfile +# platforms: linux/amd64 deploy: image: appleboy/drone-ssh -- 2.45.2 From 9883ad6799b259d7fc46cdc9829b964a31c019db Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:17:34 +0100 Subject: [PATCH 61/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 83ce309..ba86a71 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -58,7 +58,7 @@ pipeline: from_secret: deploy_net NAME: from_secret: deploy_name - PLUGIN_HOST: + plugin_host: from_secret: ssh_host PLUGIN_USERNAME: from_secret: ssh_user -- 2.45.2 From 74b7a18ec45fb54771c5a390c6b485909f8c2764 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:18:40 +0100 Subject: [PATCH 62/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index ba86a71..4f32859 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -58,12 +58,12 @@ pipeline: from_secret: deploy_net NAME: from_secret: deploy_name - plugin_host: + host: from_secret: ssh_host - PLUGIN_USERNAME: + username: from_secret: ssh_user - PLUGIN_PASSWORD: + password: from_secret: ssh_password - PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh + script: /opt/docker/TelegramAktienBot/deploy.sh branches: main -- 2.45.2 From edebed53baa4626529a1a8af3aa43037f177c470 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:20:56 +0100 Subject: [PATCH 63/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 4f32859..335373f 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -49,21 +49,15 @@ pipeline: deploy: image: appleboy/drone-ssh network_mode: host - settings: - REPO: - from_secret: repo - IP: - from_secret: deploy_ip - NET: - from_secret: deploy_net - NAME: - from_secret: deploy_name + settings: host: from_secret: ssh_host username: from_secret: ssh_user password: from_secret: ssh_password - script: /opt/docker/TelegramAktienBot/deploy.sh + script: + - /opt/docker/TelegramAktienBot/deploy.sh + - ls branches: main -- 2.45.2 From 84c945b3d8cf4845b7123256d85c718ca3e0637b Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:21:26 +0100 Subject: [PATCH 64/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 87 ++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 335373f..84edc74 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,50 +1,50 @@ pipeline: -# generate_tag: -# image: golang -# commands: -# - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags + generate_tag: + image: golang + commands: + - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags -# build_api: -# image: woodpeckerci/plugin-docker-buildx -# settings: -# repo: -# from_secret: repo_api -# username: -# from_secret: username -# password: -# from_secret: password -# registry: -# from_secret: registry -# dockerfile: api/Dockerfile -# platforms: linux/amd64 + build_api: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: + from_secret: repo_api + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + dockerfile: api/Dockerfile + platforms: linux/amd64 -# build_bot: -# image: woodpeckerci/plugin-docker-buildx -# settings: -# repo: -# from_secret: repo_bot -# username: -# from_secret: username -# password: -# from_secret: password -# registry: -# from_secret: registry -# dockerfile: telegram_bot/Dockerfile -# platforms: linux/amd64 + build_bot: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: + from_secret: repo_bot + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + dockerfile: telegram_bot/Dockerfile + platforms: linux/amd64 -# build_frontend: -# image: woodpeckerci/plugin-docker-buildx -# settings: -# repo: -# from_secret: repo_frontend -# username: -# from_secret: username -# password: -# from_secret: password -# registry: -# from_secret: registry -# dockerfile: frontend/Dockerfile -# platforms: linux/amd64 + build_frontend: + image: woodpeckerci/plugin-docker-buildx + settings: + repo: + from_secret: repo_frontend + username: + from_secret: username + password: + from_secret: password + registry: + from_secret: registry + dockerfile: frontend/Dockerfile + platforms: linux/amd64 deploy: image: appleboy/drone-ssh @@ -58,6 +58,5 @@ pipeline: from_secret: ssh_password script: - /opt/docker/TelegramAktienBot/deploy.sh - - ls branches: main -- 2.45.2 From f50ab0fe7b212350ab8bec54270017453a328cb3 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:22:36 +0100 Subject: [PATCH 65/91] Delete .drone.yml --- .drone.yml | 77 ------------------------------------------------------ 1 file changed, 77 deletions(-) delete mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 62eaf5b..0000000 --- a/.drone.yml +++ /dev/null @@ -1,77 +0,0 @@ -kind: pipeline -type: docker -name: linux-amd64 - -platform: - arch: amd64 - os: linux - -steps: -- name: generate_tag - image: golang - commands: - - echo -n "${DRONE_BRANCH//\//-}-${DRONE_COMMIT_SHA:0:8}, latest" > .tags - - -- name: publish_api - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_api - dockerfile: api/Dockerfile - -- name: publish_frontend - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_frontend - dockerfile: frontend/Dockerfile - -- name: publish_bot - image: plugins/docker - settings: - username: - from_secret: username - password: - from_secret: password - registry: - from_secret: registry - repo: - from_secret: repo_bot - dockerfile: telegram_bot/Dockerfile - -- name: deploy - image: appleboy/drone-ssh - network_mode: host - environment: - REPO: - from_secret: repo - IP: - from_secret: deploy_ip - NET: - from_secret: deploy_net - NAME: - from_secret: deploy_name - PLUGIN_HOST: - from_secret: ssh_host - PLUGIN_USERNAME: - from_secret: ssh_user - PLUGIN_PASSWORD: - from_secret: ssh_password - PLUGIN_SCRIPT: /opt/docker/TelegramAktienBot/deploy.sh - -trigger: - branch: - - main -- 2.45.2 From 6e7cf5df90139e60caa767d0bb6fe0347eb59c84 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Fri, 25 Mar 2022 12:31:19 +0100 Subject: [PATCH 66/91] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4b31d9..022b2bc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://drone.flokaiser.com/api/badges/H4CK3R-01/TelegramAktienBot/status.svg?ref=main)](https://drone.flokaiser.com/H4CK3R-01/TelegramAktienBot) +[![Build Status](https://woodpecker.flokaiser.com/api/badges/WebEngineering2/TelegramAktienBot/status.svg)](https://woodpecker.flokaiser.com/WebEngineering2/TelegramAktienBot/) # TelegramAktienBot WebEngineering2 Projekt: Aktien und News Bot für Telegram -- 2.45.2 From b3f76ec8bf7edf55857b3e7597d601f3a7f5a71b Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 10:08:43 +0200 Subject: [PATCH 67/91] Improved pipeline.yml --- .woodpecker/pipeline.yml | 44 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 84edc74..e2406ae 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -17,6 +17,23 @@ pipeline: from_secret: registry dockerfile: api/Dockerfile platforms: linux/amd64 + when: + path: "api/*" + + deploy_api: + image: appleboy/drone-ssh + network_mode: host + settings: + host: + from_secret: ssh_host + username: + from_secret: ssh_user + password: + from_secret: ssh_password + script: + - /opt/docker/TelegramAktienBot/deploy_api.sh + when: + path: "api/*" build_bot: image: woodpeckerci/plugin-docker-buildx @@ -31,7 +48,24 @@ pipeline: from_secret: registry dockerfile: telegram_bot/Dockerfile platforms: linux/amd64 - + when: + path: "telegram_bot/*" + + deploy_bot: + image: appleboy/drone-ssh + network_mode: host + settings: + host: + from_secret: ssh_host + username: + from_secret: ssh_user + password: + from_secret: ssh_password + script: + - /opt/docker/TelegramAktienBot/deploy_bot.sh + when: + path: "telegram_bot/*" + build_frontend: image: woodpeckerci/plugin-docker-buildx settings: @@ -45,8 +79,10 @@ pipeline: from_secret: registry dockerfile: frontend/Dockerfile platforms: linux/amd64 + when: + path: "frontend/*" - deploy: + deploy_frontend: image: appleboy/drone-ssh network_mode: host settings: @@ -57,6 +93,8 @@ pipeline: password: from_secret: ssh_password script: - - /opt/docker/TelegramAktienBot/deploy.sh + - /opt/docker/TelegramAktienBot/deploy_frontend.sh + when: + path: "frontend/*" branches: main -- 2.45.2 From 1fe1e0e9cfd47085062ee88dcc6532cd5a628f2f Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 10:42:53 +0200 Subject: [PATCH 68/91] Create bot and admin user when creating tables --- api/app.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/api/app.py b/api/app.py index 933b471..955cc18 100644 --- a/api/app.py +++ b/api/app.py @@ -1,8 +1,11 @@ +import os + from apiflask import APIFlask from dotenv import load_dotenv from flask_cors import CORS +from api.helper_functions import hash_password from models import * from api_blueprint_keyword import keyword_blueprint from api_blueprint_shares import shares_blueprint @@ -35,6 +38,24 @@ def create_app(): def init_database(): db.create_all() + if os.getenv("BOT_USER") is not None and os.getenv("BOT_PASSWORD") is not None: + bot = User( + username=os.getenv("BOT_USER"), + password=hash_password(os.getenv("BOT_PASSWORD")), + admin=False + ) + db.session.add(bot) + db.session.commit() + + if os.getenv("ADMIN_USER") is not None and os.getenv("ADMIN_PASSWORD") is not None: + admin = User( + username=os.getenv("ADMIN_USER"), + password=hash_password(os.getenv("ADMIN_PASSWORD")), + admin=True + ) + db.session.add(admin) + db.session.commit() + return application -- 2.45.2 From 2ba8a9bd13339b656e0c59e6786b24148be62df9 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 10:55:48 +0200 Subject: [PATCH 69/91] Check if user already exist --- api/app.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/api/app.py b/api/app.py index 955cc18..da31695 100644 --- a/api/app.py +++ b/api/app.py @@ -39,22 +39,24 @@ def create_app(): db.create_all() if os.getenv("BOT_USER") is not None and os.getenv("BOT_PASSWORD") is not None: - bot = User( - username=os.getenv("BOT_USER"), - password=hash_password(os.getenv("BOT_PASSWORD")), - admin=False - ) - db.session.add(bot) - db.session.commit() + if db.session.query(User).filter_by(username=os.getenv("BOT_USER")).first() is None: # Check if user already exist + bot = User( + username=os.getenv("BOT_USER"), + password=hash_password(os.getenv("BOT_PASSWORD")), + admin=False + ) + db.session.add(bot) + db.session.commit() if os.getenv("ADMIN_USER") is not None and os.getenv("ADMIN_PASSWORD") is not None: - admin = User( - username=os.getenv("ADMIN_USER"), - password=hash_password(os.getenv("ADMIN_PASSWORD")), - admin=True - ) - db.session.add(admin) - db.session.commit() + if db.session.query(User).filter_by(username=os.getenv("ADMIN_USER")).first() is None: # Check if user already exist + admin = User( + username=os.getenv("ADMIN_USER"), + password=hash_password(os.getenv("ADMIN_PASSWORD")), + admin=True + ) + db.session.add(admin) + db.session.commit() return application -- 2.45.2 From 12d59d69ff80641855bfaa2bd52c8b45d053370d Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 17:23:33 +0200 Subject: [PATCH 70/91] Changed database model --- api/api_blueprint_keyword.py | 25 +++++---- api/api_blueprint_portfolio.py | 23 ++++---- api/api_blueprint_shares.py | 25 +++++---- api/api_blueprint_transactions.py | 14 ++--- api/api_blueprint_user.py | 89 +++++++++++++++---------------- api/app.py | 18 +++---- api/auth.py | 2 +- api/helper_functions.py | 37 ++++++------- api/models.py | 12 ++--- api/schema.py | 45 +++++++++++++--- 10 files changed, 160 insertions(+), 130 deletions(-) diff --git a/api/api_blueprint_keyword.py b/api/api_blueprint_keyword.py index 232a97b..a22abb3 100644 --- a/api/api_blueprint_keyword.py +++ b/api/api_blueprint_keyword.py @@ -3,7 +3,7 @@ import os from apiflask import APIBlueprint, abort from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response +from helper_functions import make_response, get_email_or_abort_401 from auth import auth from schema import KeywordResponseSchema, KeywordSchema, DeleteSuccessfulSchema from models import Keyword @@ -18,17 +18,17 @@ __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file @keyword_blueprint.auth_required(auth) @keyword_blueprint.doc(summary="Add new keyword", description="Adds new keyword for current user") def add_keyword(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() check_if_keyword_data_exists(data) key = data['keyword'] - check_keyword = db.session.query(Keyword).filter_by(keyword=key, user_id=get_user_id_from_username(username)).first() + check_keyword = db.session.query(Keyword).filter_by(keyword=key, email=email).first() if check_keyword is None: # Keyword doesn't exist yet for this user new_keyword = Keyword( - user_id=get_user_id_from_username(username), + email=email, keyword=key ) db.session.add(new_keyword) @@ -45,16 +45,21 @@ def add_keyword(data): @keyword_blueprint.auth_required(auth) @keyword_blueprint.doc(summary="Removes existing keyword", description="Removes existing keyword for current user") def remove_keyword(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() check_if_keyword_data_exists(data) key = data['keyword'] - db.session.query(Keyword).filter_by(keyword=key, user_id=get_user_id_from_username(username)).delete() - db.session.commit() + check_keyword = db.session.query(Keyword).filter_by(keyword=key, email=email).first() - return make_response({}, 200, "Successfully removed keyword") + if check_keyword is None: + return make_response({}, 500, "Keyword doesn't exist for this user") + else: + db.session.query(Keyword).filter_by(keyword=key, email=email).delete() + db.session.commit() + + return make_response({}, 200, "Successfully removed keyword") @keyword_blueprint.route('/keywords', methods=['GET']) @@ -62,10 +67,10 @@ def remove_keyword(data): @keyword_blueprint.auth_required(auth) @keyword_blueprint.doc(summary="Returns all keywords", description="Returns all keywords for current user") def get_keywords(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() return_keywords = [] - keywords = db.session.query(Keyword).filter_by(user_id=get_user_id_from_username(username)).all() + keywords = db.session.query(Keyword).filter_by(email=email).all() if keywords is not None: for row in keywords: diff --git a/api/api_blueprint_portfolio.py b/api/api_blueprint_portfolio.py index 5970ced..b6ecea3 100644 --- a/api/api_blueprint_portfolio.py +++ b/api/api_blueprint_portfolio.py @@ -2,9 +2,9 @@ import os from apiflask import APIBlueprint +from api.schema import PortfolioResponseSchema from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response -from models import Transaction +from helper_functions import make_response, get_email_or_abort_401 from auth import auth portfolio_blueprint = APIBlueprint('portfolio', __name__, url_prefix='/api') @@ -12,21 +12,22 @@ __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file @portfolio_blueprint.route('/portfolio', methods=['GET']) -@portfolio_blueprint.output(200) +@portfolio_blueprint.output(PortfolioResponseSchema(many=True), 200) @portfolio_blueprint.auth_required(auth) @portfolio_blueprint.doc(summary="Returns portfolio", description="Returns all shares of current user") def get_portfolio(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() - return_portfolio = {} - transactions = db.session.query(Transaction).filter_by(user_id=get_user_id_from_username(username)).all() + return_portfolio = [] + transactions = db.session.execute("SELECT symbol, SUM(count), SUM(price), MAX(time) FROM `transactions` WHERE email = '" + email + "' GROUP BY symbol;").all() if transactions is not None: for row in transactions: - if row.symbol in return_portfolio: - return_portfolio[row.symbol]['count'] += row.count - return_portfolio[row.symbol]['last_transaction'] = row.time - else: - return_portfolio[row.symbol] = {"count": row.count, "last_transaction": row.time} + return_portfolio.append({ + "symbol": row[0], + "count": row[1], + # "price": row[2], + "last_transaction": row[3] + }) return make_response(return_portfolio, 200, "Successfully loaded symbols") diff --git a/api/api_blueprint_shares.py b/api/api_blueprint_shares.py index 3e18e8c..1c7c785 100644 --- a/api/api_blueprint_shares.py +++ b/api/api_blueprint_shares.py @@ -4,7 +4,7 @@ from apiflask import APIBlueprint, abort from auth import auth from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response +from helper_functions import make_response, get_email_or_abort_401 from models import Share from schema import SymbolSchema, SymbolResponseSchema, DeleteSuccessfulSchema @@ -18,17 +18,17 @@ __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file @shares_blueprint.auth_required(auth) @shares_blueprint.doc(summary="Add new symbol", description="Adds new symbol for current user") def add_symbol(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() check_if_symbol_data_exists(data) symbol = data['symbol'] - check_share = db.session.query(Share).filter_by(symbol=symbol, user_id=get_user_id_from_username(username)).first() + check_share = db.session.query(Share).filter_by(symbol=symbol, email=email).first() if check_share is None: # Keyword doesn't exist yet for this user new_symbol = Share( - user_id=get_user_id_from_username(username), + email=email, symbol=symbol ) db.session.add(new_symbol) @@ -45,16 +45,21 @@ def add_symbol(data): @shares_blueprint.auth_required(auth) @shares_blueprint.doc(summary="Removes existing symbol", description="Removes existing symbol for current user") def remove_symbol(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() check_if_symbol_data_exists(data) symbol = data['symbol'] - db.session.query(Share).filter_by(symbol=symbol, user_id=get_user_id_from_username(username)).delete() - db.session.commit() + check_share = db.session.query(Share).filter_by(symbol=symbol, email=email).first() - return make_response({}, 200, "Successfully removed symbol") + if check_share is None: + return make_response({}, 500, "Symbol doesn't exist for this user") + else: + db.session.query(Share).filter_by(symbol=symbol, email=email).delete() + db.session.commit() + + return make_response({}, 200, "Successfully removed symbol") @shares_blueprint.route('/shares', methods=['GET']) @@ -62,10 +67,10 @@ def remove_symbol(data): @shares_blueprint.auth_required(auth) @shares_blueprint.doc(summary="Returns all symbols", description="Returns all symbols for current user") def get_symbol(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() return_symbols = [] - symbols = db.session.query(Share).filter_by(user_id=get_user_id_from_username(username)).all() + symbols = db.session.query(Share).filter_by(email=email).all() if symbols is not None: for row in symbols: diff --git a/api/api_blueprint_transactions.py b/api/api_blueprint_transactions.py index b0e58fc..054a032 100644 --- a/api/api_blueprint_transactions.py +++ b/api/api_blueprint_transactions.py @@ -4,9 +4,9 @@ import datetime from apiflask import abort, APIBlueprint from db import db -from helper_functions import get_user_id_from_username, get_username_or_abort_401, make_response +from helper_functions import make_response, get_email_or_abort_401 from models import Transaction -from schema import TransactionSchema +from schema import TransactionSchema, TransactionResponseSchema from auth import auth transaction_blueprint = APIBlueprint('transaction', __name__, url_prefix='/api') @@ -14,17 +14,17 @@ __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file @transaction_blueprint.route('/transaction', methods=['POST']) -@transaction_blueprint.output((), 200) +@transaction_blueprint.output(TransactionResponseSchema(), 200) @transaction_blueprint.input(schema=TransactionSchema) @transaction_blueprint.auth_required(auth) @transaction_blueprint.doc(summary="Adds new transaction", description="Adds new transaction for current user") def add_transaction(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() check_if_transaction_data_exists(data) new_transaction = Transaction( - user_id=get_user_id_from_username(username), + email=email, symbol=data['symbol'], time=datetime.datetime.strptime(data['time'], '%Y-%m-%dT%H:%M:%S.%fZ'), count=data['count'], @@ -41,10 +41,10 @@ def add_transaction(data): @transaction_blueprint.auth_required(auth) @transaction_blueprint.doc(summary="Returns all transactions", description="Returns all transactions for current user") def get_transaction(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() return_transactions = [] - transactions = db.session.query(Transaction).filter_by(user_id=get_user_id_from_username(username)).all() + transactions = db.session.query(Transaction).filter_by(email=email).all() if transactions is not None: for row in transactions: diff --git a/api/api_blueprint_user.py b/api/api_blueprint_user.py index 747a82f..0afd873 100644 --- a/api/api_blueprint_user.py +++ b/api/api_blueprint_user.py @@ -5,9 +5,9 @@ import jwt from apiflask import APIBlueprint, abort from db import db -from helper_functions import check_password, hash_password, get_username_or_abort_401, abort_if_no_admin, make_response +from helper_functions import check_password, hash_password, abort_if_no_admin, make_response, get_email_or_abort_401 from models import User -from schema import UsersSchema, TokenSchema, LoginDataSchema, AdminDataSchema, DeleteUserSchema +from schema import UsersSchema, TokenSchema, LoginDataSchema, AdminDataSchema, DeleteUserSchema, RegisterDataSchema, UpdateUserDataSchema from auth import auth users_blueprint = APIBlueprint('users', __name__, url_prefix='/api') @@ -33,9 +33,9 @@ def users(): @users_blueprint.auth_required(auth) @users_blueprint.doc(summary="Get current user", description="Returns current user") def user(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() - res = db.session.query(User).filter_by(username=username).first().as_dict() + res = db.session.query(User).filter_by(email=email).first().as_dict() return make_response(res, 200, "Successfully received current user data") @@ -45,40 +45,45 @@ def user(): @users_blueprint.input(schema=LoginDataSchema) @users_blueprint.doc(summary="Login", description="Returns jwt token if username and password match, otherwise returns error") def login(data): - check_if_user_data_exists(data) + check_if_email_data_exists(data) + check_if_password_data_exists(data) - username = data['username'] + email = data['email'] password = data['password'] - query_user = db.session.query(User).filter_by(username=username).first() + query_user = db.session.query(User).filter_by(email=email).first() - if query_user is None: # Username doesn't exist + if query_user is None: # email doesn't exist abort(500, message="Unable to login") if not check_password(query_user.password, password): # Password incorrect abort(500, message="Unable to login") - token = jwt.encode({'username': query_user.username, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=45)}, os.getenv('SECRET_KEY'), "HS256") + token = jwt.encode({'email': query_user.email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=45)}, os.getenv('SECRET_KEY'), "HS256") return make_response({"token": token}, 200, "Successfully logged in") @users_blueprint.route('/user/register', methods=['POST']) @users_blueprint.output(UsersSchema(), 200) -@users_blueprint.input(schema=LoginDataSchema) +@users_blueprint.input(schema=RegisterDataSchema) @users_blueprint.doc(summary="Register", description="Registers user") def register(data): - check_if_user_data_exists(data) + check_if_email_data_exists(data) + check_if_username_data_exists(data) + check_if_password_data_exists(data) + email = data['email'] username = data['username'] password = data['password'] - query_user = db.session.query(User).filter_by(username=username).first() + query_user = db.session.query(User).filter_by(email=email).first() if query_user is not None: # Username already exist - abort(500, message="Username already exist") + abort(500, message="Email already exist") new_user = User( + email=email, username=username, password=hash_password(password), admin=False @@ -91,26 +96,21 @@ def register(data): @users_blueprint.route('/user', methods=['PUT']) @users_blueprint.output({}, 200) -@users_blueprint.input(schema=LoginDataSchema) +@users_blueprint.input(schema=UpdateUserDataSchema) @users_blueprint.auth_required(auth) @users_blueprint.doc(summary="Update user", description="Changes password and/or username of current user") def update_user(data): - username = get_username_or_abort_401() + email = get_email_or_abort_401() - check_if_user_data_exists(data) - - new_username = data['username'] - new_password = data['password'] - - query_user = db.session.query(User).filter_by(username=username).first() + query_user = db.session.query(User).filter_by(email=email).first() if query_user is None: # Username doesn't exist abort(500, message="Unable to login") - if new_password is not None: - query_user.password = hash_password(new_password) - if new_username is not None: - query_user.username = new_username + if "password" in data and data['password'] is not None: + query_user.password = hash_password(data['password']) + if "username" in data and data['username'] is not None: + query_user.username = data['username'] db.session.commit() @@ -125,12 +125,13 @@ def update_user(data): def set_admin(data): abort_if_no_admin() # Only admin users can do this + check_if_email_data_exists(data) check_if_admin_data_exists(data) - username = data['username'] + email = data['email'] admin = data['admin'] - query_user = db.session.query(User).filter_by(username=username).first() + query_user = db.session.query(User).filter_by(email=email).first() if query_user is None: # Username doesn't exist abort(500, message="Unable to login") @@ -147,29 +148,31 @@ def set_admin(data): @users_blueprint.auth_required(auth) @users_blueprint.doc(summary="Delete user", description="Deletes user by username") def delete_user(data): - check_if_delete_data_exists(data) + check_if_email_data_exists(data) - username = data['username'] + email = data['email'] - if username == get_username_or_abort_401(): # Username is same as current user - db.session.query(User).filter_by(username=username).delete() + if email == get_email_or_abort_401(): # Username is same as current user + db.session.query(User).filter_by(email=email).delete() db.session.commit() else: # Delete different user than my user -> only admin users abort_if_no_admin() - db.session.query(User).filter_by(username=username).delete() + db.session.query(User).filter_by(email=email).delete() db.session.commit() return make_response({}, 200, "Successfully removed user") -def check_if_user_data_exists(data): - if "username" not in data: - abort(400, message="Username missing") +def check_if_email_data_exists(data): + if "email" not in data: + abort(400, message="Email missing") - if data['username'] == "" or data['username'] is None: - abort(400, message="Username missing") + if data['email'] == "" or data['email'] is None: + abort(400, message="Email missing") + +def check_if_password_data_exists(data): if "password" not in data: abort(400, message="Password missing") @@ -177,23 +180,17 @@ def check_if_user_data_exists(data): abort(400, message="Password missing") -def check_if_admin_data_exists(data): +def check_if_username_data_exists(data): if "username" not in data: abort(400, message="Username missing") if data['username'] == "" or data['username'] is None: abort(400, message="Username missing") + +def check_if_admin_data_exists(data): if "admin" not in data: abort(400, message="Admin state missing") if data['admin'] == "" or data['admin'] is None: abort(400, message="Admin state missing") - - -def check_if_delete_data_exists(data): - if "username" not in data: - abort(400, message="Username missing") - - if data['username'] == "" or data['username'] is None: - abort(400, message="Username missing") diff --git a/api/app.py b/api/app.py index da31695..4e1dfa3 100644 --- a/api/app.py +++ b/api/app.py @@ -7,11 +7,7 @@ from flask_cors import CORS from api.helper_functions import hash_password from models import * -from api_blueprint_keyword import keyword_blueprint -from api_blueprint_shares import shares_blueprint from api_blueprint_user import users_blueprint -from api_blueprint_transactions import transaction_blueprint -from api_blueprint_portfolio import portfolio_blueprint def create_app(): @@ -38,20 +34,22 @@ def create_app(): def init_database(): db.create_all() - if os.getenv("BOT_USER") is not None and os.getenv("BOT_PASSWORD") is not None: - if db.session.query(User).filter_by(username=os.getenv("BOT_USER")).first() is None: # Check if user already exist + if os.getenv("BOT_EMAIL") is not None and os.getenv("BOT_USERNAME") is not None and os.getenv("BOT_PASSWORD") is not None: + if db.session.query(User).filter_by(email=os.getenv("BOT_EMAIL")).first() is None: # Check if user already exist bot = User( - username=os.getenv("BOT_USER"), + email=os.getenv("BOT_EMAIL"), + username=os.getenv("BOT_USERNAME"), password=hash_password(os.getenv("BOT_PASSWORD")), admin=False ) db.session.add(bot) db.session.commit() - if os.getenv("ADMIN_USER") is not None and os.getenv("ADMIN_PASSWORD") is not None: - if db.session.query(User).filter_by(username=os.getenv("ADMIN_USER")).first() is None: # Check if user already exist + if os.getenv("ADMIN_EMAIL") is not None and os.getenv("ADMIN_USERNAME") is not None and os.getenv("ADMIN_PASSWORD") is not None: + if db.session.query(User).filter_by(email=os.getenv("ADMIN_EMAIL")).first() is None: # Check if user already exist admin = User( - username=os.getenv("ADMIN_USER"), + email=os.getenv("ADMIN_EMAIL"), + username=os.getenv("ADMIN_USERNAME"), password=hash_password(os.getenv("ADMIN_PASSWORD")), admin=True ) diff --git a/api/auth.py b/api/auth.py index 8096012..f13eda3 100644 --- a/api/auth.py +++ b/api/auth.py @@ -17,5 +17,5 @@ def verify_token(token): try: jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"]) return True - except jwt.exceptions.DecodeError: + except: return False diff --git a/api/helper_functions.py b/api/helper_functions.py index 59991c6..6eca7a5 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -32,53 +32,46 @@ def extract_token_data(token): if token is not None: try: return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"]) - except jwt.exceptions.DecodeError: + except: return None else: return None -def get_username_from_token_data(): +def get_email_from_token_data(): if 'Authorization' in request.headers: token = request.headers['Authorization'].split(" ")[1] if token is not None: if ':' in token: # Maybe bot token, check if token valid and return username after ":" then - username = token.split(":")[1] + email = token.split(":")[1] token = token.split(":")[0] try: - if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['username'] == "bot": - return username + if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] == os.getenv("BOT_USER"): + return email else: return None - except jwt.exceptions.DecodeError: + except: return None else: # "Normal" token, extract username from token try: - return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['username'] - except jwt.exceptions.DecodeError: + return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] + except: return None return None -def get_user_id_from_username(username): - if username is not None: - return db.session.query(User).filter_by(username=username).first().user_id - else: - return None - - -def get_username_or_abort_401(): +def get_email_or_abort_401(): # get username from jwt token - username = get_username_from_token_data() + email = get_email_from_token_data() - if username is None: # If token not provided or invalid -> return 401 code + if email is None: # If token not provided or invalid -> return 401 code abort(401, message="Unable to login") - return username + return email def abort_if_no_admin(): @@ -87,10 +80,10 @@ def abort_if_no_admin(): def is_user_admin(): - username = get_username_or_abort_401() + email = get_email_or_abort_401() - return db.session.query(User).filter_by(username=username).first().admin + return db.session.query(User).filter_by(email=email).first().admin def make_response(data, status=200, text=""): - return jsonify({"status": status, "text": text, "data": {"token": data}}) + return jsonify({"status": status, "text": text, "data": data}) diff --git a/api/models.py b/api/models.py index 59e4287..20c4830 100644 --- a/api/models.py +++ b/api/models.py @@ -3,10 +3,10 @@ from db import db class User(db.Model): __tablename__ = 'users' - username = db.Column('username', db.String(255), nullable=False, unique=True) + email = db.Column('email', db.String(255), primary_key=True, nullable=False, unique=True) password = db.Column('password', db.String(255), nullable=False, server_default='') - user_id = db.Column('user_id', db.Integer(), primary_key=True) - telegram_name = db.Column('telegram_name', db.String(255), nullable=True, server_default='') + username = db.Column('username', db.String(255), nullable=False, server_default='') + telegram_user_id = db.Column('telegram_user_id', db.String(255), nullable=True, server_default='') admin = db.Column('admin', db.Boolean(), server_default='0') def as_dict(self): @@ -16,7 +16,7 @@ class User(db.Model): class Transaction(db.Model): __tablename__ = 'transactions' t_id = db.Column('t_id', db.Integer(), nullable=False, unique=True, primary_key=True) - user_id = db.Column('user_id', db.Integer(), db.ForeignKey('users.user_id', ondelete='CASCADE')) + email = db.Column('email', db.String(255), db.ForeignKey('users.email', ondelete='CASCADE')) symbol = db.Column('symbol', db.String(255)) time = db.Column('time', db.DateTime()) count = db.Column('count', db.Integer()) @@ -29,7 +29,7 @@ class Transaction(db.Model): class Keyword(db.Model): __tablename__ = 'keywords' s_id = db.Column('s_id', db.Integer(), nullable=False, unique=True, primary_key=True) - user_id = db.Column('user_id', db.Integer(), db.ForeignKey('users.user_id', ondelete='CASCADE')) + email = db.Column('email', db.String(255), db.ForeignKey('users.email', ondelete='CASCADE')) keyword = db.Column('keyword', db.String(255)) def as_dict(self): @@ -39,7 +39,7 @@ class Keyword(db.Model): class Share(db.Model): __tablename__ = 'shares' a_id = db.Column('a_id', db.Integer(), nullable=False, unique=True, primary_key=True) - user_id = db.Column('user_id', db.Integer(), db.ForeignKey('users.user_id', ondelete='CASCADE')) + email = db.Column('email', db.String(255), db.ForeignKey('users.email', ondelete='CASCADE')) symbol = db.Column('symbol', db.String(255)) def as_dict(self): diff --git a/api/schema.py b/api/schema.py index bb1371a..67fdf65 100644 --- a/api/schema.py +++ b/api/schema.py @@ -1,5 +1,7 @@ from apiflask import Schema from apiflask.fields import Integer, String, Boolean, Field, Float +from marshmallow import validate +from marshmallow.fields import Email class BaseResponseSchema(Schema): @@ -11,13 +13,13 @@ class BaseResponseSchema(Schema): class UsersSchema(Schema): admin = Boolean() password = String() - telegram_name = String() - user_id = Integer() username = String() + telegram_user_id = String() + email = Email() class AdminDataSchema(Schema): - username = String() + email = Email() admin = Boolean() @@ -26,12 +28,23 @@ class TokenSchema(Schema): class LoginDataSchema(Schema): + email = Email() + password = String() + + +class RegisterDataSchema(Schema): + email = Email() username = String() password = String() +class UpdateUserDataSchema(Schema): + username = String(required=False) + password = String(required=False) + + class DeleteUserSchema(Schema): - username = String() + email = Email() class ChangePasswordSchema(Schema): @@ -50,7 +63,7 @@ class KeywordSchema(Schema): class KeywordResponseSchema(Schema): keyword = String() s_id = Integer() - user_id = Integer() + email = Email() class SymbolSchema(Schema): @@ -60,7 +73,7 @@ class SymbolSchema(Schema): class SymbolResponseSchema(Schema): symbol = String() s_id = Integer() - user_id = Integer() + email = Email() class PortfolioShareResponseSchema(Schema): @@ -69,12 +82,30 @@ class PortfolioShareResponseSchema(Schema): class TransactionSchema(Schema): - user_id = Integer() + symbol = String() + time = String(validate=validate.Regexp(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z")) + count = Integer() + price = Float() + + +class TransactionResponseSchema(Schema): + email = Email() symbol = String() time = String() count = Integer() price = Float() +class TelegramIdSchema(Schema): + telegram_user_id = String() + + +class PortfolioResponseSchema(Schema): + symbol = String() + last_transaction = String() + count = Integer() + # price = Float() + + class DeleteSuccessfulSchema(Schema): pass -- 2.45.2 From 62d66c1d6f4093ea5db25b72ab33b83c369e19b5 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 17:24:26 +0200 Subject: [PATCH 71/91] Added endpoint to set telegram user id --- api/api_blueprint_telegram.py | 42 +++++++++++++++++++++++++++++++++++ api/app.py | 6 +++++ 2 files changed, 48 insertions(+) create mode 100644 api/api_blueprint_telegram.py diff --git a/api/api_blueprint_telegram.py b/api/api_blueprint_telegram.py new file mode 100644 index 0000000..1aa6f6e --- /dev/null +++ b/api/api_blueprint_telegram.py @@ -0,0 +1,42 @@ +import os + +from apiflask import APIBlueprint, abort + +from db import db +from helper_functions import make_response, get_email_or_abort_401 +from auth import auth +from schema import TelegramIdSchema, UsersSchema +from models import User + +telegram_blueprint = APIBlueprint('telegram', __name__, url_prefix='/api') +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +@telegram_blueprint.route('/telegram', methods=['POST']) +@telegram_blueprint.output(UsersSchema(many=False), 200) +@telegram_blueprint.input(schema=TelegramIdSchema) +@telegram_blueprint.auth_required(auth) +@telegram_blueprint.doc(summary="Connects telegram user id", description="Connects telegram user id to user account") +def add_keyword(data): + email = get_email_or_abort_401() + + check_if_telegram_user_id_data_exists(data) + + query_user = db.session.query(User).filter_by(email=email).first() + + if query_user is None: # Username doesn't exist + abort(500, message="Unable to login") + + query_user.telegram_user_id = data['telegram_user_id'] + + db.session.commit() + + return make_response(query_user.as_dict(), 200, "Successfully connected telegram user") + + +def check_if_telegram_user_id_data_exists(data): + if "telegram_user_id" not in data: + abort(400, message="User ID missing") + + if data['telegram_user_id'] == "" or data['telegram_user_id'] is None: + abort(400, message="User ID missing") diff --git a/api/app.py b/api/app.py index 4e1dfa3..1132b2e 100644 --- a/api/app.py +++ b/api/app.py @@ -5,6 +5,11 @@ from apiflask import APIFlask from dotenv import load_dotenv from flask_cors import CORS +from api.api_blueprint_keyword import keyword_blueprint +from api.api_blueprint_portfolio import portfolio_blueprint +from api.api_blueprint_shares import shares_blueprint +from api.api_blueprint_transactions import transaction_blueprint +from api.api_blueprint_telegram import telegram_blueprint from api.helper_functions import hash_password from models import * from api_blueprint_user import users_blueprint @@ -29,6 +34,7 @@ def create_app(): application.register_blueprint(transaction_blueprint) application.register_blueprint(portfolio_blueprint) application.register_blueprint(users_blueprint) + application.register_blueprint(telegram_blueprint) @application.before_first_request def init_database(): -- 2.45.2 From 634bc4835dd47530be284c575d17829dab4f9c5a Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 17:50:28 +0200 Subject: [PATCH 72/91] Updated database model --- documentation/database/structure_database.pdf | Bin 1874 -> 0 bytes documentation/database/structure_database.png | Bin 0 -> 38191 bytes documentation/database/structure_database.uxf | 123 ++++-------------- 3 files changed, 22 insertions(+), 101 deletions(-) delete mode 100644 documentation/database/structure_database.pdf create mode 100644 documentation/database/structure_database.png diff --git a/documentation/database/structure_database.pdf b/documentation/database/structure_database.pdf deleted file mode 100644 index fdd0a10cc3d434febb82b15e71dfc2b240f8f22b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1874 zcmaJ?Yfuwc6fOgm8Wj))v5G7j5X#^_@*trYAcR18NJtP-UT%^NL`Z_k62So!L8S#1 z1Z<%&=%|#3yb%;ftqeG*1srs$fTH*;iin8Cs>SXiPO9zn{<-&l_nfoe`OciPc0wNC z8D2xD*xkF|dyPT|AV4kILUD5g`HFZP(}4VV6vud&R4v2608ABw#{w)D28W}?H5jU- zB$ae-2o4&A%+jXn##hC*-;DWo|J21}>CKA1!=?7h0I_kpvRneyoV9LMRd zojW}0mhEYEZ+PxbJ>T&#e9>h1xuZ%C4R&b(&b3{cb@;Ts|0YcmB7E1@Q99Ceihrg) zV(Ec9U54k{Z6(4ygB>mvEeHD7&kvet%2$TXS-eOX@ZADwdxpE)#nmX5Eb<)_W zK7cwtTwv{MdpxAr6udc<02db?9egO`4B89<3x;^7@5(92CgJXaG^1M$TEkx|3e5YM z%RC;ufA_*Udb%W{`V+T6wO~X7~$6=@olL+-ld$ZI>b-i;wXweQJzx0 z<$HQnWYA5YP=W4xpUJ}*VZ=aQbh$ZYVY)5vw>frC=S_GS_jw$m=L@2T&0woS-wK1) zglA3m=arRjF86L`E8YgARl+G3nv`W(o~3c(N{}yOR`>cI>}h*bylyDmHIIMNq9Wi) z=eDDbDJ5Xk5;%CLx-#f=h-5LZ?3*m3Gt`B*K4!-_gAz|ME)@a&A@i0+2riVcsfTu0@(3R6Go`^LJ_mNHourYxwes;6~ZKUsGzXZhRO^h_>~ZGhB% z(cCsx98jOTII7+zporOEJwVMg81S@mlYZHrJYZzaNQgHaT3GkPuJYibc_|gmoA*{4 z3I}V%H(J)MHF3E*XFzw%^=MD2bY59-IDGY=3ZhwQU z<+{=&`==eH)%n>D=cq&t+eF(Mu8M0L&>CzEUo*be;(bx9@z+b7#LBDP!8giQOShQ) zPQg^N*{&l_WS27a-Rh-Q;g|~70%Qk^z>wqw3>2a<7%0ND>O_qc(-JK$)TpIm3@J7|y_0YsF-|l;;piiV0eB{`j~D?E^2FhQeBztrpnw6| z2ZX?csD_{cFlLMcF_{A8s*}PY;>u=003C)RIUF((l0NA*J8Z;>5}c$=@`gXKC!>R0 zREy0Ve6e^PhAX5f=&d4VkwO&%ZcwN^Ra(WzyFM<-Z#J$J1z`OHnS%ZS(m#-NXCM5D zjtM7)6-DY*)Pi2>L?W$!#B$NQ%!uuU;%K}&W=3@Fhy3;NS$g9@wTwrI>cDeFAOwME zFb#oV7-2a<@M;KJ?Ff1ia}`&pRsU~Alv0)`#WW5IvWm3;V-0-`3{)Zz1UVA{5daRM zg@pjzP_8Es;o#{b3~<(A8Z8kw!qHJrEJ=gODMW23gx~A}m<$Gu0my+_3`UrQZsY<~ zdW=R$^ce=zi8MdOAP6R;{S+f|{g*GqW)OOQW=Es_2gV|b`_T^9po(}*L;kD;D!CdU zRThB)9uV#(k+NwR%777!iP6|7o5qmQnRF(~lC#(>CIjKPF=Y~%fx?&+W6>cx6M``Y zB4@A=x}3>|P__#v5)`S`I6&4}1d0{gF@R0zW;dg^^NidSEskpN83|!RGK!s@cMzZQ EH-T`x>;M1& diff --git a/documentation/database/structure_database.png b/documentation/database/structure_database.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d459d1b9e71e0d75fd6f7a1b955ba34ea40f17 GIT binary patch literal 38191 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 z (NRWtHMuz5nn_T=+Tzl%?#1x4Fl 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 - - 10 - - UMLClass - - 580 - 320 - 210 - 80 - - Stichwort +10Database V0.1UMLClass70536021080keywords -- -PK: s_id -FK: username -Stichwort - - - - UMLClass - - 580 - 100 - 210 - 130 - - User +PK: s_id int(11) +FK: email varchar(255) +keyword varchar(255)UMLClass425240210130users -- -PK: username -password -user_id -telegramname -Rolle - - - - - UMLClass - - 930 - 80 - 210 - 90 - - Aktie +PK: email varchar(255) +password varchar(255) +username varchar(255) +telegram_user_id varchar(255) +admin tinyint(1) +UMLClass70515021070shares -- -PK: a_id -FK: username -Aktiensymbol - - - - - UMLClass - - 200 - 320 - 210 - 130 - - Transaktion +PK: a_id int(11) +FK: email varchar(255) +symbol varchar(255) +UMLClass135150210130transaction -- -PK: t_id -FK: username -FK: Aktiensymbol -Zeitpunkt -Anzahl(+/-) -Preis(+/-) - - - - - Relation - - 780 - 120 - 170 - 30 - - lt=<- - 150.0;10.0;10.0;10.0 - - - Relation - - 400 - 120 - 200 - 260 - - lt=<- - 10.0;240.0;180.0;10.0 - - - Relation - - 510 - 200 - 90 - 190 - - lt=<- - 70.0;170.0;10.0;10.0 - - +PK: t_id int(11) +FK: email varchar(255) +symbol varchar(255) +time datetime +count int(11) +price float +Relation335190110100lt=<<- +group=110;10;60;10;60;80;90;80Relation625190100100lt=<<-80;10;50;10;50;80;10;80Relation625260100160lt=<<-80;140;50;140;50;10;10;10UMLClass14041010030Database V0.1 \ No newline at end of file -- 2.45.2 From 836c9f54cf9b60574bb0f800ae39324fc98b7156 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 17:57:22 +0200 Subject: [PATCH 73/91] Updated postman and openapi documentation --- documentation/api/openapi.json | 2 +- documentation/api/postman.json | 334 +++++++++++++++++++++++++-------- 2 files changed, 259 insertions(+), 77 deletions(-) diff --git a/documentation/api/openapi.json b/documentation/api/openapi.json index 7c9d313..f16137b 100644 --- a/documentation/api/openapi.json +++ b/documentation/api/openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"AdminData":{"properties":{"admin":{"type":"boolean"},"username":{"type":"string"}},"type":"object"},"DeleteSuccessful":{"properties":{},"type":"object"},"DeleteUser":{"properties":{"username":{"type":"string"}},"type":"object"},"HTTPError":{"properties":{"detail":{"type":"object"},"message":{"type":"string"}},"type":"object"},"Keyword":{"properties":{"keyword":{"type":"string"}},"type":"object"},"KeywordResponse":{"properties":{"keyword":{"type":"string"},"s_id":{"type":"integer"},"user_id":{"type":"integer"}},"type":"object"},"LoginData":{"properties":{"password":{"type":"string"},"username":{"type":"string"}},"type":"object"},"Symbol":{"properties":{"symbol":{"type":"string"}},"type":"object"},"SymbolResponse":{"properties":{"s_id":{"type":"integer"},"symbol":{"type":"string"},"user_id":{"type":"integer"}},"type":"object"},"Token":{"properties":{"token":{"type":"string"}},"type":"object"},"Transaction":{"properties":{"count":{"type":"integer"},"price":{"type":"number"},"symbol":{"type":"string"},"time":{"type":"string"},"user_id":{"type":"integer"}},"type":"object"},"Users":{"properties":{"admin":{"type":"boolean"},"password":{"type":"string"},"telegram_name":{"type":"string"},"user_id":{"type":"integer"},"username":{"type":"string"}},"type":"object"},"ValidationError":{"properties":{"detail":{"properties":{"":{"properties":{"":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"message":{"type":"string"}},"type":"object"}},"securitySchemes":{"BearerAuth":{"scheme":"Bearer","type":"http"}}},"info":{"description":"Webengineering 2 | Telegram Aktienbot","title":"APIFlask","version":"0.0.1"},"openapi":"3.0.3","paths":{"/api/keyword":{"delete":{"description":"Removes existing keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing keyword","tags":["Keyword"]},"post":{"description":"Adds new keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new keyword","tags":["Keyword"]}},"/api/keywords":{"get":{"description":"Returns all keywords for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all keywords","tags":["Keyword"]}},"/api/portfolio":{"get":{"description":"Returns all shares of current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/200"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns portfolio","tags":["Portfolio"]}},"/api/share":{"delete":{"description":"Removes existing symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing symbol","tags":["Share"]},"post":{"description":"Adds new symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new symbol","tags":["Share"]}},"/api/shares":{"get":{"description":"Returns all symbols for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all symbols","tags":["Share"]}},"/api/transaction":{"post":{"description":"Adds new transaction for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/()"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Adds new transaction","tags":["Transaction"]}},"/api/transactions":{"get":{"description":"Returns all transactions for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Transaction"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all transactions","tags":["Transaction"]}},"/api/user":{"delete":{"description":"Deletes user by username","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteUser"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Delete user","tags":["Users"]},"get":{"description":"Returns current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get current user","tags":["Users"]},"put":{"description":"Changes password and/or username of current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Update user","tags":["Users"]}},"/api/user/login":{"post":{"description":"Returns jwt token if username and password match, otherwise returns error","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Token"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Login","tags":["Users"]}},"/api/user/register":{"post":{"description":"Registers user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Register","tags":["Users"]}},"/api/user/setAdmin":{"put":{"description":"Set admin state of specified user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Set user admin state","tags":["Users"]}},"/api/users":{"get":{"description":"Returns all existing users as array","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Users"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get all users","tags":["Users"]}}},"servers":[{"name":"Production","url":"https://aktienbot.flokaiser.com"},{"name":"Local","url":"http://127.0.0.1:5000"}],"tags":[{"name":"Keyword"},{"name":"Share"},{"name":"Transaction"},{"name":"Portfolio"},{"name":"Users"}]} +{"components":{"schemas":{"AdminData":{"properties":{"admin":{"type":"boolean"},"email":{"format":"email","type":"string"}},"type":"object"},"DeleteSuccessful":{"properties":{},"type":"object"},"DeleteUser":{"properties":{"email":{"format":"email","type":"string"}},"type":"object"},"HTTPError":{"properties":{"detail":{"type":"object"},"message":{"type":"string"}},"type":"object"},"Keyword":{"properties":{"keyword":{"type":"string"}},"type":"object"},"KeywordResponse":{"properties":{"email":{"format":"email","type":"string"},"keyword":{"type":"string"},"s_id":{"type":"integer"}},"type":"object"},"LoginData":{"properties":{"email":{"format":"email","type":"string"},"password":{"type":"string"}},"type":"object"},"PortfolioResponse":{"properties":{"count":{"type":"integer"},"last_transaction":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"RegisterData":{"properties":{"email":{"format":"email","type":"string"},"password":{"type":"string"},"username":{"type":"string"}},"type":"object"},"Symbol":{"properties":{"symbol":{"type":"string"}},"type":"object"},"SymbolResponse":{"properties":{"email":{"format":"email","type":"string"},"s_id":{"type":"integer"},"symbol":{"type":"string"}},"type":"object"},"TelegramId":{"properties":{"telegram_user_id":{"type":"string"}},"type":"object"},"Token":{"properties":{"token":{"type":"string"}},"type":"object"},"Transaction":{"properties":{"count":{"type":"integer"},"price":{"type":"number"},"symbol":{"type":"string"},"time":{"pattern":"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z","type":"string"}},"type":"object"},"TransactionResponse":{"properties":{"count":{"type":"integer"},"email":{"format":"email","type":"string"},"price":{"type":"number"},"symbol":{"type":"string"},"time":{"type":"string"}},"type":"object"},"UpdateUserData":{"properties":{"password":{"type":"string"},"username":{"type":"string"}},"type":"object"},"Users":{"properties":{"admin":{"type":"boolean"},"email":{"format":"email","type":"string"},"password":{"type":"string"},"telegram_user_id":{"type":"string"},"username":{"type":"string"}},"type":"object"},"ValidationError":{"properties":{"detail":{"properties":{"":{"properties":{"":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"message":{"type":"string"}},"type":"object"}},"securitySchemes":{"BearerAuth":{"scheme":"Bearer","type":"http"}}},"info":{"description":"Webengineering 2 | Telegram Aktienbot","title":"APIFlask","version":"0.0.1"},"openapi":"3.0.3","paths":{"/api/keyword":{"delete":{"description":"Removes existing keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing keyword","tags":["Keyword"]},"post":{"description":"Adds new keyword for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Keyword"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new keyword","tags":["Keyword"]}},"/api/keywords":{"get":{"description":"Returns all keywords for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/KeywordResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all keywords","tags":["Keyword"]}},"/api/portfolio":{"get":{"description":"Returns all shares of current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PortfolioResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns portfolio","tags":["Portfolio"]}},"/api/share":{"delete":{"description":"Removes existing symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSuccessful"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Removes existing symbol","tags":["Share"]},"post":{"description":"Adds new symbol for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Symbol"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Add new symbol","tags":["Share"]}},"/api/shares":{"get":{"description":"Returns all symbols for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SymbolResponse"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all symbols","tags":["Share"]}},"/api/telegram":{"post":{"description":"Connects telegram user id to user account","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramId"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Connects telegram user id","tags":["Telegram"]}},"/api/transaction":{"post":{"description":"Adds new transaction for current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TransactionResponse"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Adds new transaction","tags":["Transaction"]}},"/api/transactions":{"get":{"description":"Returns all transactions for current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Transaction"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Returns all transactions","tags":["Transaction"]}},"/api/user":{"delete":{"description":"Deletes user by username","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteUser"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Delete user","tags":["Users"]},"get":{"description":"Returns current user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get current user","tags":["Users"]},"put":{"description":"Changes password and/or username of current user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Update user","tags":["Users"]}},"/api/user/login":{"post":{"description":"Returns jwt token if username and password match, otherwise returns error","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Token"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Login","tags":["Users"]}},"/api/user/register":{"post":{"description":"Registers user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterData"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Users"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"}},"summary":"Register","tags":["Users"]}},"/api/user/setAdmin":{"put":{"description":"Set admin state of specified user","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminData"}}}},"responses":{"204":{"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Set user admin state","tags":["Users"]}},"/api/users":{"get":{"description":"Returns all existing users as array","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Users"},"type":"array"},"status":{"type":"integer"},"text":{"type":"string"}},"type":"object"}}},"description":"Successful response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPError"}}},"description":"Authentication error"}},"security":[{"BearerAuth":[]}],"summary":"Get all users","tags":["Users"]}}},"servers":[{"name":"Production","url":"https://aktienbot.flokaiser.com"},{"name":"Local","url":"http://127.0.0.1:5000"}],"tags":[{"name":"Keyword"},{"name":"Share"},{"name":"Transaction"},{"name":"Portfolio"},{"name":"Users"},{"name":"Telegram"}]} diff --git a/documentation/api/postman.json b/documentation/api/postman.json index e6fee89..db6e014 100644 --- a/documentation/api/postman.json +++ b/documentation/api/postman.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "b478b800-af91-45a7-8713-b199bcc41866", + "_postman_id": "eed3eb48-b932-4d72-979a-38de9ae2cbf0", "name": "APIFlask", "description": "Webengineering 2 | Telegram Aktienbot", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" @@ -35,7 +35,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -68,7 +68,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -96,7 +96,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {},\n \"status\": 261201,\n \"text\": \"aliqua amet consectetur elit\"\n}" + "body": "{\n \"data\": {},\n \"status\": -35854777,\n \"text\": \"sint in\"\n}" }, { "name": "Validation error", @@ -111,7 +111,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -139,7 +139,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -154,7 +154,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -182,7 +182,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -212,7 +212,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -245,7 +245,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -273,7 +273,7 @@ } ], "cookie": [], - "body": "{\n \"data\": [\n {\n \"keyword\": \"tempor dolor commodo ipsum non\",\n \"s_id\": -64068772,\n \"user_id\": 82510382\n },\n {\n \"keyword\": \"in aute ex\",\n \"s_id\": 60028598,\n \"user_id\": -36905324\n }\n ],\n \"status\": 63124172,\n \"text\": \"amet\"\n}" + "body": "{\n \"data\": [\n {\n \"email\": \"8Es0sp5sb@wvQoAOvD.bzz\",\n \"keyword\": \"eiusmo\",\n \"s_id\": -48384117\n },\n {\n \"email\": \"MZ0cnQ1mwRV@oONtzNaRnVSaUXAReoDzwztMr.fiz\",\n \"keyword\": \"ullamco ad\",\n \"s_id\": -36966818\n }\n ],\n \"status\": 55335664,\n \"text\": \"dolor id ex\"\n}" }, { "name": "Validation error", @@ -288,7 +288,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -316,7 +316,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -331,7 +331,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"keyword\": \"elit Lorem\"\n}", + "raw": "{\n \"keyword\": \"nisi\"\n}", "options": { "raw": { "language": "json" @@ -359,7 +359,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -428,7 +428,7 @@ } ], "cookie": [], - "body": "{\n \"data\": [\n {\n \"keyword\": \"tempor dolor commodo ipsum non\",\n \"s_id\": -64068772,\n \"user_id\": 82510382\n },\n {\n \"keyword\": \"in aute ex\",\n \"s_id\": 60028598,\n \"user_id\": -36905324\n }\n ],\n \"status\": 63124172,\n \"text\": \"amet\"\n}" + "body": "{\n \"data\": [\n {\n \"email\": \"8Es0sp5sb@wvQoAOvD.bzz\",\n \"keyword\": \"eiusmo\",\n \"s_id\": -48384117\n },\n {\n \"email\": \"MZ0cnQ1mwRV@oONtzNaRnVSaUXAReoDzwztMr.fiz\",\n \"keyword\": \"ullamco ad\",\n \"s_id\": -36966818\n }\n ],\n \"status\": 55335664,\n \"text\": \"dolor id ex\"\n}" }, { "name": "Authentication error", @@ -462,7 +462,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] } @@ -497,7 +497,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -530,7 +530,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -558,7 +558,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {},\n \"status\": 261201,\n \"text\": \"aliqua amet consectetur elit\"\n}" + "body": "{\n \"data\": {},\n \"status\": -35854777,\n \"text\": \"sint in\"\n}" }, { "name": "Validation error", @@ -573,7 +573,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -601,7 +601,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -616,7 +616,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -644,7 +644,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -674,7 +674,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -707,7 +707,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -735,7 +735,7 @@ } ], "cookie": [], - "body": "{\n \"data\": [\n {\n \"s_id\": -53227093,\n \"symbol\": \"veniam ea amet irure\",\n \"user_id\": 7468241\n },\n {\n \"s_id\": -37877246,\n \"symbol\": \"ut tempor labore non\",\n \"user_id\": -72644124\n }\n ],\n \"status\": 87653200,\n \"text\": \"aliquip reprehenderit dolore\"\n}" + "body": "{\n \"data\": [\n {\n \"email\": \"j32mUuC@iIJKfYQWSepoVsngEZYbfEmOwCzXXxVMP.alp\",\n \"s_id\": 86469214,\n \"symbol\": \"labore ea\"\n },\n {\n \"email\": \"PwKotAxaLBa8nY@nSsGmaxZeZqnRhOGmHhbICYhqTGLESrq.xy\",\n \"s_id\": 63768957,\n \"symbol\": \"laboris pariatur commodo\"\n }\n ],\n \"status\": -1862021,\n \"text\": \"culpa nulla\"\n}" }, { "name": "Validation error", @@ -750,7 +750,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -778,7 +778,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -793,7 +793,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"symbol\": \"aliquip ullamco Ut\"\n}", + "raw": "{\n \"symbol\": \"magna Excepteur ullamco aute velit\"\n}", "options": { "raw": { "language": "json" @@ -821,7 +821,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -890,7 +890,7 @@ } ], "cookie": [], - "body": "{\n \"data\": [\n {\n \"s_id\": -53227093,\n \"symbol\": \"veniam ea amet irure\",\n \"user_id\": 7468241\n },\n {\n \"s_id\": -37877246,\n \"symbol\": \"ut tempor labore non\",\n \"user_id\": -72644124\n }\n ],\n \"status\": 87653200,\n \"text\": \"aliquip reprehenderit dolore\"\n}" + "body": "{\n \"data\": [\n {\n \"email\": \"j32mUuC@iIJKfYQWSepoVsngEZYbfEmOwCzXXxVMP.alp\",\n \"s_id\": 86469214,\n \"symbol\": \"labore ea\"\n },\n {\n \"email\": \"PwKotAxaLBa8nY@nSsGmaxZeZqnRhOGmHhbICYhqTGLESrq.xy\",\n \"s_id\": 63768957,\n \"symbol\": \"laboris pariatur commodo\"\n }\n ],\n \"status\": -1862021,\n \"text\": \"culpa nulla\"\n}" }, { "name": "Authentication error", @@ -924,7 +924,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] } @@ -959,7 +959,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "raw": "{\n \"count\": 76782033,\n \"price\": -9709838.042264134,\n \"symbol\": \"mollit esse ex in\",\n \"time\": \"2120-69-63T43:76:75.378Z\"\n}", "options": { "raw": { "language": "json" @@ -992,7 +992,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "raw": "{\n \"count\": 76782033,\n \"price\": -9709838.042264134,\n \"symbol\": \"mollit esse ex in\",\n \"time\": \"2120-69-63T43:76:75.378Z\"\n}", "options": { "raw": { "language": "json" @@ -1020,7 +1020,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"value\": \"reference #/components/schemas/() not found in the OpenAPI spec\"\n },\n \"status\": 14310780,\n \"text\": \"in sint sit\"\n}" + "body": "{\n \"data\": {\n \"count\": 99691073,\n \"email\": \"DAX6XjHTr8eA6M@xsoUe.id\",\n \"price\": -14617384.086570382,\n \"symbol\": \"eu ad deserunt\",\n \"time\": \"ipsum nisi in laboris\"\n },\n \"status\": -51137224,\n \"text\": \"ipsum culpa amet\"\n}" }, { "name": "Validation error", @@ -1035,7 +1035,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "raw": "{\n \"count\": 76782033,\n \"price\": -9709838.042264134,\n \"symbol\": \"mollit esse ex in\",\n \"time\": \"2120-69-63T43:76:75.378Z\"\n}", "options": { "raw": { "language": "json" @@ -1063,7 +1063,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -1078,7 +1078,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"count\": 96634001,\n \"price\": -71028444.15053315,\n \"symbol\": \"deserunt officia dolore\",\n \"time\": \"magna occaecat est\",\n \"user_id\": -71272721\n}", + "raw": "{\n \"count\": 76782033,\n \"price\": -9709838.042264134,\n \"symbol\": \"mollit esse ex in\",\n \"time\": \"2120-69-63T43:76:75.378Z\"\n}", "options": { "raw": { "language": "json" @@ -1106,7 +1106,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -1175,7 +1175,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"count\": -19053100,\n \"price\": 39909986.26075193,\n \"symbol\": \"sit nisi\",\n \"time\": \"pariatur eu proident\",\n \"user_id\": 54782742\n },\n \"status\": 87070947,\n \"text\": \"null\"\n}" + "body": "{\n \"data\": {\n \"count\": -37878076,\n \"price\": -40419772.172105886,\n \"symbol\": \"velit ut Ut elit esse\",\n \"time\": \"5462-92-97T03:27:22.076Z\"\n },\n \"status\": -509477,\n \"text\": \"proident\"\n}" }, { "name": "Authentication error", @@ -1209,7 +1209,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] } @@ -1283,7 +1283,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"value\": \"reference #/components/schemas/200 not found in the OpenAPI spec\"\n },\n \"status\": 14426134,\n \"text\": \"velit in ad dolore\"\n}" + "body": "{\n \"data\": [\n {\n \"count\": 75537465,\n \"last_transaction\": \"dolor enim\",\n \"symbol\": \"enim nostrud non deserunt\"\n },\n {\n \"count\": -69490418,\n \"last_transaction\": \"et\",\n \"symbol\": \"Excepteur irure est enim\"\n }\n ],\n \"status\": 7099250,\n \"text\": \"dolore in ad\"\n}" }, { "name": "Authentication error", @@ -1317,7 +1317,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] } @@ -1352,7 +1352,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "raw": "{\n \"email\": \"HqkZQ@KMWQFPMhWGvBHrdzOdOampAHweUvPCej.kvbl\"\n}", "options": { "raw": { "language": "json" @@ -1385,7 +1385,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "raw": "{\n \"email\": \"HqkZQ@KMWQFPMhWGvBHrdzOdOampAHweUvPCej.kvbl\"\n}", "options": { "raw": { "language": "json" @@ -1428,7 +1428,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "raw": "{\n \"email\": \"HqkZQ@KMWQFPMhWGvBHrdzOdOampAHweUvPCej.kvbl\"\n}", "options": { "raw": { "language": "json" @@ -1456,7 +1456,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"cupidatat mollit laborum aute\",\n \"aute in laboris dolor\"\n ]\n }\n },\n \"message\": \"in dolore exercitation eu elit\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -1471,7 +1471,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"username\": \"aliqua dolor do\"\n}", + "raw": "{\n \"email\": \"HqkZQ@KMWQFPMhWGvBHrdzOdOampAHweUvPCej.kvbl\"\n}", "options": { "raw": { "language": "json" @@ -1499,7 +1499,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -1568,7 +1568,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"admin\": false,\n \"password\": \"voluptate magna esse\",\n \"telegram_name\": \"id\",\n \"user_id\": -55336867,\n \"username\": \"do exercitation\"\n },\n \"status\": -11469710,\n \"text\": \"aute\"\n}" + "body": "{\n \"data\": {\n \"admin\": false,\n \"email\": \"VNB@NeqjbTmHnkWDwPacdUoXgpYVTNlD.iip\",\n \"password\": \"fugiat ipsum\",\n \"telegram_user_id\": \"et\",\n \"username\": \"nostrud laborum\"\n },\n \"status\": -78288268,\n \"text\": \"laborum minim\"\n}" }, { "name": "Authentication error", @@ -1602,7 +1602,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -1632,7 +1632,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"password\": \"elit do in esse\",\n \"username\": \"mollit velit sed reprehenderit\"\n}", "options": { "raw": { "language": "json" @@ -1665,7 +1665,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"password\": \"elit do in esse\",\n \"username\": \"mollit velit sed reprehenderit\"\n}", "options": { "raw": { "language": "json" @@ -1708,7 +1708,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"password\": \"elit do in esse\",\n \"username\": \"mollit velit sed reprehenderit\"\n}", "options": { "raw": { "language": "json" @@ -1736,7 +1736,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -1751,7 +1751,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"password\": \"elit do in esse\",\n \"username\": \"mollit velit sed reprehenderit\"\n}", "options": { "raw": { "language": "json" @@ -1779,7 +1779,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -1799,7 +1799,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"YKQkCdcOoJ3vH@wbOpjGTXH.avm\",\n \"password\": \"veniam\"\n}", "options": { "raw": { "language": "json" @@ -1827,7 +1827,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"YKQkCdcOoJ3vH@wbOpjGTXH.avm\",\n \"password\": \"veniam\"\n}", "options": { "raw": { "language": "json" @@ -1856,7 +1856,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"token\": \"minim\"\n },\n \"status\": 86563099,\n \"text\": \"non tempor quis ullamco est\"\n}" + "body": "{\n \"data\": {\n \"token\": \"do ipsu\"\n },\n \"status\": 31961350,\n \"text\": \"Lorem dolor commodo laborum cillum\"\n}" }, { "name": "Validation error", @@ -1865,7 +1865,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"YKQkCdcOoJ3vH@wbOpjGTXH.avm\",\n \"password\": \"veniam\"\n}", "options": { "raw": { "language": "json" @@ -1894,7 +1894,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" } ] }, @@ -1914,7 +1914,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"DJR029Ov-keM@pyhCxnpZmcVMxADSiCjmsGRZksCf.zz\",\n \"password\": \"sed voluptate\",\n \"username\": \"voluptate aute proident\"\n}", "options": { "raw": { "language": "json" @@ -1942,7 +1942,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"DJR029Ov-keM@pyhCxnpZmcVMxADSiCjmsGRZksCf.zz\",\n \"password\": \"sed voluptate\",\n \"username\": \"voluptate aute proident\"\n}", "options": { "raw": { "language": "json" @@ -1971,7 +1971,7 @@ } ], "cookie": [], - "body": "{\n \"data\": {\n \"admin\": false,\n \"password\": \"voluptate magna esse\",\n \"telegram_name\": \"id\",\n \"user_id\": -55336867,\n \"username\": \"do exercitation\"\n },\n \"status\": -11469710,\n \"text\": \"aute\"\n}" + "body": "{\n \"data\": {\n \"admin\": false,\n \"email\": \"VNB@NeqjbTmHnkWDwPacdUoXgpYVTNlD.iip\",\n \"password\": \"fugiat ipsum\",\n \"telegram_user_id\": \"et\",\n \"username\": \"nostrud laborum\"\n },\n \"status\": -78288268,\n \"text\": \"laborum minim\"\n}" }, { "name": "Validation error", @@ -1980,7 +1980,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\n \"password\": \"ut minim\",\n \"username\": \"esse sit enim consectetur\"\n}", + "raw": "{\n \"email\": \"DJR029Ov-keM@pyhCxnpZmcVMxADSiCjmsGRZksCf.zz\",\n \"password\": \"sed voluptate\",\n \"username\": \"voluptate aute proident\"\n}", "options": { "raw": { "language": "json" @@ -2009,7 +2009,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" } ] }, @@ -2039,7 +2039,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "raw": "{\n \"admin\": false,\n \"email\": \"qUgn5u1bWI4cwc@LjiesdFcoYwvweQto.dj\"\n}", "options": { "raw": { "language": "json" @@ -2073,7 +2073,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "raw": "{\n \"admin\": false,\n \"email\": \"qUgn5u1bWI4cwc@LjiesdFcoYwvweQto.dj\"\n}", "options": { "raw": { "language": "json" @@ -2117,7 +2117,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "raw": "{\n \"admin\": false,\n \"email\": \"qUgn5u1bWI4cwc@LjiesdFcoYwvweQto.dj\"\n}", "options": { "raw": { "language": "json" @@ -2146,7 +2146,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"labore\",\n \"\"\n ]\n }\n },\n \"message\": \"pariatur cillum qui aute\"\n}" + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"anim quis\",\n \"in velit ali\"\n ]\n }\n },\n \"message\": \"nostrud\"\n}" }, { "name": "Authentication error", @@ -2161,7 +2161,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"admin\": true,\n \"username\": \"sunt\"\n}", + "raw": "{\n \"admin\": false,\n \"email\": \"qUgn5u1bWI4cwc@LjiesdFcoYwvweQto.dj\"\n}", "options": { "raw": { "language": "json" @@ -2190,7 +2190,7 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] }, @@ -2259,7 +2259,7 @@ } ], "cookie": [], - "body": "{\n \"data\": [\n {\n \"admin\": true,\n \"password\": \"incididunt id dolore\",\n \"telegram_name\": \"id sed\",\n \"user_id\": 15906508,\n \"username\": \"dolor consequat ullamco\"\n },\n {\n \"admin\": true,\n \"password\": \"voluptate non\",\n \"telegram_name\": \"dolor sunt fugiat exercitation\",\n \"user_id\": 95246024,\n \"username\": \"Duis qui culpa Ut labore\"\n }\n ],\n \"status\": 81180129,\n \"text\": \"in ullamco\"\n}" + "body": "{\n \"data\": [\n {\n \"admin\": false,\n \"email\": \"paghoo4COL6gQNz@SJXcMSOC.kus\",\n \"password\": \"exercitation laboris Ut cillum nisi\",\n \"telegram_user_id\": \"id in incididunt sint\",\n \"username\": \"sed laborum cill\"\n },\n {\n \"admin\": false,\n \"email\": \"WFYb2q0XXey6WZa@JNSezyFkIVzneuifIXi.la\",\n \"password\": \"velit irure veniam\",\n \"telegram_user_id\": \"pariatur sed commodo\",\n \"username\": \"incididunt consequat\"\n }\n ],\n \"status\": -92106336,\n \"text\": \"commodo ull\"\n}" }, { "name": "Authentication error", @@ -2293,7 +2293,189 @@ } ], "cookie": [], - "body": "{\n \"detail\": {},\n \"message\": \"eiusmod enim ipsum\"\n}" + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" + } + ] + } + ] + }, + { + "name": "Telegram", + "item": [ + { + "name": "Connects telegram user id", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"telegram_user_id\": \"do quis\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/telegram", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "telegram" + ] + }, + "description": "Connects telegram user id to user account" + }, + "response": [ + { + "name": "Successful response", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"telegram_user_id\": \"do quis\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/telegram", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "telegram" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"data\": {\n \"admin\": false,\n \"email\": \"VNB@NeqjbTmHnkWDwPacdUoXgpYVTNlD.iip\",\n \"password\": \"fugiat ipsum\",\n \"telegram_user_id\": \"et\",\n \"username\": \"nostrud laborum\"\n },\n \"status\": -78288268,\n \"text\": \"laborum minim\"\n}" + }, + { + "name": "Validation error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"telegram_user_id\": \"do quis\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/telegram", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "telegram" + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {\n \"\": {\n \"\": [\n \"velit\",\n \"ut laboris\"\n ]\n }\n },\n \"message\": \"dolore nostrud officia ex\"\n}" + }, + { + "name": "Authentication error", + "originalRequest": { + "method": "POST", + "header": [ + { + "description": "Added as a part of security scheme: bearer", + "key": "Authorization", + "value": "Bearer " + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"telegram_user_id\": \"do quis\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/telegram", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "telegram" + ] + } + }, + "status": "Unauthorized", + "code": 401, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{\n \"detail\": {},\n \"message\": \"irure ad do quis\"\n}" } ] } -- 2.45.2 From 0fa5c8fb9ac3765fb4813a77cc5068bbdb71282f Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 18:16:45 +0200 Subject: [PATCH 74/91] Fixed imports --- api/app.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api/app.py b/api/app.py index 1132b2e..7225166 100644 --- a/api/app.py +++ b/api/app.py @@ -5,12 +5,12 @@ from apiflask import APIFlask from dotenv import load_dotenv from flask_cors import CORS -from api.api_blueprint_keyword import keyword_blueprint -from api.api_blueprint_portfolio import portfolio_blueprint -from api.api_blueprint_shares import shares_blueprint -from api.api_blueprint_transactions import transaction_blueprint -from api.api_blueprint_telegram import telegram_blueprint -from api.helper_functions import hash_password +from api_blueprint_keyword import keyword_blueprint +from api_blueprint_portfolio import portfolio_blueprint +from api_blueprint_shares import shares_blueprint +from api_blueprint_transactions import transaction_blueprint +from api_blueprint_telegram import telegram_blueprint +from helper_functions import hash_password from models import * from api_blueprint_user import users_blueprint -- 2.45.2 From 7d0fdb33fb9c1124b10588383dc0c9b830df7406 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 18:19:51 +0200 Subject: [PATCH 75/91] Fixed imports #2 --- api/api_blueprint_portfolio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/api_blueprint_portfolio.py b/api/api_blueprint_portfolio.py index b6ecea3..cf3c9b1 100644 --- a/api/api_blueprint_portfolio.py +++ b/api/api_blueprint_portfolio.py @@ -2,7 +2,7 @@ import os from apiflask import APIBlueprint -from api.schema import PortfolioResponseSchema +from schema import PortfolioResponseSchema from db import db from helper_functions import make_response, get_email_or_abort_401 from auth import auth -- 2.45.2 From cc131a894b956ea24bac50e56e020eb3103bc96d Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Sun, 27 Mar 2022 19:48:59 +0200 Subject: [PATCH 76/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index e2406ae..53ee476 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -98,3 +98,5 @@ pipeline: path: "frontend/*" branches: main +when: + event: [ push ] -- 2.45.2 From c338e8f959995d10af15f9497f8ce3fc6bb3694b Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 20:03:11 +0200 Subject: [PATCH 77/91] Improved try-excepts --- api/auth.py | 2 +- api/helper_functions.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/auth.py b/api/auth.py index f13eda3..d5db292 100644 --- a/api/auth.py +++ b/api/auth.py @@ -17,5 +17,5 @@ def verify_token(token): try: jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"]) return True - except: + except jwt.PyJWTError: return False diff --git a/api/helper_functions.py b/api/helper_functions.py index 6eca7a5..3bb74ee 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -32,7 +32,7 @@ def extract_token_data(token): if token is not None: try: return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"]) - except: + except jwt.PyJWTError: return None else: return None @@ -52,13 +52,13 @@ def get_email_from_token_data(): return email else: return None - except: + except jwt.PyJWTError: return None else: # "Normal" token, extract username from token try: return jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] - except: + except jwt.PyJWTError: return None return None -- 2.45.2 From 3ffaa239e4e4a6fccea9ffad7d62a6e6cac17051 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <44125287+H4CK3R-01@users.noreply.github.com> Date: Sun, 27 Mar 2022 20:04:51 +0200 Subject: [PATCH 78/91] Update pipeline.yml --- .woodpecker/pipeline.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 53ee476..8b80a94 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -96,7 +96,9 @@ pipeline: - /opt/docker/TelegramAktienBot/deploy_frontend.sh when: path: "frontend/*" - + + when: + event: [ push ] + + branches: main -when: - event: [ push ] -- 2.45.2 From d19b38634a70fd59cc145477c610315b248d3a6e Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 20:12:45 +0200 Subject: [PATCH 79/91] Updated schema.py --- api/schema.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/api/schema.py b/api/schema.py index 67fdf65..f425825 100644 --- a/api/schema.py +++ b/api/schema.py @@ -60,16 +60,31 @@ class KeywordSchema(Schema): keyword = String() +class SymbolSchema(Schema): + symbol = String() + + +class TransactionSchema(Schema): + symbol = String() + time = String(validate=validate.Regexp(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z")) + count = Integer() + price = Float() + + +class TelegramIdSchema(Schema): + telegram_user_id = String() + + +class DeleteSuccessfulSchema(Schema): + pass + + class KeywordResponseSchema(Schema): keyword = String() s_id = Integer() email = Email() -class SymbolSchema(Schema): - symbol = String() - - class SymbolResponseSchema(Schema): symbol = String() s_id = Integer() @@ -81,13 +96,6 @@ class PortfolioShareResponseSchema(Schema): last_transaction = String() -class TransactionSchema(Schema): - symbol = String() - time = String(validate=validate.Regexp(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z")) - count = Integer() - price = Float() - - class TransactionResponseSchema(Schema): email = Email() symbol = String() @@ -96,16 +104,8 @@ class TransactionResponseSchema(Schema): price = Float() -class TelegramIdSchema(Schema): - telegram_user_id = String() - - class PortfolioResponseSchema(Schema): symbol = String() last_transaction = String() count = Integer() # price = Float() - - -class DeleteSuccessfulSchema(Schema): - pass -- 2.45.2 From 948ef0c179a3607f2de878d081961ef37bb60164 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 20:24:53 +0200 Subject: [PATCH 80/91] Updated pipeline.yml --- .woodpecker/pipeline.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 8b80a94..56f8cf8 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -1,9 +1,19 @@ pipeline: - generate_tag: + generate_docker_tag: image: golang commands: - echo -n "${CI_COMMIT_BRANCH//\//-}-${CI_COMMIT_SHA:0:8}, latest" > .tags - + when: + event: push + + generate_docker_tag_pr: + image: golang + commands: + - echo -n "pr-${CI_COMMIT_SHA:0:8}, pr" > .tags + when: + event: pull_request + + # -------------------------------------- API -------------------------------------- build_api: image: woodpeckerci/plugin-docker-buildx settings: @@ -19,6 +29,7 @@ pipeline: platforms: linux/amd64 when: path: "api/*" + event: push deploy_api: image: appleboy/drone-ssh @@ -34,7 +45,10 @@ pipeline: - /opt/docker/TelegramAktienBot/deploy_api.sh when: path: "api/*" + event: push + + # -------------------------------------- Bot -------------------------------------- build_bot: image: woodpeckerci/plugin-docker-buildx settings: @@ -66,6 +80,8 @@ pipeline: when: path: "telegram_bot/*" + + # -------------------------------------- Frontend -------------------------------------- build_frontend: image: woodpeckerci/plugin-docker-buildx settings: @@ -97,8 +113,4 @@ pipeline: when: path: "frontend/*" - when: - event: [ push ] - - branches: main -- 2.45.2 From 48e97ea40661b79d4f486e5690b31f93e39c346e Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 20:42:11 +0200 Subject: [PATCH 81/91] Updated api to use bcrypt --- api/helper_functions.py | 9 +++------ api/models.py | 2 +- api/requirements.txt | 3 ++- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/api/helper_functions.py b/api/helper_functions.py index 3bb74ee..d805602 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -1,7 +1,6 @@ -import hashlib import os -import uuid +import bcrypt import jwt from apiflask import abort from flask import request, jsonify @@ -11,13 +10,11 @@ from models import User def hash_password(password): - salt = uuid.uuid4().hex - return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt + return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()) def check_password(hashed_password, user_password): - password, salt = hashed_password.split(':') - return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest() + return bcrypt.checkpw(hashed_password.encode("utf-8"), user_password) def get_token(): diff --git a/api/models.py b/api/models.py index 20c4830..f63451a 100644 --- a/api/models.py +++ b/api/models.py @@ -4,7 +4,7 @@ from db import db class User(db.Model): __tablename__ = 'users' email = db.Column('email', db.String(255), primary_key=True, nullable=False, unique=True) - password = db.Column('password', db.String(255), nullable=False, server_default='') + password = db.Column('password', db.BINARY(60), nullable=False) username = db.Column('username', db.String(255), nullable=False, server_default='') telegram_user_id = db.Column('telegram_user_id', db.String(255), nullable=True, server_default='') admin = db.Column('admin', db.Boolean(), server_default='0') diff --git a/api/requirements.txt b/api/requirements.txt index bcc5fee..4b9b4eb 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -6,4 +6,5 @@ python-dotenv==0.20.0 pymysql==1.0.2 pyjwt==2.3.0 apiflask==0.12.0 -flask-cors==3.0.10 \ No newline at end of file +flask-cors==3.0.10 +bcrypt==3.1.0 \ No newline at end of file -- 2.45.2 From 5c006528058dbd27c10570a3202a6a0533d238dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Mar 2022 18:43:37 +0000 Subject: [PATCH 82/91] Update python-dotenv requirement in /telegram_bot Updates the requirements on [python-dotenv](https://github.com/theskumar/python-dotenv) to permit the latest version. - [Release notes](https://github.com/theskumar/python-dotenv/releases) - [Changelog](https://github.com/theskumar/python-dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0) --- updated-dependencies: - dependency-name: python-dotenv dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- telegram_bot/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram_bot/requirements.txt b/telegram_bot/requirements.txt index 4dcfe5c..6b0de09 100644 --- a/telegram_bot/requirements.txt +++ b/telegram_bot/requirements.txt @@ -2,5 +2,5 @@ pyTelegramBotAPI~=4.4.0 Markdown~=3.3.6 yfinance~=0.1.70 newsapi-python~=0.2.6 -python-dotenv~=0.19.2 +python-dotenv~=0.20.0 requests~=2.27.1 -- 2.45.2 From d1869cc883030f4abfd01905e53d0d67b0506c46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Mar 2022 18:46:58 +0000 Subject: [PATCH 83/91] Bump bcrypt from 3.1.0 to 3.2.0 in /api Bumps [bcrypt](https://github.com/pyca/bcrypt) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/pyca/bcrypt/releases) - [Changelog](https://github.com/pyca/bcrypt/blob/main/release.py) - [Commits](https://github.com/pyca/bcrypt/compare/3.1.0...3.2.0) --- updated-dependencies: - dependency-name: bcrypt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- api/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/requirements.txt b/api/requirements.txt index 4b9b4eb..0ab141c 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -7,4 +7,4 @@ pymysql==1.0.2 pyjwt==2.3.0 apiflask==0.12.0 flask-cors==3.0.10 -bcrypt==3.1.0 \ No newline at end of file +bcrypt==3.2.0 \ No newline at end of file -- 2.45.2 From 67e2a4c7610936c3a2a987ac4ba3c100ab6cfeff Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 21:08:24 +0200 Subject: [PATCH 84/91] Fixed binary is not serializable error --- api/models.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/api/models.py b/api/models.py index f63451a..d85e49c 100644 --- a/api/models.py +++ b/api/models.py @@ -10,7 +10,12 @@ class User(db.Model): admin = db.Column('admin', db.Boolean(), server_default='0') def as_dict(self): - return {c.name: getattr(self, c.name) for c in self.__table__.columns} + return { + "email": self.email, + "username": self.username, + "telegram_user_id": self.telegram_user_id, + "admin": self.admin + } class Transaction(db.Model): -- 2.45.2 From 5dd0cb0b5185ffc2feea13bfacad69e80d4d84d0 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 21:21:20 +0200 Subject: [PATCH 85/91] Fixed binary is not serializable error #2 --- api/api_blueprint_user.py | 2 +- api/helper_functions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/api_blueprint_user.py b/api/api_blueprint_user.py index 0afd873..1a6bccc 100644 --- a/api/api_blueprint_user.py +++ b/api/api_blueprint_user.py @@ -56,7 +56,7 @@ def login(data): if query_user is None: # email doesn't exist abort(500, message="Unable to login") - if not check_password(query_user.password, password): # Password incorrect + if not check_password(query_user.password, password.encode("utf-8")): # Password incorrect abort(500, message="Unable to login") token = jwt.encode({'email': query_user.email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=45)}, os.getenv('SECRET_KEY'), "HS256") diff --git a/api/helper_functions.py b/api/helper_functions.py index d805602..3d59264 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -14,7 +14,7 @@ def hash_password(password): def check_password(hashed_password, user_password): - return bcrypt.checkpw(hashed_password.encode("utf-8"), user_password) + return bcrypt.checkpw(user_password, hashed_password) def get_token(): -- 2.45.2 From a5f17b80eb728d0149bb92e6819cd28add333c5e Mon Sep 17 00:00:00 2001 From: kevinpauer Date: Sun, 27 Mar 2022 21:33:35 +0200 Subject: [PATCH 86/91] Update Login and Registration for new api configuration --- frontend/src/app/Services/auth.service.ts | 9 ++++---- .../src/app/Views/login/login.component.html | 22 +++++++++---------- .../src/app/Views/login/login.component.ts | 8 +++---- .../Views/register/register.component.html | 18 +++++++++++++++ .../app/Views/register/register.component.ts | 7 +++--- 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/frontend/src/app/Services/auth.service.ts b/frontend/src/app/Services/auth.service.ts index 4fcdef9..85ad53a 100644 --- a/frontend/src/app/Services/auth.service.ts +++ b/frontend/src/app/Services/auth.service.ts @@ -11,18 +11,19 @@ const httpOptions = { }) export class AuthService { constructor(private http: HttpClient) {} - login(username: string, password: string): Observable { + login(email: string, password: string): Observable { return this.http.post(AUTH_API + '/login', { - username, + email, password, }); } - register(username: string, password: string): Observable { + register(email: string, username: string, password: string): Observable { return this.http.post( AUTH_API + '/register', { - username, + email, password, + username, }, httpOptions ); diff --git a/frontend/src/app/Views/login/login.component.html b/frontend/src/app/Views/login/login.component.html index b1ce7dc..42f01b4 100644 --- a/frontend/src/app/Views/login/login.component.html +++ b/frontend/src/app/Views/login/login.component.html @@ -14,21 +14,21 @@ class="backgorund" >
- + -
diff --git a/frontend/src/app/Views/login/login.component.ts b/frontend/src/app/Views/login/login.component.ts index dac1bc2..2837bd2 100644 --- a/frontend/src/app/Views/login/login.component.ts +++ b/frontend/src/app/Views/login/login.component.ts @@ -10,7 +10,7 @@ import { Router } from '@angular/router'; }) export class LoginComponent implements OnInit { form: any = { - username: null, + email: null, password: null, }; isLoggedIn = false; @@ -39,15 +39,15 @@ export class LoginComponent implements OnInit { //onSubmit() saves valuable information in session storage onSubmit(): void { - const { username, password } = this.form; - this.authService.login(username, password).subscribe( + const { email, password } = this.form; + this.authService.login(email, password).subscribe( (data) => { this.tokenStorage.saveToken(data.data.token); this.tokenStorage.saveUser(data.data); this.isLoginFailed = false; this.isLoggedIn = true; - this.accountName = username; + this.accountName = email; this.router.navigate(['']); }, (err) => { diff --git a/frontend/src/app/Views/register/register.component.html b/frontend/src/app/Views/register/register.component.html index 486f037..6b21679 100644 --- a/frontend/src/app/Views/register/register.component.html +++ b/frontend/src/app/Views/register/register.component.html @@ -35,6 +35,24 @@
+
+ + +
+
Email is required
+
+ Email must be a valid email address +
+
+
{ this.isSuccessful = true; this.isSignUpFailed = false; -- 2.45.2 From 9c3edfeb8c72b79d5f9c5ce5e86974d9b53af802 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Sun, 27 Mar 2022 21:36:10 +0200 Subject: [PATCH 87/91] Fixed bot account --- api/helper_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/helper_functions.py b/api/helper_functions.py index 3d59264..7f25059 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -45,7 +45,7 @@ def get_email_from_token_data(): token = token.split(":")[0] try: - if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] == os.getenv("BOT_USER"): + if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] == os.getenv("BOT_EMAIL"): return email else: return None -- 2.45.2 From 0393f153bfd80f34e535e7ceb57782fcac4752b2 Mon Sep 17 00:00:00 2001 From: kevinpauer Date: Sun, 27 Mar 2022 22:34:07 +0200 Subject: [PATCH 88/91] Remove unused href, that throws 404 --- frontend/src/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/index.html b/frontend/src/index.html index 4da32cc..371b2a9 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -5,7 +5,6 @@ Aktienbot - Date: Mon, 28 Mar 2022 00:37:49 +0200 Subject: [PATCH 89/91] Improve Http Request --- frontend/src/app/Helpers/auth.interceptor.ts | 2 +- .../src/app/Helpers/helper.service.spec.ts | 16 +++++++ frontend/src/app/Helpers/helper.service.ts | 10 +++++ frontend/src/app/Models/stock.model.ts | 6 +++ frontend/src/app/Services/data.service.ts | 44 +++++++++++-------- .../Views/dashboard/dashboard.component.html | 34 +++++++++++++- .../Views/dashboard/dashboard.component.ts | 15 ++++--- .../src/app/Views/login/login.component.ts | 2 +- 8 files changed, 102 insertions(+), 27 deletions(-) create mode 100644 frontend/src/app/Helpers/helper.service.spec.ts create mode 100644 frontend/src/app/Helpers/helper.service.ts create mode 100644 frontend/src/app/Models/stock.model.ts diff --git a/frontend/src/app/Helpers/auth.interceptor.ts b/frontend/src/app/Helpers/auth.interceptor.ts index ff94e91..c013dd5 100644 --- a/frontend/src/app/Helpers/auth.interceptor.ts +++ b/frontend/src/app/Helpers/auth.interceptor.ts @@ -7,7 +7,7 @@ import { } from '@angular/common/http'; import { TokenStorageService } from '../Services/token.service'; import { Observable } from 'rxjs'; -const TOKEN_HEADER_KEY = 'Authorization'; // for Spring Boot back-end +const TOKEN_HEADER_KEY = 'Authorization'; @Injectable() export class AuthInterceptor implements HttpInterceptor { constructor(private token: TokenStorageService) {} diff --git a/frontend/src/app/Helpers/helper.service.spec.ts b/frontend/src/app/Helpers/helper.service.spec.ts new file mode 100644 index 0000000..00b56e5 --- /dev/null +++ b/frontend/src/app/Helpers/helper.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { HelperService } from './helper.service'; + +describe('HelperService', () => { + let service: HelperService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(HelperService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/Helpers/helper.service.ts b/frontend/src/app/Helpers/helper.service.ts new file mode 100644 index 0000000..ac7ca1c --- /dev/null +++ b/frontend/src/app/Helpers/helper.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@angular/core'; +import { Stock } from '../Models/stock.model'; + +@Injectable({ + providedIn: 'root' +}) +export class HelperService { + + constructor() { } +} diff --git a/frontend/src/app/Models/stock.model.ts b/frontend/src/app/Models/stock.model.ts new file mode 100644 index 0000000..4220de6 --- /dev/null +++ b/frontend/src/app/Models/stock.model.ts @@ -0,0 +1,6 @@ +export class Stock { + count = 0; + price = 0; + symbol = ''; + time = ''; +} diff --git a/frontend/src/app/Services/data.service.ts b/frontend/src/app/Services/data.service.ts index 4419d9f..bbd1863 100644 --- a/frontend/src/app/Services/data.service.ts +++ b/frontend/src/app/Services/data.service.ts @@ -1,6 +1,6 @@ -import { Injectable } from '@angular/core'; +import { Injectable, OnInit } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { delay, Observable } from 'rxjs'; import { TokenStorageService } from './token.service'; const API_URL = 'https://aktienbot.flokaiser.com/api/'; @Injectable({ @@ -12,26 +12,32 @@ export class DataService { private tokenStorage: TokenStorageService ) {} - headers = new HttpHeaders({ - 'Content-Type': 'application/json', - Authorization: 'Bearer ' + this.tokenStorage.getToken(), - }); - - async getStockData() { - await this.http - .get(API_URL + 'portfolio', { - headers: this.headers, - responseType: 'text', - }) - .subscribe((data) => { - console.log(data); - return data; - }); + public getStockData(): Observable { + return this.http.get(API_URL + 'portfolio', { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + this.tokenStorage.getToken(), + }), + responseType: 'text', + }); } - getKeywords(): Observable { + public getTransactionData(): Observable { + return this.http.get(API_URL + 'transactions', { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + this.tokenStorage.getToken(), + }), + responseType: 'text', + }); + } + + public getKeywords(): Observable { return this.http.get(API_URL + 'keywords', { - headers: this.headers, + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + this.tokenStorage.getToken(), + }), responseType: 'text', }); } diff --git a/frontend/src/app/Views/dashboard/dashboard.component.html b/frontend/src/app/Views/dashboard/dashboard.component.html index 6e0692a..5c1b401 100644 --- a/frontend/src/app/Views/dashboard/dashboard.component.html +++ b/frontend/src/app/Views/dashboard/dashboard.component.html @@ -64,7 +64,39 @@
Transaktionen
- +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Count{{ element.position }}Pirce{{ element.name }}Symbol{{ element.weight }}Time{{ element.symbol }}
+
diff --git a/frontend/src/app/Views/dashboard/dashboard.component.ts b/frontend/src/app/Views/dashboard/dashboard.component.ts index ff2d717..27a6140 100644 --- a/frontend/src/app/Views/dashboard/dashboard.component.ts +++ b/frontend/src/app/Views/dashboard/dashboard.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { throwToolbarMixedModesError } from '@angular/material/toolbar'; import { DataService } from 'src/app/Services/data.service'; +import { TokenStorageService } from 'src/app/Services/token.service'; export interface PeriodicElement { name: string; @@ -49,11 +50,15 @@ const ELEMENT_DATA: PeriodicElement[] = [ }) export class DashboardComponent implements OnInit { constructor(private dataService: DataService) {} - - //TODO avoid using ngOnInit() like this - //TODO fix server problems - async ngOnInit() { - const data = await this.dataService.getStockData(); + ngOnInit() { + this.dataService.getStockData().subscribe((response: any) => { + console.log(response); + //TODO map data on array for display + }); + this.dataService.getTransactionData().subscribe((response: any) => { + console.log(response); + //TODO map data on array for display + }); } displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; diff --git a/frontend/src/app/Views/login/login.component.ts b/frontend/src/app/Views/login/login.component.ts index 2837bd2..a020f4a 100644 --- a/frontend/src/app/Views/login/login.component.ts +++ b/frontend/src/app/Views/login/login.component.ts @@ -29,7 +29,7 @@ export class LoginComponent implements OnInit { private router: Router ) {} - //ngOnInit() checks if a + //ngOnInit() checks if a user is logged in ngOnInit(): void { this.tokenStorage.signOut(); if (this.tokenStorage.getToken()) { -- 2.45.2 From 879423f7c79a6d61ef93f181d7a62e9133cc9d34 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Mon, 28 Mar 2022 17:51:10 +0200 Subject: [PATCH 90/91] Use user id instead of email --- api/helper_functions.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/api/helper_functions.py b/api/helper_functions.py index 7f25059..4ebf10e 100644 --- a/api/helper_functions.py +++ b/api/helper_functions.py @@ -41,12 +41,17 @@ def get_email_from_token_data(): if token is not None: if ':' in token: # Maybe bot token, check if token valid and return username after ":" then - email = token.split(":")[1] + telegram_user_id = token.split(":")[1] token = token.split(":")[0] try: if jwt.decode(token, os.getenv('SECRET_KEY'), algorithms=["HS256"])['email'] == os.getenv("BOT_EMAIL"): - return email + res = db.session.query(User).filter_by(telegram_user_id=telegram_user_id).first() + + if res is not None: + return res.as_dict()['email'] + else: + return None else: return None except jwt.PyJWTError: -- 2.45.2 From 482bf70756839eff4aac28e68a5808ebfdc60163 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Mon, 28 Mar 2022 17:56:59 +0200 Subject: [PATCH 91/91] increase token expiration for bot user --- api/api_blueprint_user.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/api_blueprint_user.py b/api/api_blueprint_user.py index 1a6bccc..ad2ec2b 100644 --- a/api/api_blueprint_user.py +++ b/api/api_blueprint_user.py @@ -59,7 +59,10 @@ def login(data): if not check_password(query_user.password, password.encode("utf-8")): # Password incorrect abort(500, message="Unable to login") - token = jwt.encode({'email': query_user.email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=45)}, os.getenv('SECRET_KEY'), "HS256") + if query_user.email == os.getenv("BOT_EMAIL"): + token = jwt.encode({'email': query_user.email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=365)}, os.getenv('SECRET_KEY'), "HS256") + else: + token = jwt.encode({'email': query_user.email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)}, os.getenv('SECRET_KEY'), "HS256") return make_response({"token": token}, 200, "Successfully logged in") -- 2.45.2