From f8a792ce7b4cc27ecbebaa28f478215131ca1a19 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Tue, 21 May 2024 21:40:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B16:=20=D0=B0=D0=B4=D0=B0=D0=BF?= =?UTF-8?q?=D1=82=D1=83=D0=B2=D0=B0=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D1=80=D1=96=D0=B9=20=D1=82=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B8,=20?= =?UTF-8?q?=D1=89=D0=BE=20=D1=81=D1=82=D0=BE=D1=81=D1=83=D1=8E=D1=82=D1=8C?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BB=D0=B0=D0=B1.=20=E2=84=966?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.js | 5 - docs/README.md | 18 +-- docs/conclusion/README.md | 15 +-- docs/software/README.md | 221 +++++++++++++++++++++++++++++++++++ docs/test/README.md | 195 ++++++++++++++++++++++++++++++- src/restful-server/server.py | 214 +++++++++++++++++++++++++++++++++ 6 files changed, 640 insertions(+), 28 deletions(-) create mode 100644 src/restful-server/server.py diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c0d2c6d..4981eb4 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -66,11 +66,6 @@ module.exports = { title: 'Висновки', path:"/conclusion/" }, - - { - title: 'API', - path:"/api/" - } ], sidebarDepth: 2, diff --git a/docs/README.md b/docs/README.md index cb7c880..7fcff52 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,23 +6,11 @@ actionLink: /intro/ footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]" --- -**Виконали:** +**Виконав:** -*студенти 2-го курсу, групи ІО-23:* +*студент 2-го курсу, групи ІО-23:* -*Олег ШМУЛЯР [shmuliar1@ukr.net, [@dmytrofiot23](https://t.me/dmytrofiot23)]* - -*Андрій БОДНАР [bodnarandrew123@gmail.com, [@andrux4](https://t.me/andrux4)]* - -*Андрій ШВЕД [andreyfrog26@gmail.com, [@Rhinemann](https://t.me/Rhinemann)]* - -*Євгеній ГОЛОВАТЕНКО [ievgeniigol@gmail.com, [@yevholova](https://t.me/yevholova)]* - -*Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]* - -*Михайло КОРБУТ [korbutmykhailo@gmail.com, [@misha1tigr](https://t.me/misha1tigr)]* - -*Олександр ГУРАНЕЦЬ [bacant150@gmail.com, [@Bacant150](https://t.me/Bacant150)]* +*Олег ШМУЛЯР [shmuliar1@ukr.net], [@dmytrofiot23](https://t.me/dmytrofiot23)* **Керівник** diff --git a/docs/conclusion/README.md b/docs/conclusion/README.md index 0076ccc..99b21be 100644 --- a/docs/conclusion/README.md +++ b/docs/conclusion/README.md @@ -1,12 +1,13 @@ # Висновки -У висновках наводять оцінку отриманих результатів, можливі галузі його використання. Висновки повинні містити в собі коротку узагальнену оцінку результатів розробки, у -тому числі і з погляду на їх технічно-економічну ефективність. Необхідно порівняти -отримані результати усіх характеристик об’єкта проєктування із завданням і з основними показниками сучасних аналогічних об’єктів. +В результаті проведеної роботи ми розробили модель бази даних, яку можна використовувати для реалізації систем проведення експертних опитувань. В рамках цього відгалуження розробив серверну частину, що надає RESTFUL-інтерфейс для доступу до бази даних. Вона може використовуватися для взаємодії з будь-якою з таблиць, проте я приділив окрему увагу розширенню гнучкості інтерфейсу взаємодії з таблицею опитувань (survey). -Необхідно вказати яке нове технічне рішення покладене в основу проєкту і у чому її -переваги, що нового було запропоновано самим студентом. +Проєкт мав на меті реалізацію двох ключових особливостей: +- оптимальність використання мережі +- гнучкість у застосуванні -На базі отриманих висновків можуть надаватися рекомендації по використанню розробки. Вони повинні -мати конкретний характер і бути цілком підтверджені проєктом. +Оптимальність використання мережі досягається використанням протоколу HTTP без домішок у вигляді додаткових бібліотек, фреймворків, аналітики, відстеження дій користувачів тощо. Завдяки цьому середній обсяг повідомлення становить до 100 байтів, тому сервер, за використання з'єднання з пропускною здатністю 1 Gb/s, зможе обробляти до 1.34 млн повідомлень щосекунди, а це дозволить обслуговувати близько 400 тис. користувачів одночасно. В свою чергу, користувачі зможуть отримувати обслуговування від сервера навіть за умов поганого мережевого з'єднання, що дуже актуально в сучасних реаліях (вимкнення електропостачання, перебої зі зв'язком тощо). +Гнучкість проєкту досягається завдяки простій архітектурі, що не прив'язана до визначених ролей. Натомість, кожен зареєстрований користувач може використовувати можливості системи в повному обсязі, що робить її універсальною для виконання багатьох завдань: від збору думок вузького кола співробітників до проведення масштабних статистичних досліджень із залученням мільйонів користувачів. + +Отже, наша розробка досягла поставленої мети й є особливо актуальною в умовах сьогодення. \ No newline at end of file diff --git a/docs/software/README.md b/docs/software/README.md index bef4c7c..2544fe0 100644 --- a/docs/software/README.md +++ b/docs/software/README.md @@ -110,4 +110,225 @@ ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; +``` + +## RESTfull-сервіс для керування опитуваннями + +Код серверу (Python, Flask): +```python +from flask import Flask, request +import mariadb as mdb +import json +import sys + +def init_db(): + return mdb.connect(host="127.0.0.1", port=3306, user="user", password="testing432") + +c = 0 + +app = Flask(__name__) + +@app.route("/api/", methods = ["GET", "POST", "PUT", "DELETE"]) +def api_test(endpoint): + se = endpoint + + match se: + case "counter": + global c + c += 1 + case "account": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, username FROM odb.account;") + r = [{"id": i, "username": j} for i, j in cur] + c.close() + return json.dumps(r) + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.account (username, password) VALUES (\"{d['username']}\", \"{d['password']}\");") + c.commit() + c.close() + return '{"success": true}\n' + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.account SET username = \"{d['username']}\", password = \"{d['password']}\" WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, username FROM odb.account WHERE id = {d['id']};") + r = [{"id": i, "username": j} for i, j in cur] + cur.execute(f"DELETE FROM odb.account WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + case "survey": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey;") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.survey (isPaused, isNamed, name, duration, account_id) VALUES ({d['isPaused']}, {d['isNamed']}, \"{d['name']}\", \"{d['duration']}\", {d['account_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.survey SET isPaused = {d['isPaused']}, isNamed = {d['isNamed']}, name = \"{d['name']}\", duration = \"{d['duration']}\" WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {d['id']};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + cur.execute(f"DELETE FROM odb.survey WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "link": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, uses, responces, usageLimit, responceLimit, path, survey_id FROM odb.link;") + r = [{"id": i[0], "uses": i[1], "responces": i[2], "usageLimit": i[3], "responceLimit": i[4], "path": i[5], "survey_id": i[6]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.link (usageLimit, responceLimit, path, survey_id) VALUES ({d['usageLimit']}, {d['responceLimit']}, \"{d['path']}\", {d['survey_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.link SET uses = {d['uses']}, responces = {d['responces']}, usageLimit = \"{d['usageLimit']}\", responceLimit = \"{d['responceLimit']}\", path = \"{d['path']}\", survey_id = {d['survey_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, uses, responces, usageLimit, responceLimit, path, survey_id FROM odb.survey WHERE id = {d['id']};") + r = [{"id": i[0], "uses": i[1], "responces": i[2], "usageLimit": i[3], "responceLimit": i[4], "path": i[5], "survey_id": i[6]} for i in cur] + cur.execute(f"DELETE FROM odb.link WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "question": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, text, survey_id FROM odb.question;") + r = [{"id": i[0], "text": i[1], "survey_id": i[2]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.question (text, survey_id) VALUES (\"{d['text']}\", {d['survey_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.question SET text = \"{d['text']}\", survey_id = {d['survey_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, text, survey_id FROM odb.question WHERE id = {d['id']};") + r = [{"id": i[0], "text": i[1], "survey_id": i[2]} for i in cur] + cur.execute(f"DELETE FROM odb.question WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "responce": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, value, question_id, account_id FROM odb.responce;") + r = [{"id": i[0], "value": i[1], "question_id": i[2], "account_id": i[3]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.responce (text, question_id, account_id) VALUES (\"{d['value']}\", {d['question_id']}, {d['account_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.responce SET value = \"{d['value']}\", question_id = {d['question_id']}, account_id = {d['account_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, value, question_id, account_id FROM odb.responce WHERE id = {d['id']};") + r = [{"id": i[0], "value": i[1], "question_id": i[2], "account_id": i[3]} for i in cur] + cur.execute(f"DELETE FROM odb.responce WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + case _: + return f"work {c}\n" + +@app.route("/api/survey/", methods = ["GET", "PUT", "DELETE"]) +def api_numbered(no): + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {no};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + c.close() + return json.dumps(r) + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.survey SET isPaused = {d['isPaused']}, isNamed = {d['isNamed']}, name = \"{d['name']}\", duration = \"{d['duration']}\" WHERE id = {no};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {no};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + cur.execute(f"DELETE FROM odb.survey WHERE id = {no};") + c.commit() + c.close() + return f'{r}\n' + ``` \ No newline at end of file diff --git a/docs/test/README.md b/docs/test/README.md index 4cf2563..a8ace24 100644 --- a/docs/test/README.md +++ b/docs/test/README.md @@ -1,4 +1,197 @@ # Тестування працездатності системи -*В цьому розділі необхідно вказати засоби тестування, навести вихідні коди тестів та результати тестування.* +## Передумови +1. Налаштування віртуального середовища +```bash +python3 -m venv . +source bin/activate.fish +pip3 install flask mariadb +``` +2. Запуск сервера: +```bash +flask --app server run +``` + +## Тестування компонентів + +Система має два варіанти передачі індексів: у рядку шляху або в тілі запиту. Перевіримо, як працюють обидва варіанти. + +### /api/survey + +Цей шлях дозволяє використовувати всі 4 HTTP-методи, що використовуються в домовленості REST (GET, POST, PUT, DELETE). +Протестуємо кожен з них на практичному прикладі: + +
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -s http://127.0.0.1:5000/api/survey | jq .
+[
+  {
+    "id": 1,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 1",
+    "duration": "1w",
+    "account_id": 10
+  },
+  {
+    "id": 4,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 2",
+    "duration": "1w",
+    "account_id": 5
+  }
+]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -X POST -d '{"isPaused": false, "isNamed": true, "name": "Test 3", "duration": "1w", "account_id": 2}' --header "Content-Type: application/json" http://127.0.0.1:5000/api/survey
+{"success": true}
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -s http://127.0.0.1:5000/api/survey | jq .
+[
+  {
+    "id": 1,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 1",
+    "duration": "1w",
+    "account_id": 10
+  },
+  {
+    "id": 4,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 2",
+    "duration": "1w",
+    "account_id": 5
+  },
+  {
+    "id": 12,
+    "isPaused": 0,
+    "isNamed": 1,
+    "name": "Test 3",
+    "duration": "1w",
+    "account_id": 2
+  }
+]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -X PUT -d '{"id": 8, "isPaused": true, "isNamed": true, "name": "Test 3", "duration": "4w", "account_id": 2}' --header "Content-Type: application/json" http://127.0.0.1:5000/api/survey
+{"success": true}
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -s http://127.0.0.1:5000/api/survey | jq .
+[
+  {
+    "id": 1,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 1",
+    "duration": "1w",
+    "account_id": 10
+  },
+  {
+    "id": 4,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 2",
+    "duration": "1w",
+    "account_id": 5
+  },
+  {
+    "id": 12,
+    "isPaused": 1,
+    "isNamed": 1,
+    "name": "Test 3",
+    "duration": "4w",
+    "account_id": 2
+  }
+]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -X DELETE -d '{"id": 12}' --header "Content-Type: application/json" http://127.0.0.1:5000/api/survey
+[{'id': 12, 'isPaused': 1, 'isNamed': 1, 'name': 'Test 3', 'duration': '4w', 'account_id': 2}]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/demo (master)> curl -s http://127.0.0.1:5000/api/survey | jq .
+[
+  {
+    "id": 1,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 1",
+    "duration": "1w",
+    "account_id": 10
+  },
+  {
+    "id": 4,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 2",
+    "duration": "1w",
+    "account_id": 5
+  }
+]
+
+ +### /api/survey/\ + +У цьому випадку доступні лише 3 методи (GET, PUT, DELETE), оскільки під час створення нового опитування його ідентифікатор визначається безпосередньо базою даних. + +
+user@debian-laptop ~/D/f/t/f/d/m/e/s/restful-server (master)> curl -s http://127.0.0.1:5000/api/survey | jq .
+[
+  {
+    "id": 1,
+    "isPaused": 0,
+    "isNamed": 0,
+    "name": "Test 1",
+    "duration": "1w",
+    "account_id": 10
+  },
+  {
+    "id": 4,
+    "isPaused": 0,
+    "isNamed": 1,
+    "name": "Test 3",
+    "duration": "1w",
+    "account_id": 5
+  }
+]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/restful-server (master)> curl -X PUT \
+-d '{"isPaused": true,
+"isNamed": true,
+"name": "Test 4",
+"duration": "2w"}' \
+--header "Content-Type: application/json" \
+-s http://127.0.0.1:5000/api/survey/4 
+{"success": true}
+user@debian-laptop ~/D/f/t/f/d/m/e/s/restful-server (master)> curl -s http://127.0.0.1:5000/api/survey/4 | jq .
+[
+  {
+    "id": 4,
+    "isPaused": 1,
+    "isNamed": 1,
+    "name": "Test 4",
+    "duration": "2w",
+    "account_id": 5
+  }
+]
+user@debian-laptop ~/D/f/t/f/d/m/e/s/restful-server (master)> curl -v -X DELETE --header "Content-Type: application/json" -d '{}' http://127.0.0.1:5000/api/survey/4 
+*   Trying 127.0.0.1:5000...
+* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
+> DELETE /api/survey/4 HTTP/1.1
+> Host: 127.0.0.1:5000
+> User-Agent: curl/7.88.1
+> Accept: */*
+> Content-Type: application/json
+> Content-Length: 2
+> 
+< HTTP/1.1 200 OK
+< Server: Werkzeug/3.0.3 Python/3.11.2
+< Date: Tue, 21 May 2024 14:45:09 GMT
+< Content-Type: text/html; charset=utf-8
+< Content-Length: 94
+< Connection: close
+< 
+[{'id': 4, 'isPaused': 1, 'isNamed': 1, 'name': 'Test 4', 'duration': '2w', 'account_id': 5}]
+* Closing connection 0
+user@debian-laptop ~/D/f/t/f/d/m/e/s/restful-server (master)>
+
+ +Бачимо, що ми можемо отримувати інформацію про окремі опитування, змінювати та видаляти їх. \ No newline at end of file diff --git a/src/restful-server/server.py b/src/restful-server/server.py new file mode 100644 index 0000000..337326e --- /dev/null +++ b/src/restful-server/server.py @@ -0,0 +1,214 @@ +from flask import Flask, request +import mariadb as mdb +import json +import sys + +def init_db(): + return mdb.connect(host="127.0.0.1", port=3306, user="user", password="testing432") + +c = 0 + +app = Flask(__name__) + +@app.route("/api/", methods = ["GET", "POST", "PUT", "DELETE"]) +def api_test(endpoint): + se = endpoint + + match se: + case "counter": + global c + c += 1 + case "account": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, username FROM odb.account;") + r = [{"id": i, "username": j} for i, j in cur] + c.close() + return json.dumps(r) + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.account (username, password) VALUES (\"{d['username']}\", \"{d['password']}\");") + c.commit() + c.close() + return '{"success": true}\n' + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.account SET username = \"{d['username']}\", password = \"{d['password']}\" WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, username FROM odb.account WHERE id = {d['id']};") + r = [{"id": i, "username": j} for i, j in cur] + cur.execute(f"DELETE FROM odb.account WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + case "survey": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey;") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.survey (isPaused, isNamed, name, duration, account_id) VALUES ({d['isPaused']}, {d['isNamed']}, \"{d['name']}\", \"{d['duration']}\", {d['account_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.survey SET isPaused = {d['isPaused']}, isNamed = {d['isNamed']}, name = \"{d['name']}\", duration = \"{d['duration']}\" WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {d['id']};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + cur.execute(f"DELETE FROM odb.survey WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "link": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, uses, responces, usageLimit, responceLimit, path, survey_id FROM odb.link;") + r = [{"id": i[0], "uses": i[1], "responces": i[2], "usageLimit": i[3], "responceLimit": i[4], "path": i[5], "survey_id": i[6]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.link (usageLimit, responceLimit, path, survey_id) VALUES ({d['usageLimit']}, {d['responceLimit']}, \"{d['path']}\", {d['survey_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.link SET uses = {d['uses']}, responces = {d['responces']}, usageLimit = \"{d['usageLimit']}\", responceLimit = \"{d['responceLimit']}\", path = \"{d['path']}\", survey_id = {d['survey_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, uses, responces, usageLimit, responceLimit, path, survey_id FROM odb.survey WHERE id = {d['id']};") + r = [{"id": i[0], "uses": i[1], "responces": i[2], "usageLimit": i[3], "responceLimit": i[4], "path": i[5], "survey_id": i[6]} for i in cur] + cur.execute(f"DELETE FROM odb.link WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "question": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, text, survey_id FROM odb.question;") + r = [{"id": i[0], "text": i[1], "survey_id": i[2]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.question (text, survey_id) VALUES (\"{d['text']}\", {d['survey_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.question SET text = \"{d['text']}\", survey_id = {d['survey_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, text, survey_id FROM odb.question WHERE id = {d['id']};") + r = [{"id": i[0], "text": i[1], "survey_id": i[2]} for i in cur] + cur.execute(f"DELETE FROM odb.question WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + + case "responce": + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute("SELECT id, value, question_id, account_id FROM odb.responce;") + r = [{"id": i[0], "value": i[1], "question_id": i[2], "account_id": i[3]} for i in cur] + c.close() + return json.dumps(r) + + case "POST": + d = request.get_json() + cur.execute(f"INSERT INTO odb.responce (text, question_id, account_id) VALUES (\"{d['value']}\", {d['question_id']}, {d['account_id']});") + c.commit() + c.close() + return '{"success": true}\n' + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.responce SET value = \"{d['value']}\", question_id = {d['question_id']}, account_id = {d['account_id']} WHERE id = {d['id']};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + d = request.get_json() + cur.execute(f"SELECT id, value, question_id, account_id FROM odb.responce WHERE id = {d['id']};") + r = [{"id": i[0], "value": i[1], "question_id": i[2], "account_id": i[3]} for i in cur] + cur.execute(f"DELETE FROM odb.responce WHERE id = {d['id']};") + c.commit() + c.close() + return f'{r}\n' + case _: + return f"work {c}\n" + +@app.route("/api/survey/", methods = ["GET", "PUT", "DELETE"]) +def api_numbered(no): + c = init_db() + cur = c.cursor() + + match request.method: + case "GET": + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {no};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + c.close() + return json.dumps(r) + + case "PUT": + d = request.get_json() + cur.execute(f"UPDATE odb.survey SET isPaused = {d['isPaused']}, isNamed = {d['isNamed']}, name = \"{d['name']}\", duration = \"{d['duration']}\" WHERE id = {no};") + c.commit() + c.close() + return '{"success": true}\n' + + case "DELETE": + cur.execute(f"SELECT id, isPaused, isNamed, name, duration, account_id FROM odb.survey WHERE id = {no};") + r = [{"id": i[0], "isPaused": i[1], "isNamed": i[2], "name": i[3], "duration": i[4], "account_id": i[5]} for i in cur] + cur.execute(f"DELETE FROM odb.survey WHERE id = {no};") + c.commit() + c.close() + return f'{r}\n'