diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/edu-dis-labs.iml b/.idea/edu-dis-labs.iml new file mode 100644 index 0000000..e69de29 diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5f22521 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c0d2c6d..10bfb65 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -67,10 +67,6 @@ module.exports = { path:"/conclusion/" }, - { - title: 'API', - path:"/api/" - } ], sidebarDepth: 2, diff --git a/docs/README.md b/docs/README.md index cb7c880..c8cf408 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,24 +6,12 @@ actionLink: /intro/ footer: "ECL 2.0 Licensed | Copyright © 2024 [Your Name]" --- -**Виконали:** +**Виконала:** -*студенти 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)]* +*студентка 2-го курсу, групи ІО-23:* *Вікторія ВОДЯНА [vodyanayaviktoria@gmail.com, [@victoriavodyana](https://t.me/victoriavodyana)]* -*Михайло КОРБУТ [korbutmykhailo@gmail.com, [@misha1tigr](https://t.me/misha1tigr)]* - -*Олександр ГУРАНЕЦЬ [bacant150@gmail.com, [@Bacant150](https://t.me/Bacant150)]* - **Керівник** diff --git a/docs/conclusion/README.md b/docs/conclusion/README.md index 0076ccc..7708ba1 100644 --- a/docs/conclusion/README.md +++ b/docs/conclusion/README.md @@ -1,12 +1,9 @@ # Висновки -У висновках наводять оцінку отриманих результатів, можливі галузі його використання. Висновки повинні містити в собі коротку узагальнену оцінку результатів розробки, у -тому числі і з погляду на їх технічно-економічну ефективність. Необхідно порівняти -отримані результати усіх характеристик об’єкта проєктування із завданням і з основними показниками сучасних аналогічних об’єктів. +У цьому проєкті була використана локальна база даних для зберігання інформації. Розроблена серверна частина надає RESTful-інтерфейс для доступу до цієї бази даних. Цей інтерфейс може використовуватися для взаємодії з таблицею питань (survey), що дозволяє здійснювати операції читання, запису, оновлення та видалення даних через HTTP-запити. Такий підхід забезпечує зручний та ефективний спосіб взаємодії з базою даних і відкриває широкі можливості для розвитку та розширення функціональності системи. -Необхідно вказати яке нове технічне рішення покладене в основу проєкту і у чому її -переваги, що нового було запропоновано самим студентом. -На базі отриманих висновків можуть надаватися рекомендації по використанню розробки. Вони повинні -мати конкретний характер і бути цілком підтверджені проєктом. +Технічне рішення, що покладене в основу проєкту, полягає у використанні мови програмування Python та веб-фреймворку Flask для створення RESTful сервісу. Це дозволило забезпечити швидку реалізацію системи та забезпечити її продуктивність та масштабованість. + +Отримана система дозволяє автоматизувати процес збору та аналізу відповідей, що значно знижує час та ресурси, необхідні для проведення таких опитувань. Завдяки використанню сучасних технологій, таких як Flask, система має високу продуктивність та може легко масштабуватися відповідно до потреб користувачів. diff --git a/docs/software/README.md b/docs/software/README.md index bef4c7c..8ce74a4 100644 --- a/docs/software/README.md +++ b/docs/software/README.md @@ -110,4 +110,67 @@ ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; -``` \ No newline at end of file +``` +## RESTfull-сервіс для керування опитуваннями + +Код серверу (Python, Flask) для таблиці "survey": +```from flask import Flask, request, jsonify +from flask_sqlalchemy import SQLAlchemy + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb' +db = SQLAlchemy(app) + +class Survey(db.Model): + id = db.Column(db.Integer, primary_key=True) + isPaused = db.Column(db.Boolean) + isNamed = db.Column(db.Boolean) + name = db.Column(db.String(255)) + duration = db.Column(db.Integer) + account_id = db.Column(db.Integer) + + def __repr__(self): + return f"" + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + +@app.route("/api/survey", methods=["GET", "POST"]) +def api_survey(): + if request.method == "GET": + surveys = Survey.query.all() + return jsonify([survey.as_dict() for survey in surveys]) + + elif request.method == "POST": + data = request.json + new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'], + duration=data['duration'], account_id=data['account_id']) + db.session.add(new_survey) + db.session.commit() + return jsonify({'success': True}), 201 + +@app.route("/api/survey/", methods=["GET", "PUT", "DELETE"]) +def api_survey_numbered(survey_id): + survey = Survey.query.get_or_404(survey_id) + + if request.method == "GET": + return jsonify(survey.as_dict()) + + elif request.method == "PUT": + data = request.json + survey.isPaused = data['isPaused'] + survey.isNamed = data['isNamed'] + survey.name = data['name'] + survey.duration = data['duration'] + survey.account_id = data['account_id'] + db.session.commit() + return jsonify({'success': True}) + + elif request.method == "DELETE": + db.session.delete(survey) + db.session.commit() + return jsonify({'success': True}) + +if __name__ == '__main__': + app.run(debug=True) +''' \ No newline at end of file diff --git a/docs/test/README.md b/docs/test/README.md index 4cf2563..6ae6d24 100644 --- a/docs/test/README.md +++ b/docs/test/README.md @@ -1,4 +1,34 @@ # Тестування працездатності системи -*В цьому розділі необхідно вказати засоби тестування, навести вихідні коди тестів та результати тестування.* +Тестування працездатності системи +Для тестування системи використовувся додаток Postman + +Запуск сервера: +![alt text](image.png) + +Метод POST +POST Survey +Запит та відповідь: +![alt text](image-1.png) + +Перевірка за допомогою GET: +![![alt text](image-2.png)](image-2.png) + +Метод PUT +PUT Survey +Запит та відповідь: +![alt text](image-3.png) + +Перевірка за допомогою GET: +![alt text](image-4.png) + +Метод DELETE +DELETE Survey +Запит та відповідь: +![alt text](image-5.png) + +Перевірка за допомогою GET: +![alt text](image-6.png) + + diff --git a/docs/test/image-1.png b/docs/test/image-1.png new file mode 100644 index 0000000..32b034b Binary files /dev/null and b/docs/test/image-1.png differ diff --git a/docs/test/image-2.png b/docs/test/image-2.png new file mode 100644 index 0000000..2b69373 Binary files /dev/null and b/docs/test/image-2.png differ diff --git a/docs/test/image-3.png b/docs/test/image-3.png new file mode 100644 index 0000000..9326a50 Binary files /dev/null and b/docs/test/image-3.png differ diff --git a/docs/test/image-4.png b/docs/test/image-4.png new file mode 100644 index 0000000..29f13bd Binary files /dev/null and b/docs/test/image-4.png differ diff --git a/docs/test/image-5.png b/docs/test/image-5.png new file mode 100644 index 0000000..7de394f Binary files /dev/null and b/docs/test/image-5.png differ diff --git a/docs/test/image-6.png b/docs/test/image-6.png new file mode 100644 index 0000000..eb4ed06 Binary files /dev/null and b/docs/test/image-6.png differ diff --git a/docs/test/image.png b/docs/test/image.png new file mode 100644 index 0000000..6772fe6 Binary files /dev/null and b/docs/test/image.png differ diff --git a/src/restful-server/__pycache__/serverSurvey.cpython-312.pyc b/src/restful-server/__pycache__/serverSurvey.cpython-312.pyc new file mode 100644 index 0000000..31d34fe Binary files /dev/null and b/src/restful-server/__pycache__/serverSurvey.cpython-312.pyc differ diff --git a/src/restful-server/flask b/src/restful-server/flask new file mode 100644 index 0000000..e69de29 diff --git a/src/restful-server/serverSurvey.py b/src/restful-server/serverSurvey.py new file mode 100644 index 0000000..21df043 --- /dev/null +++ b/src/restful-server/serverSurvey.py @@ -0,0 +1,62 @@ +from flask import Flask, request, jsonify +from flask_sqlalchemy import SQLAlchemy + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234@localhost/odb' +db = SQLAlchemy(app) + +class Survey(db.Model): + id = db.Column(db.Integer, primary_key=True) + isPaused = db.Column(db.Boolean) + isNamed = db.Column(db.Boolean) + name = db.Column(db.String(255)) + duration = db.Column(db.Integer) + account_id = db.Column(db.Integer) + + def __repr__(self): + return f"" + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + +@app.route("/api/survey", methods=["GET", "POST"]) +def api_survey(): + if request.method == "GET": + surveys = Survey.query.all() + return jsonify([survey.as_dict() for survey in surveys]) + + elif request.method == "POST": + data = request.json + new_survey = Survey(isPaused=data['isPaused'], isNamed=data['isNamed'], name=data['name'], + duration=data['duration'], account_id=data['account_id']) + db.session.add(new_survey) + db.session.commit() + return jsonify({'success': True}), 201 + +@app.route("/api/survey/", methods=["GET", "PUT", "DELETE"]) +def api_survey_numbered(survey_id): + survey = Survey.query.get_or_404(survey_id) + + + if request.method == "GET": + return jsonify(survey.as_dict()) + + elif request.method == "PUT": + data = request.json + + survey.isPaused = data['isPaused'] + survey.isNamed = data['isNamed'] + survey.name = data['name'] + survey.duration = data['duration'] + survey.account_id = data['account_id'] + + db.session.commit() + return jsonify({'success': True}) + + elif request.method == "DELETE": + db.session.delete(survey) + db.session.commit() + return jsonify({'success': True}) + +if __name__ == '__main__': + app.run(debug=True)