diff --git a/.gitignore b/.gitignore index 67045665d..bd5bf1fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,8 @@ dist # TernJS port file .tern-port + +#.idea from WebStorm +.idea + +.vs/ \ No newline at end of file diff --git a/README.md b/README.md index bfd470aa6..2e9d8a99d 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,13 @@ +# Репозиторій для виконання курсової роботи з дисципліни "Бази даних" -# Шаблон репозиторію для виконання курсової роботи з дисципліни "Бази даних" +## Тема: Система управління відкритими даними -## Як використовувати +### Виконали: -В цьому репозиторії знаходиться шаблон для виконання курсової роботи. +* Євгеній Семиволос (telegram: [e_semivolos](https://t.me/e_semivolos)) +* Володимир Андріященко (telegram: [lekoaaa](https://t.me/lekoaaa)) +* Михайло Ватажко (telegram: [mmishav](https://t.me/mmishav)) +* Андрій Щегель (telegram: [SolarUlt](https://t.me/SolarUlt)) +* Дмитро Сенчило (telegram: [senchylo](https://t.me/senchylo)) -Для виконання курсової роботи необхідно зробити ```fork``` цього репозіторію, склонувати вже власний репозіторій та розміщувати документацію у відповідних діректоріях ```./docs```. - -В цьому файлі необхідно вказати назву проекту. Коротку загальну характеристику -проекту, контактні дані виконавця, посилання на репо співвиконавців(за необхідністю). - - -Шаблон публікування курсової роботи підготовлено з використанням [VuePress](https://vuepress.vuejs.org/), та стартера -[FriendlyUser/vuepress-theme-cool-starter](https://github.com/FriendlyUser/vuepress-theme-cool-starter). - -Щоб опублікувати проект у Github Pages, налаштовуємо Github Pages (гілка ```gh-pages```), змінюємо файл ```./publish.sh``` - -```sh - -#!/usr/bin/env sh - -# abort on errors -set -e - -# build -npm run docs:build - -# navigate into the build output directory -cd docs/.vuepress/dist - -# if you are deploying to a custom domain -# echo 'www.example.com' > CNAME - -git init -git add -A -git commit -m 'deploy' - -# if you are deploying to https://.github.io -# git push -f git@github.com:boldak/.github.io.git master - -# if you are deploying to https://.github.io/ -git push -f https://github.com//dis-edu.git master:gh-pages - -cd - - -``` - -Потім запускаємо - -```bash - npm run publish -``` - -Для відлагодження документації в локальному режимі запускаємо - -```bash - npm run docs:dev -``` - -Доступ до локально опублікованої версії [http://localhost:3030](http://localhost:3030) - - -## Додаткова інформація - -- [Теми проєктів](./guidelines/themes.md) -- [Методичні вказівки](./guidelines/guidelines.md) - -***Happy learning! Happy coding!*** +**[Посилання на проект](https://eugenesemivolos.github.io/open-data-management-system/)** diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index ccba6f175..c9c47aac5 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,8 +1,8 @@ // .vuepress/config.js module.exports = { plugins: [ - '@vuepress/back-to-top', - '@vuepress/pwa', + '@vuepress/back-to-top', + '@vuepress/pwa', { serviceWorker: true, updatePopup: true @@ -15,14 +15,14 @@ module.exports = { }] ], port: 3030, - base: '/docs/', + base: '/open-data-management-system/', theme: 'cool', // dest: 'dist', head: [ ['link', { rel: 'icon', href: '/favicon.ico' }], ['link', { rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css' }], ['link', {href: 'https://fonts.googleapis.com/icon?family=Material+Icons', rel :'stylesheet'}], - + ], themeConfig: { // logo: './myAvatar.png', @@ -38,7 +38,7 @@ module.exports = { '/requirements/state-of-the-art', '/requirements/stakeholders-needs', ] - + }, { @@ -76,7 +76,7 @@ module.exports = { lastUpdated: 'Останнє оновлення', // string | boolean // Assumes GitHub. Can also be a full GitLab url. - repo: 'https://github.com/boldak/edu-db-cw', + repo: 'https://github.com/EugeneSemivolos/open-data-management-system', // Customising the header label // Defaults to "GitHub"/"GitLab"/"Bitbucket" depending on `themeConfig.repo` repoLabel: 'Github', @@ -95,7 +95,7 @@ module.exports = { // editLinkText: 'Ви можете покращити цю сторінку' }, - title: 'Назва проєкту', + title: 'Система управління відкритими даними', description: 'Курсова робота з дисципліни "Бази даних"', configureWebpack: { resolve: { @@ -112,4 +112,4 @@ module.exports = { md.use(require('markdown-it-admonition')) } } -} \ No newline at end of file +} diff --git a/docs/README.md b/docs/README.md index 9c28efeb0..95b8caf2e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,14 +3,13 @@ home: true actionText: Розпочати → actionLink: /intro/ -footer: "ECL 2.0 Licensed | Copyright © [YYYY] [Your Name]" +footer: "ECL 2.0 Licensed | Copyright © [2022] [Євгеній Семиволос]" --- -**Виконав(-ла):** - -*студент(-ка) 2-го курсу, групи (шифр групи)* **[ім’я ПРІЗВИЩЕ] [Посилання email, tg, fb]** +**Виконав:** +*студент 2-го курсу, групи ІМ-11* **Євгеній Семиволос (telegram: [e_semivolos](https://t.me/e_semivolos))** **Керівник** diff --git a/docs/design/README.md b/docs/design/README.md index 25658a9fd..bdd7abb2d 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -1,7 +1,330 @@ # Проєктування бази даних -В рамках проекту розробляється: -- модель бізнес-об'єктів -- ER-модель -- реляційна схема +### В рамках проекту розробляється: +## Модель бізнес-об'єктів + +
+ +@startuml + +entity User +entity User.id #ffffff +entity User.username #ffffff +entity User.email #ffffff +entity User.password #ffffff +entity User.avatar #ffffff + +entity Access + +entity DataFile +entity DataFile.id #ffffff +entity DataFile.name #ffffff +entity DataFile.description #ffffff +entity DataFile.file_csv #ffffff +entity DataFile.uploadDate #ffffff +entity DataFile.hasGraph #ffffff + +entity EditForm +entity EditForm.id #ffffff +entity EditForm.editorUsername #ffffff +entity EditForm.oldFile_csv #ffffff +entity EditForm.newFile_csv #ffffff +entity EditForm.editDate #ffffff + +entity Category +entity Category.id #ffffff +entity Category.name #ffffff + +entity Role +entity Role.name #ffffff +entity Role.id #ffffff +object RegisteredUser #ffffff +object Editor #ffffff +object Admin #ffffff + +entity FileCollection + +entity Permission +entity Permission.id #ffffff +entity Permission.name #ffffff +object Read #ffffff +object Edit #ffffff +object Download #ffffff +object Upload #ffffff +object Delete #ffffff +object ManageEditors #ffffff + +entity Donate +entity Donate.type #ffffff + + +Donate "1,1" -u- "0,*" User +Role "1,1" -r- "0,*" User + +RegisteredUser ..> Role : instanceOf +Editor ..> Role : instanceOf +Admin ..> Role : instanceOf + +Access "0,*" -u- "0,1" Role +Permission "0,1" -u- "0,*" Access +Permission.name -l-* Permission +Permission.id -r-* Permission +Read .u.> Permission : instanceOf +Edit .u.> Permission : instanceOf +Download .u.> Permission : instanceOf +Upload .u.> Permission : instanceOf +Delete .u.> Permission : instanceOf +ManageEditors .u.> Permission : instanceOf + +User "1,1" ---d- "0,*" FileCollection + +FileCollection "0,*" -d-- "1,1" DataFile + +EditForm "0,*" --u- "1,1" DataFile +Category "1,1" --u- "0,*" DataFile + + +User.id -d-* User +User.username -d-* User +User.email -d-* User +User.password -d-* User +User.avatar -d-* User + +DataFile.id -d-* DataFile +DataFile.name -d-* DataFile +DataFile.description -r-* DataFile +DataFile.file_csv -d-* DataFile +DataFile.uploadDate -d-* DataFile +DataFile.hasGraph -d-* DataFile + +Category.id -u-* Category +Category.name -u-* Category + +EditForm.id -r-* EditForm +EditForm.editorUsername -l-* EditForm +EditForm.oldFile_csv -u-* EditForm +EditForm.newFile_csv -u-* EditForm +EditForm.editDate -u-* EditForm + +Role.name -u-* Role +Role.id -r-* Role + +Donate.type -l-* Donate + +@enduml + +
+ +## ER-модель + +
+ +@startuml + +namespace AccountManagement { + +entity User <> { + id: INT + username: TEXT + email: TEXT + password: TEXT + avatar: TEXT +} +} + +namespace AccessPolicy { + +entity FileCollection + +entity Role <> { + id: INT + name: TEXT +} +object RegisteredUser #ffffff +object Editor #ffffff +object Admin #ffffff + +entity Access + +entity Permission <> { + name: TEXT + id: INT +} +object Read #ffffff +object Edit #ffffff +object Download #ffffff +object Upload #ffffff +object Delete #ffffff +object ManageEditors #ffffff + +entity Donate <> { + type: TEXT +} +} + + +namespace WorkWithData { + +entity DataFile <> { + id: INT + name: TEXT + description: TEXT + file_csv: TEXT + uploadDate: DATE + hasGraph: BOOL +} + +entity Category <> { + id: INT + name: TEXT +} + +entity EditForm <> { + id: INT + editorUsername: TEXT + oldFile_csv: TEXT + newFile_csv: TEXT + editDate: DATE +} + +} + + +Donate "1,1" -u- "0,*" User +Role "1,1" -r- "0,*" User + +RegisteredUser ..> Role : instanceOf +Editor ..> Role : instanceOf +Admin ..> Role : instanceOf + +Access "0,*" -u- "0,1" Role +Permission "0,1" -u- "0,*" Access +Read .u.> Permission : instanceOf +Edit .u.> Permission : instanceOf +Download .u.> Permission : instanceOf +Upload .u.> Permission : instanceOf +Delete .u.> Permission : instanceOf +ManageEditors .u.> Permission : instanceOf + +User "1,1" ---d- "0,*" FileCollection + +FileCollection "0,*" -d- "1,1" DataFile + +EditForm "0,*" -u- "1,1" DataFile +Category "1,1" -u- "0,*" DataFile + +@enduml + +
+ +## Опис моделей + +### User + +Сутність, яка являє собою обліковий запис користувача з особистою інформацією. + +Атрибути: + +- id - ідентифікаційний номер користувача. +- username - ім'я користувача в системі. +- email - поштова скринька користувача. +- password - пароль для входу в обліковий запис користувача. +- avatar - фотографія профілю користувача. + +### DataFile + +Сутність, яка являє собою файл з набором певних статистичних даних. + +Атрибути: + +- id - ідентифікаційний номер файлу. +- name - назва файлу. +- description - короткий опис змісту файлу. +- file_csv - формат відображення даних. +- uploadDate - дата завантаження файлу. +- hasGraph - чи є візуалізація графіком. + +### EditForm + +Сутність, яка являє собою форму для редагування даних у файлі. + +Атрибути: + +- id - ідентифікаційний номер форми. +- editorUsername - ім'я редактора, який вніс зміни у файл. +- oldFile_csv - старий незмінений файл. +- newFile_csv - новий змінений файл. +- editDate - змінені дані. + +### Category + +Сутність, яка являє собою категорію до якої належить файл даних. + +Атрибути: + +- id - ідентифікаційний номер категорії. +- name - назва категорії. + +### Role + +Сутність, яка являє собою роль користувача в системі. + +Атрибути: + +- id - ідентифікаційний номер ролі. +- name - назва ролі. + +Існують такі ролі: + +- RegisteredUser - зареєстрований користувач. +- Editor - редактор. +- Admin - адміністратор. + +### Permission + +Сутність, яка являє собою набір дозволів користувача в системі. + +Атрибути: + +- id - ідентифікаційний номер дозволу. +- name - назва дозволу. + +Існують такі дозволи: + +- Read - переглядати файл з набором даних у системі. +- Edit - змінювати файл з набором даних у системі, якщо є відповідний дозвіл для ролі. +- Download - скачувати файл з набором даних із системи на локальний комп'ютер. +- Upload - завантажувати файл з набором даних у систему, якщо є відповідний дозвіл для ролі. +- Delete - видаляти файл з набором даних із системи, якщо є відповідний дозвіл для ролі. +- ManageEditors - управляти редакторами системи, якщо є відповідний дозвіл для ролі. + +### Donate + +Сутність, яка являє собою систему для пожертвування певної кількості коштів. + +Атрибути: + +- type - тип донату. + +### FileCollection + +Сутність-асоціація, яка являє собою сукупність файлів з даними для користувача. + +### Access + +Сутність-асоціація, яка являє собою сукупність дозволів для певної ролі. + +## Реляційна схема + +![Описание картинки](./images/relation_model.png "Подпись под картинкой") \ No newline at end of file diff --git a/docs/design/images/relation_model.png b/docs/design/images/relation_model.png new file mode 100644 index 000000000..33f93429a Binary files /dev/null and b/docs/design/images/relation_model.png differ diff --git a/docs/intro/README.md b/docs/intro/README.md index 74b1f2ea6..486fd2810 100644 --- a/docs/intro/README.md +++ b/docs/intro/README.md @@ -1,12 +1,7 @@ # Вступ -У вступі описується мета роботи і розглядається поставлене завдання з позиції її -актуальності, значення її розв’язання для тієї предметної області, до якої відноситься -тема бакалаврського проєкту. +Мета цього проекту - створити систему управління відкритими даними. Ця тема є досить актуальною в наш час, так, як відкриті дані використовуються всім світом і наша система управління відкритими даними може бути використана як приватними особами так і великими компаніями для обробки відкритих даних. -Коротко характеризується сучасний рівень розв’язання -даного завдання і взаємозв’язок з іншими проєктами по цій тематиці. +В сучасному світі такі системи вже добре розвинені але завжди існують недоліки як в інтерфейсі так і в функціональності даних систем. Тому ми будемо створювати свій проєкт який буде більш зручним для користувача. -Наводяться -основні технічні характеристики розробки й очікуваний технічно-економічний ефект -від її реалізації. \ No newline at end of file +В цьому проекті ми поєднаємо зручність надійність та функціональність Щоб створити кращий продукт для викрористання в порівнянні з аналогами, відповідно наша система буде часто використовуватись. diff --git a/docs/requirements/stakeholders-needs.md b/docs/requirements/stakeholders-needs.md index ffc98a729..f51ce777d 100644 --- a/docs/requirements/stakeholders-needs.md +++ b/docs/requirements/stakeholders-needs.md @@ -2,85 +2,804 @@ ## Вступ -*[Вступ повинен містити короткий огляд всього документу.]* +В цьому документі описано основну інформацію про наш проєкт: сценарій використання нашого продукту адміністратором та користувачем, опис продукту та вимоги до функціональності, практичності, надійності, продуктивності та експлуатаційної придатності. ### Мета -*[Визначення мети цієї сукупності вимог. Зазвичай такою метою є створення та впровадження - інформаційної системи відповідного призначення.]* +Метою цього документу є сформування вимог проєкту відповідно до яких можна буде розвивати нашу систему. Також для поглиблення розуміння самого проєкту та його функцій як у розробників, так і в користувачів проєкту. ### Контекст -*[Короткий опис того, з якими проектами пов'язаний цей документ, на що він впливає.]* +В цьому документі описано вимоги для розробки нашого проєкту та функціонал системи, що розробляється. ### Основні визначення та скорочення -*[Розділ містить визначення всіх термінів та скорочень, необхідних для правильного -тлумачення вимог. Можна зробити посилання на документ, в якому поданий аналіз предметної області.]* +**Зацікавлені особи**[[1]](#link1) - фізичні та юридичні особи, які мають легітимний інтерес у діяльності організації, тобто певною мірою залежать від неї або можуть впливати на її діяльність +**FURPS**[[2]](#link2) - модель для класифікації якості програмного забезпечення. До неї входить: функціональність (**F**unctionality), практичність(**U**sability), надійність(**R**eliability), продуктивність(**P**erformance) та експлуаційну придатність(**S**upportability) + +**FAQ**[[2]](#link3) - список поширених запитань та відповіді на них. + +Інші визначення можна подивитись в ["Аналіз предметної області"](https://github.com/EugeneSemivolos/open-data-management-system/blob/master/docs/requirements/state-of-the-art.md#основні-визначення) ### Посилання + +[*Зацікавлені особи*](https://uk.wikipedia.org/wiki/%D0%97%D0%B0%D1%86%D1%96%D0%BA%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D1%96_%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B8) -*[Розділ містить повний список всіх документів, про які згадується.]* + +[*FURPS*](https://en.wikipedia.org/wiki/FURPS) + +[*FAQ*](https://uk.wikipedia.org/wiki/FAQ) ## Короткий зміст -*[Розділ містить опис того, про що йдеться в еій частині цього документу, що залишилася. -Також тут описана структура документу.]* +* [Характеристика ділових процесів](#характеристика-ділових-процесів) + * [CreateAccount](#характеристика-ділових-процесів:~:text=ID%3A-,CreateAccount) (Створити обліковий запис) + * [UserAuthorization](#характеристика-ділових-процесів:~:text=ID%3A-,UserAuthorization) (Авторизувати користувача) + * [SearchDataset](#характеристика-ділових-процесів:~:text=ID%3A-,SearchDataset) (Знайти набір даних) + * [VisualizationDataset](#характеристика-ділових-процесів:~:text=ID%3A-,VisualizationDataset) (Візуалізувати набір даних таблицею, графіком) + * [DownloadFile](#характеристика-ділових-процесів:~:text=ID%3A-,DownloadFile) (Завантажити файл набору даних) + * [DonateSystem](#характеристика-ділових-процесів:~:text=ID%3A-,DonateSystem) (Пожертвувати кошти на покращення роботи застосунку) + * [UploadDataset](#характеристика-ділових-процесів:~:text=ID%3A-,UploadDataset) (Завантажити набір даних) + * [RemoveDataset](#характеристика-ділових-процесів:~:text=ID%3A-,RemoveDataset) (Видалити набір даних) + * [RemoveEditorPermission](#характеристика-ділових-процесів:~:text=ID%3A-,RemoveEditorPermission) (Зняти права редактора з користувача) + * [EditDataset](#характеристика-ділових-процесів:~:text=ID%3A-,EditDataset) (Редагувати набору даних) +* [Короткий огляд продукту](#короткии-огляд-продукту) +* [Функціональність](#функціональність) +* [Практичність](#практичність) +* [Надійність](#надіиність) +* [Продуктивність](#продуктивність) +* [Експлуатаційна придатність](#експлуатаціина-придатність) ## Характеристика ділових процесів -*[В цьому розділі визначаються зовнішні фактори, що впливають на бізнес (бізнес-актори), -та внутрішні фактори (робітники), дається загальна характеристика діяльності бізнес-акторів -та робітників, яка здійснюється за допомогою бізнесу.* +### Користувач: + +*** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:CreateAccount
НАЗВА:Створити обліковий запис
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач не зареєстрований в системі
РЕЗУЛЬТАТ:Новий обліковий запис
ВИКЛЮЧНІ СИТУАЦІЇ: CreateAccount_EX_AccountExists Існує обліковий запис
CreateAccount_EX_EmptyInputFields Пусті поля вводу
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач натискає на кнопку "Зареєструватися"
3. Користувач вводить реєстраційні дані
4. Користувач натискає на кнопку "Зареєструватися" (CreateAccount_EX_EmptyInputFields)
5. Система перевіряє наявність облікового запису (CreateAccount_EX_AccountExists)
6. Система створює новий обліковий запис
7. Користувач закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:UserAuthorization
НАЗВА:Авторизувати користувача
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач зареєстрований в системі
РЕЗУЛЬТАТ:Вхід у систему
ВИКЛЮЧНІ СИТУАЦІЇ: UserAuthorization_EX_IncorrectData Невірно введені дані
UserAuthorization_EX_NotRegistered Не зареєстрований
UserAuthorization_EX_EmptyInputFields Пусті поля вводу
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач натискає на кнопку "Увійти"
3. Користувач вводить дані для авторизації
4. Користувач натискає на кнопку "Увійти" (UserAuthorization_EX_EmptyInputFields)
5. Система перевіряє наявність облікового запису (UserAuthorization_EX_NotRegistered)
6. Система перевіряє дані для авторизації (UserAuthorization_EX_IncorrectData)
7. Система надає доступ користувачу до облікового запису
8. Користувач закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:SearchDataset
НАЗВА:Знайти набір даних
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі
РЕЗУЛЬТАТ:Шуканий набір даних
ВИКЛЮЧНІ СИТУАЦІЇ: SearchDataset_EX_DatasetDoesntExist Шуканого набору даних не існує
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач вводить в пошукове поле запит
3. Користувач обирає потрібні фільтри
4. Користувач натискає на кнопку "Пошук"
5. Система відображає список шуканих даних (SearchDataset_EX_DatasetDoesntExist)
6. Користувач натискає на потрібний набір даних
7. Система відкриває шукані дані
8. Користувач закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:VisualizationDataset
НАЗВА:Візуалізувати набір даних таблицею, графіком
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі, набір даних є в системі
РЕЗУЛЬТАТ:Графік чи таблиця даних
ВИКЛЮЧНІ СИТУАЦІЇ: VisualizationDataset_EX_VisualizationImpossible Візуалізація неможлива
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач натискає на кнопку "Візуалізація даних"
3. Система відображує список можливих форматів даних (таблиця, графік)
4. Користувач обирає потрібний формат
5. Система надає потрібний графік чи таблицю даних (VisualizationDataset_EX_VisualizationImpossible)
6. Користувач закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:DownloadFile
НАЗВА:Завантажити файл набору даних
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі
РЕЗУЛЬТАТ:Завантажений файл набору даних
ВИКЛЮЧНІ СИТУАЦІЇ: DownloadFIle_EX_CancelSaveFile Користувач відмінив збереження файлу
DownloadFIle_EX_NotEnoughMemory Недостатньо вільної пам'яті
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач натискає на кнопку "Зберегти файл"
3. Система запитує підтвердження на збереження файлу
4. Користувач підтверджує збереження (DownloadFIle_EX_CancelSaveFile)
5. Система завантажує файл (DownloadFIle_EX_NotEnoughMemory)
6. Користувач закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:DonateSystem
НАЗВА:Пожертвувати кошти на покращення роботи застосунку
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:-
РЕЗУЛЬТАТ:Переведені кошти на рахунок розробників
ВИКЛЮЧНІ СИТУАЦІЇ:DonateSystem_EX_DonateSystemError Помилка транзакції
ОСНОВНИЙ СЦЕНАРІЙ:1. Користувач розпочинає взаємодію
2. Користувач натискає на кнопку "Donate system"
3. Система відкриває форму
4. Користувач заповнює інформаційні дані
5. Користувач натискає на кнопку "Donate"
6. Система переводить кошти на рахунок розробників (DonateSystem_EX_DonateSystemError)
7. Користувач закінчує взаємодію
+ +### Адміністратор: + +*** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:UploadDataset
НАЗВА:Завантажити набір даних
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі
РЕЗУЛЬТАТ:Завантажений набір даних на сервер
ВИКЛЮЧНІ СИТУАЦІЇ: UploadDataset_EX_DatasetExists Набір даних вже існує
UploadDataset_EX_DatasetCancelled Адміністратор скасував завантаження
ОСНОВНИЙ СЦЕНАРІЙ:1. Адміністратор розпочинає взаємодію
2. Адміністратор натискає на кнопку "Завантажити дані"
3. Адміністратор вибирає потрібні дані
4. Система запитує підтвердження на завантаження даних
5. Адміністратор підтверджує завантаження (UploadDataset_EX_DatasetCancelled)
6. Система створює набір даних (UploadDataset_EX_DatasetExists)
7. Адміністратор закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:RemoveDataset
НАЗВА:Видалити набір даних
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі, набір даних існує
РЕЗУЛЬТАТ:Видалений набір даних
ВИКЛЮЧНІ СИТУАЦІЇ:RemoveDataset_EX_DatasetCancelled Адміністратор скасував видалення
ОСНОВНИЙ СЦЕНАРІЙ:1. Адміністратор розпочинає взаємодію
2. Адміністратор виконує пошук набору даних
3. Система відображує список даних
4. Адміністратор вибирає потрібні дані
5. Адміністратор натискає на кнопку "Видалити дані"
6. Система запитує підтвердження на видалення даних
7. Адміністратор підтверджує видалення (RemoveDataset_EX_DatasetCancelled)
8. Система видаляє дані
9. Адміністратор закінчує взаємодію
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:RemoveEditorPermission
НАЗВА:Зняти права редактора з користувача
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі
РЕЗУЛЬТАТ:Видалено право редактора
ВИКЛЮЧНІ СИТУАЦІЇ:RemoveEditorPermission_EX_RemoveCancelled Адміністратор відхилив видалення прав
ОСНОВНИЙ СЦЕНАРІЙ:1. Адміністратор розпочинає взаємодію
2. Адміністратор натискає на кнопку "Список редакторів"
3. Система відображує список редакторів
4. Адміністратор натискає на потрібного редактора
5. Система відображує внесені зміни редактором
6. Адміністратор натискає на кнопку "Видалити редактора"
7. Система запитує підтвердження на видалення прав редактора
8. Адміністратор підтверджує видалення прав (RemoveEditorPermission_EX_RemoveCancelled)
10. Система видаляє права редактора
11. Адміністратор закінчує взаємодію
+ + +### Редактор: + +*** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:EditDataset
НАЗВА:Редагувати набір даних
УЧАСНИКИ:Редактор, Система
ПЕРЕДУМОВИ:Редактор авторизований у системі, набір даних існує
РЕЗУЛЬТАТ:Редагований набір даних
ВИКЛЮЧНІ СИТУАЦІЇ:EditDataset_EX_DatasetCancelled Редактор скасував зміни
ОСНОВНИЙ СЦЕНАРІЙ:1. Редактор розпочинає взаємодію
2. Редактор виконує пошук набору даних
3. Система відображує список даних
4. Редактор натискає на потрібний набір даних
5. Редактор натискає на кнопку "Редагувати дані"
6. Система відкриває форму редагування
7. Редактор вносить зміни
8. Редактор підтверджує зміни (EditDataSet_EX_DataSetCancelled)
9. Система редагує дані
10. Система відображує редагує дані
11. Редактор закінчує взаємодію
-*Дається опис бізнес-сценаріїв взаємодії бізнес-акторів, робітників і, можливо, інформаційної системи за допомогою наступної -специфікації:* - -***ID:*** - -***НАЗВА:*** - -***УЧАСНИКИ:*** + +## Короткий огляд продукту -***ПЕРЕДУМОВИ:*** +Застосунок матиме одного та більше адміністраторів, які завантажують дані(тексти) в систему. -***РЕЗУЛЬТАТ:*** +У вебзастосунку записи бази даних будуть представлені у зрозумілому для користувача вигляді: таблиця або графік. -***ВИКЛЮЧНІ СИТУАЦІЇ:*** +Користувачі можуть: +* обрати певний текст і стати його редактором (**Примітка:** *може бути максимум 2 редактора на 1 текст* ). +* одночасно анотувати текст у своїх гілках +* надіслати pull request, таким чином зробивши запит на збереження змін. -***ОСНОВНИЙ СЦЕНАРІЙ:*** +Один з адміністраторів перевіряє текст і підтверджує або відхиляє запропоновані зміни. +У разі підтвердження файл переміщується у базу анотованих текстів, тоді інші користувачі мають можливість +завантажити його. -*Кількість сценаріїв визначається у відповідності до специфіки завдання та необхідного -рівня деталізації (зазвичай, 5-6 сценаріїв).* -## Короткий огляд продукту +## Функціональність -*[Визначається границя системи та категорії її користувачів. Дається загальна характеристика категорій користувачів -системи]* +
Загальний користувач:
-*[Нижче йде опис FURPS:]* +- Створення облікового запису; +- Авторизація; +- Пожертвування кошт; +
Авторизований користувач:
-## Функціональність +- ***Усі можливості загального користувача***; +- Перегляд даних з сайту +- Завантаження даних з сайту + +
Редактор:
+ +- ***Усі можливості авторизованого користувача***; +- Редагування розмітки даних. -*[Functionality (функциональні вимоги)]* +
Адміністратор:
+ +- ***Усі можливості редактора***; +- Завантаження текстових файлів у систему; +- Видалення файлів з системи; +- Можливість видати та забрати права редактора; +- Перегляд історії змін файлів; +- Перегляд гілки змін редактора; ## Практичність -*[Usability (вимоги до зручності роботи)]* +- Простота та зрозумілість інтерфейсу +- Наявність FAQ +- Робота у браузері ## Надійність -*[Reliability (вимоги до надійності)]* +- Захист облікового запису паролем +- Шифрування паролей +- Розділення користувачів на ролі (user/admin) ## Продуктивність -*[Performance (вимоги до продуктивності)]* +Система має підтримувати: + ++ редагування файлу декількома користувачами одночасно ++ багатопотокове завантаження та вивантаження файлів ++ високу швидкість доступу до даних ## Експлуатаційна придатність -*[Supportability (вимоги до підтримки)]* +- Програмний код має бути зрозумілим для подальшої підтримки +- Необхідна наявність форми для зворотного зв'язку та контактів техпідтримки diff --git a/docs/requirements/state-of-the-art.md b/docs/requirements/state-of-the-art.md index fb397cf0e..d1761e0dc 100644 --- a/docs/requirements/state-of-the-art.md +++ b/docs/requirements/state-of-the-art.md @@ -2,33 +2,231 @@ ## Вступ -*[Вступ повинен містити короткий огляд всього документу.]* +У цьому документі аналізується предметна область системи управління видкритими даними, розглядаються основні визначення, підходи та вирішення наданих завдань, опис існуючих засобів вирішення завданнь а також їх порівняльну характеристику та порівняльну характеристику відносно запланованої реалізації даного проекту. ## Основні визначення -*[Розділ містить визначення термінів та скорочень, які використовуються при аналізі предметної області.]* +**Відкриті дані (Open Data)**[[1]](#link1) – це концепція, яка відображує ідею, що визначені дані мають бути доступні для легкої обробки програмними засобами (machine readable) та подальшого використання і розповсюдження без жодних обмежень і контролю, в тому числі й для комерційного використання. Відкриті дані – це не просто інформація, а концепція, тобто система поглядів, підходів, процесів, які мають одну ідею та мету – вільного використання і розповсюдження даних. + +**Великі дані (Big Data)**[[2]](#link2) — набори інформації як структурованої, так і неструктурованої, настільки великих розмірів, що традиційні способи та підходи не можуть бути застосовані до них. Альтернативне визначення називає великими даними феноменальне прискорення нагромадження даних та їх ускладнення. Важливо також відзначити те, що часто під цим поняттям у різних контекстах можуть мати на увазі як дані великого об'єму, так і набір інструментів та методів. + +**Дані (Data)**[[3]](#link3) - цифрова інформація, подана у формалізованому вигляді, прийнятному для обробляння автоматичними засобами за можливої участі людини + +**Використання даних (Data Use)**[[3]](#link3) - використання та обробка даних містить багато різних операцій. Давайте визначимо для чого деякі з них: + +1. Збір даних - дані всюди, і щоб їх правильно використовувати, ми повинні спочатку зібрати в кучу. + +2. Сортування даних, щоб їх можна було правильно використовувати. + +3. Архівування даних, так як не збережені дані не допоможуть у вирішені проблеми. + +4. Захист даних. Правильний захист може вберегти ваші дані, так, як від втрати через пошкодження диску, так і захистити від викрадення іншими. + +5. Повторне використання даних. Дані які вже збережені можна використовувати повторно замість того, щоб кожен раз створювати нові дані та займати зайве місце. + +6. Видалення даних. Це дані, які нам більше не потрібні чи ті, які ми використовуємо дуже рідко. Їх можна спокійно видаляти, це звільнить трохи місця для більш потрібної інформації, яка більш актуальна. + +**Набір даних (dataset)**[[4]](#link4) — колекція однотипних даних, що застосовується в задачах машинної обробки даних. Найчастіше набір даних відповідає таблиці, де кожна з колонок містить однорідні значення, а кожен з рядків відповідає певному члену набору даних. + +**База даних (Data Base)**[[5]](#link5) — це організована структура, призначена для зберігання, зміни й обробки взаємопов’язаної інформації, переважно великих обсягів, тобто Big Data. Бази даних активно використовують для динамічних сайтів зі значними обсягами даних — часто це інтернет-магазини, портали, корпоративні сайти. + +**Банк даних(Data Bank)**[[6]](#link6)- це система спеціальним чином організованих даних - баз даних (однією чи декількома), програмних, технічних, мовних та організаційно-методичних засобів, які призначені для забезпечення централізованого накопичення і колективного багатоцільового використання даних. + +**Системи керування базами даних (СУБД)**[[7]](#link7) основна функця яких – безпосереднє керування даними у зовнішній пам'яті. Ця функція включає збереження та ведення структурної інформації (даних), перетворення даних за запитом на структурну інформацію для користувача. При цьому повинні забезпечуватися: простота використання, можливість автономного функціонування, високий ступінь ефективності. + +**Модель даних (Data Model)**[[8]](#link8) наголошує на тому, які дані потрібні і як їх слід організувати, незважаючи на те, які операції будуть виконуватися над даними. Модель даних схожа на план будівлі архітектора, який допомагає будувати концептуальні моделі та встановлювати взаємозв'язок між елементами даних. + ## Підходи та способи вирішення завдання -*[Розділ містить опис підходів, моделей та способів вирішення завдання.]* + +### Системи відкритих даних в Україні +**Системи відкритих даних в Україні** контролюються Міністерством цифрової трансформації України, що забезпечує формування та реалізацію державної політики у сфері відкритих даних. В Україні діє принцип відкритості за замовчуванням — «open by default». Уся публічна інформація суб'єктів владних повноважень має оприлюднюватись у форматі відкритих даних та надаватися на запит. + +**Згідно з дослідженням**, від 1,4 до 4,9 млн українців щомісячно користуються сервісами на основі відкритих даних. Найпопулярнішими є +* теми конкурентної розвідки (від 1,4 до 2,2 млн користувачів), +* громадського транспорту (1,2 млн користувачів) +* та антикорупції (від 0,7 до 0,9 млн користувачів) + +![Foto](https://upload.wikimedia.org/wikipedia/commons/b/b1/%D0%A2%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81%D1%96%D0%B2_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%96_%D0%B2%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%85_%D0%B4%D0%B0%D0%BD%D0%B8%D1%85.png) +[[12]](#link12) + +Популярніші системи: +- [CityScale](https://uk.wikipedia.org/wiki/%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96#%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96_%D0%B2_%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%96) +- [Youcontrol](https://youcontrol.com.ua/) +- [Opendatabot](https://opendatabot.ua/) +- [Clarity Project](https://clarity-project.info/edrs) +- [Ring](https://ring.com/) +- [EasyWay](https://www.eway.in.ua/ua/cities/kyiv) +- [Monitor.Estate](https://monitor.estate/) + +Єдиний державний вебпортал відкритих даних, [data.gov.ua](https://data.gov.ua/) — український урядовий вебсайт, де публікуються державні набори відкритих даних. + +Портал створено на виконання Закону України «Про доступ до публічної інформації»[[11]](#link11) та постанови Кабінету Міністрів України «Про затвердження Положення про набори даних, які підлягають оприлюдненню у формі відкритих даних». + +Портал призначено для забезпечення надання доступу до публічної інформації у формі відкритих даних , він передбачає доступ до інформації органів державної влади та місцевого самоврядування з можливістю її наступного вільного використання (у тому числі в комерційних цілях) за умови обов'язкового посилання на джерело отримання такої інформації. +### Життєвий цикл даних +***Життєвий цикл даних*** - період існування даних у системі. Немає більш точного визначення, бо для різних даних різні життєві цикли. Тут наведено один з циклів: +1. *Створення, внесок або захоплення даних* - на цьому етапі описується, коли значення доходить до бредмауерів системи, тобто в необробленому стані. +2. *Обробка даних* - точно и докладно обролюються дані для подальшого аналізу. +3. *Аналіз даних* - підготовлені дани дослуджуються та інтерпритуються. Найбільш часто викоритовується статичне моделювання, алгоритми, штучний інтелект(АІ) та машинне навчання. +4. *Використання даних* - після аналізу надаються команди для подальших рішень. +5. *Архівація даних* - дані які активно не використовувались, зберігаються в окремому сховищі для подальшого використання в випадку, якщо потрібно буде їх знов активно використовувати. +6. *Знищення даних* - проводиться аналіз архівованих даних, ті які довго не використовувались видалаються, бо із-зі "великих даних" не є раціональним зберігати все. + +### Модель даних DDF +***Модель даних DDF[[9]](#link9)*** - спосіб упорядкування даних та визначення того, як частини даних співвідносяться між собою. Використовується для визначення наборів даних. Кожен набір даних DDF визначає п’ять наборів даних: поняття(Concepts), метадані(Metadata), сутності(Entities), точки даних(Datapoints) and синоніми(Synonyms). + +#### Datapoints(точки даних) +В DDF дані зберігаються в парах ключ-значень, це і називиється **Datapoints**. Дані складаються з одного показника, а ключ в свою чергу складається з двох або більше вимірів. + +#### Entities(сутності) +***Сутність*** - одне значення в домені сутності. + +***Домен сітності*** - дискретне поняття, у якому визначені всі можливі його значення. Усі властивості для домену сутностей також я визначеними. + +***Властивість*** - додаткова інформація про якесь дискретне поняття. +Існують також множини сутностей, до яких і входять сутності, такі множини називаються Entity set. Вони завжди належать дякому домену сутностей та не виходять з його меж. + +Сутність може належати декільком множин, але також може і не належати до ніякої. + +У кожної сутності є свій ідентифікатор, який є унікальним та може мати лише малі літери, цифри та нижні підкреслення. + +У множин можуть бути різні властивості, та можуть мати свою ієрархію. Ієрархія визначається властивістю *drill_up*. Сутності які нижче за ієрархією, визначається пов'язана до ієрархії сутність. + +#### Concepts(поняття) +Концепти[[15]](#link15) можуть мати властивості та мають свої індетифікатори, які мають складатися лише з малих літер, цифр та підкреслень. + +Існують різні типи понятть: +- *string* - рядок сиволів. Всі рядки мають бути доступні хоча б в однієї мови. +- *measure* - числове значення. +- *boolean* - булеве значення. +- *interval* - інтервал між двома чисельними значеннями. +- *entity_domai*n - домен сутностей. +- *entity_set* - множина сутностей. +- *role* - множина сутностей, яка має такі ж сутності як й інша множина сутностей (або концепт, який має множину сутностей як домен). +- *composite* - концепт, який складається з декількох концептів. +- *time* - концепт часу. Особливий випадок, так як не є однозначно визначеним - визначається за допомогою форматів часу. + +#### Metadata(Метадані) +***Метадані***[[13]](#link13) - як прийнято, це дані про дані, тобто ті дані які пояснюють інші дані. Різні дані можуть мати різні метадані. *В DDF **метадані*** - властивість однієї з пари ключ-значення. + +#### Synonyms(Синоніми) +***Синоніми***[[14]](#link14) - рядок який дає змогу визначити поняття або сутність у набору даних. Та також множина сутностей містить ідентифікатори сутностей та понять з їхніми синонімами. + +Вони використовуються для перекладу набора даних з одного простору імен до іншого, тобто для гармонізації ідентичних понять та сутностей. ## Порівняльна характеристика існуючих засобів вирішення завдання -*[Розділ містить опис існуючих програм, інформаційних систем, сервісів, тощо, призначених для вирішення -завдання. Дається порівняльна характеристика властивостей FURPS:* -- *Functionality (функциональні вимоги)* -- *Usability (вимоги до зручності роботи)* -- *Reliability (вимоги до надійності)* -- *Performance (вимоги до продуктивності)* -- *Supportability (вимоги до підтримки)* +### [Gapminder](https://www.gapminder.org/) +Незалежна некомерційна організація з відсутністю політичних, економічних та релігійних приналежностей, яка виявляє глобальні факти, порівнюючи та зіставляючи думки людей із офіційною статистикою, та розробляє інструментии візуалізації даних усіх країн світу, що дозволяє людям вивчати глобальну статистику. + +### [The World Bank DataBank](https://databank.worldbank.org/) +Онлайн-інструмент, який підтримує візуалізацію та аналіз даних широкого кола тем у різних базах даних Світового банку. Користувачі можуть створювати, зберігати, вставляти чи ділитися таблицями, діаграмами та картами. + +### [Google Public Data Explorer](https://www.google.com/publicdata/directory) +Інструмент, який дозволяє легко досліджувати, візуалізовувати та передавати великі набори даних, що представляють суспільний інтерес. Дані можуть відображатися у вигляді лінійних графіків, гістограм, поперечних перерізів ділянок або на мапах, які оновлюються з часом, тому зміни у світі стають легшими для розуміння. + +### [Statistics Poland](https://stat.gov.pl/en/) +Головна державна платформа Польщі, яке займається збором та публікацією статистичних даних, що стосуються економіки, населення та суспільства країни, на національному та місцевому рівнях. - *(у вигляді таблиці).]* +### [Eurostat](https://ec.europa.eu/eurostat/web/main/data/database) +Cтатистичне управління Європейського Союзу. Головна місія - надавати високоякісні статистичні дані про Європу. Eurostat розробляє європейську статистику у партнерстві з Національними статистичними інститутами та іншими національними органами держав-членів ЄС. Це партнерство відоме як Європейська статистична система (ЄСС). Веб-сайт Eurostat надає прямий і безкоштовний онлайн-доступ до всіх статистичних баз даних Євростату та електронних публікацій. + +База даних Євростату охоплює дані для таких країн: + +- країни-члени ЄC +- країни-кандидати до ЄС +- єврозона +- країни EFTA + +### [Dataverse](https://dataverse.org/) +Dataverse - це open-source програмне забезпечення, яке призначене для поширення, збереження, пошуку та аналізу відкритих даних. Воно полегшує надання даних іншим особам, тобто робить дані більш доступними. Головна особливість цього сервісу в тому, як він дозволяє організовувати інформацію. Dataverse репозиторій зберігає в собі віртуальні архіви, які називаються Dataverse колекціями. Кожна Dataverse колекція містить в собі сети інформації (datasets) або інші Dataverse колекції. Сети інформації в свою чергу містять в собі описові метадані та файли з даними (документація, код та інше). Головною метою даного програмного забеспечення є автоматизація більшості рутинної роботи професійних архівістів та збереження/розповсюдження інформації про автора даних. + +### Порівняльна таблиця + +- 🟩 - реалізовано вдало +- 🟨 - реалізовано погано +- 🟥 - не реалізовано + +| Вимоги | Критерії | Система управління відкритими даними | Gapminder | The World Bank DataBank | Google Public Data Explorer | Statistics Poland | Eurostat | Dataverse | +|:--------------------------------:|:--------------------------:|:------------------------------------:|:---------:|:-----------------------:|:---------------------------:|:-----------------:|:--------:|:---------:| +| Functionality (функціональність) | | | | | | | | | +| | Керування наборами даних | 🟩 | 🟥 | 🟥 | 🟩 | 🟥 | 🟥 | 🟩 | +| | Візуалізація даних | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | +| | Тематичне розбиття даних | 🟩 | 🟩 | 🟩 | 🟩 | 🟨 | 🟩 | 🟩 | +| | Пошуковий фільтр | 🟩 | 🟨 | 🟩 | 🟨 | 🟩 | 🟩 | 🟩 | +| | Donate system | 🟩 | 🟩 | 🟥 | 🟥 | 🟥 | 🟥 | 🟥 | +| Usability (зручність) | | | | | | | | | +| | Підтримка англійської мови | 🟥 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | +| | Документація | 🟩 | 🟨 | 🟥 | 🟩 | 🟨 | 🟩 | 🟩 | +| | User-friendly interface | 🟩 | 🟩 | 🟨 | 🟨 | 🟩 | 🟩 | 🟩 | +| Reliability (надійність) | | | | | | | | | +| | Ліцензія | 🟩 | 🟩 | 🟩 | 🟩 | 🟨 | 🟩 | 🟩 | +| | Резервне копіювання | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | +| | Актуальність даних | 🟩 | 🟨 | 🟨 | 🟩 | 🟩 | 🟩 | 🟨 | +| Performance (продуктивність) | | | | | | | | | +| | Оцінка PageSpeed Insights | 🟩 | 🟩 90 | 🟨 83 | 🟩 98 | 🟨 69 | 🟨 70 | 🟨 84 | +| | Стійкість до збоїв | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | +| Supportability (підтримка) | | | | | | | | | +| | FAQ | 🟩 | 🟩 | 🟩 | 🟩 | 🟥 | 🟩 | 🟥 | +| | Онлайн підтримка | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | 🟩 | ## Висновки -*[Робляться висновки щодо доцільності розробки нової або модифікації існуючої інформаційної системи, необхідності та способів інтеграції з системами(сервісами) третіх сторін, тощо.]* +В результаті проведення аналізу, наша команда дійшла висновку, що серед існуючих засобів вирішення завдання відсутній ідеальний інструмент, який задовольняє потреби та має достатню функціональність для вирішення задачі управління відкритими даними. Серед проаналізованих прикладів виділяється веб-застосунок Dataverse, який має більшість інструментів для реалізації повного життєвого циклу даних, проте в ньому відсутні засоби візуалізації даних, а також вирішальним є те, що наразі він працює в режимі обмеженого доступу та лише моделює управління відкритими даними. + +Тому було вирішено створити нову веб-систему для реалізації повного життєвого циклу даних, яка б забезпечила користувача всіма потрібними інструментами для роботи з відкритими даними, а саме: + + * функціональність роботи з датасетами (приклад Dataverse); + * інструменти для візуалізації даних (на прикладі Google Public Data Explorer); + * керування версіями даних (на прикладі Dataverse); + * пошук потрібної інформації. ## Посилання + +1. Відкриті дані (Open Data) - [Google Docs](https://docs.google.com/document/d/1G3ZcQ5NyHAfaJWXE6uGPRIBLqdRLRk9LXtgQS9utYmQ/edit#heading=h.1u8zm7362v0t) + + +2. Великі дані (Big Data) - [Wiki Nina.az](https://www.wiki.uk-ua.nina.az/%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D1%96_%D0%B4%D0%B0%D0%BD%D1%96.html) + + +3. Дані (Data), Використання даних (Data Use) - [Wikipedia](https://uk.wikipedia.org/wiki/%D0%94%D0%B0%D0%BD%D1%96) + + +4. Набір даних (dataset) - [Wikipedia](https://uk.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D1%96%D1%80_%D0%B4%D0%B0%D0%BD%D0%B8%D1%85) + + +5. База даних (Data Base) - [Host Iq](https://hostiq.ua/wiki/ukr/database/) + + +6. Банк даних (Data Bank) - [Life Prog](https://life-prog.ru/ukr/1_324_ponyattya-pro-bank-danih.html) + + +7. Системи керування базами даних (СУБД) - [Pidru4niki](https://pidru4niki.com/81326/tehnika/sistemi_keruvannya_bazami_danih) + + +8. Модель даних (Data Model) - [Csstricks](https://uk.csstricks.net/8226422-data-modelling-conceptual-logical-physical-data-model-types#menu-2) + + +9. Модель даних DDF - [Google Docs](https://docs.google.com/document/d/1Cd2kEH5w3SRJYaDcu-M4dU5SY8No84T3g-QlNSW6pIE/edit#) + + +10. Системи відкритих даних в Україні - [Wikipedia](https://uk.m.wikipedia.org/wiki/%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96#%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96_%D0%B2_%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%96) + + +11. Закон України «Про доступ до публічної інформації» - [Minjust.gov.ua](https://minjust.gov.ua/m/str_35409) + + +12. Фотографія - [Wikipedia](https://uk.m.wikipedia.org/wiki/%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96#%D0%92%D1%96%D0%B4%D0%BA%D1%80%D0%B8%D1%82%D1%96_%D0%B4%D0%B0%D0%BD%D1%96_%D0%B2_%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%96) + + +13. Метаданні- [Wikipedia](https://en.wikipedia.org/wiki/Metadata) + + +14. Синоніми - [Microsoft learn](https://learn.microsoft.com/en-us/sql/relational-databases/synonyms/synonyms-database-engine?view=sql-server-ver16) + + +15. Концепти - [Google Docs](https://docs.google.com/document/d/1Cd2kEH5w3SRJYaDcu-M4dU5SY8No84T3g-QlNSW6pIE/edit#) -*[Розділ містить повний список всіх документів, про які згадується.]* diff --git a/docs/software/README.md b/docs/software/README.md index 2b3bb4c9d..2cc793ea5 100644 --- a/docs/software/README.md +++ b/docs/software/README.md @@ -1,6 +1,376 @@ # Реалізація інформаційного та програмного забезпечення -В рамках проекту розробляється: -- SQL-скрипт для створення на початкового наповнення бази даних -- RESTfull сервіс для управління даними +В рамках проекту розробляється: +## SQL скрипт + +``` +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; + +-- ----------------------------------------------------- +-- Schema OpenDataManagementSystem +-- ----------------------------------------------------- +DROP SCHEMA IF EXISTS `OpenDataManagementSystem` ; + +-- ----------------------------------------------------- +-- Schema OpenDataManagementSystem +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `OpenDataManagementSystem` DEFAULT CHARACTER SET utf8 ; +USE `OpenDataManagementSystem` ; + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`donate` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`donate` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`donate` ( + `id` INT NOT NULL AUTO_INCREMENT, + `card` VARCHAR(45) NULL, + `owner` VARCHAR(45) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`role` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`role` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`role` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(20) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`user` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`user` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`user` ( + `id` INT NOT NULL AUTO_INCREMENT, + `username` VARCHAR(20) NULL, + `email` VARCHAR(45) NULL, + `password` VARCHAR(45) NULL, + `avatar` VARCHAR(100) NULL, + `donate_id` INT NOT NULL, + `role_id` INT NOT NULL, + PRIMARY KEY (`id`, `donate_id`, `role_id`), + INDEX `fk_User_Donate_idx` (`donate_id` ASC) VISIBLE, + INDEX `fk_user_role1_idx` (`role_id` ASC) VISIBLE, + CONSTRAINT `fk_ref_Donate` + FOREIGN KEY (`donate_id`) + REFERENCES `OpenDataManagementSystem`.`donate` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_user_role1` + FOREIGN KEY (`role_id`) + REFERENCES `OpenDataManagementSystem`.`role` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`category` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`category` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`category` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(30) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`dataFile` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`dataFile` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`dataFile` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NULL, + `description` VARCHAR(200) NULL, + `file_csv` VARCHAR(45) NULL, + `uploadDate` DATETIME NULL, + `hasGraph` TINYINT NULL, + `category_id` INT NOT NULL, + PRIMARY KEY (`id`, `category_id`), + INDEX `fk_dataFile_category1_idx` (`category_id` ASC) VISIBLE, + CONSTRAINT `fk_dataFile_category1` + FOREIGN KEY (`category_id`) + REFERENCES `OpenDataManagementSystem`.`category` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`fileCollection` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`fileCollection` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`fileCollection` ( + `user_id` INT NOT NULL, + `dataFile_id` INT NOT NULL, + PRIMARY KEY (`user_id`, `dataFile_id`), + INDEX `fk_fileCollection_dataFile1_idx` (`dataFile_id` ASC) VISIBLE, + CONSTRAINT `fk_fileCollection_user1` + FOREIGN KEY (`user_id`) + REFERENCES `OpenDataManagementSystem`.`user` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_fileCollection_dataFile1` + FOREIGN KEY (`dataFile_id`) + REFERENCES `OpenDataManagementSystem`.`dataFile` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`editForm` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`editForm` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`editForm` ( + `id` INT NOT NULL AUTO_INCREMENT, + `editorUserame` VARCHAR(20) NULL, + `oldFile_csv` VARCHAR(100) NULL, + `newFile_csv` VARCHAR(100) NULL, + `editDate` DATETIME NULL, + `dataFile_id` INT NOT NULL, + `dataFile_category_id` INT NOT NULL, + PRIMARY KEY (`id`, `dataFile_id`, `dataFile_category_id`), + INDEX `fk_editForm_dataFile1_idx` (`dataFile_id` ASC, `dataFile_category_id` ASC) VISIBLE, + CONSTRAINT `fk_editForm_dataFile1` + FOREIGN KEY (`dataFile_id` , `dataFile_category_id`) + REFERENCES `OpenDataManagementSystem`.`dataFile` (`id` , `category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`permission` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`permission` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`permission` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(20) NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `OpenDataManagementSystem`.`access` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `OpenDataManagementSystem`.`access` ; + +CREATE TABLE IF NOT EXISTS `OpenDataManagementSystem`.`access` ( + `role_id` INT NOT NULL, + `permission_id` INT NOT NULL, + PRIMARY KEY (`role_id`, `permission_id`), + INDEX `fk_access_permission1_idx` (`permission_id` ASC) VISIBLE, + CONSTRAINT `fk_access_role1` + FOREIGN KEY (`role_id`) + REFERENCES `OpenDataManagementSystem`.`role` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_access_permission1` + FOREIGN KEY (`permission_id`) + REFERENCES `OpenDataManagementSystem`.`permission` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`donate` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`donate` (`id`, `card`, `owner`) VALUES (DEFAULT, '4149 4991 3384 6467', 'Yevhenii'); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`role` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`role` (`id`, `name`) VALUES (DEFAULT, 'admin'); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`user` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`user` (`id`, `username`, `email`, `password`, `avatar`, `donate_id`, `role_id`) VALUES (DEFAULT, 'Vasia Pupkin', 'exanple@mail.com', '123', 'image.jpg', 1, 1); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`category` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`category` (`id`, `name`) VALUES (DEFAULT, 'others'); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`dataFile` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`dataFile` (`id`, `name`, `description`, `file_csv`, `uploadDate`, `hasGraph`, `category_id`) VALUES (DEFAULT, 'title', 'some description', 'namefile.csv', '2023-01-03 12:00:00.000', 1, 1); + +COMMIT; + + +-- ----------------------------------------------------- +-- Data for table `OpenDataManagementSystem`.`permission` +-- ----------------------------------------------------- +START TRANSACTION; +USE `OpenDataManagementSystem`; +INSERT INTO `OpenDataManagementSystem`.`permission` (`id`, `name`) VALUES (DEFAULT, 'create'); +INSERT INTO `OpenDataManagementSystem`.`permission` (`id`, `name`) VALUES (DEFAULT, 'read'); + +COMMIT; +``` + +## RESTfull сервіс для управління даними + +### Файл сервера + +``` +const express = require('express'); +const bodyParser = require('body-parser'); + +const port = 5000; + +const app = express(); + +app.use(bodyParser.text()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use('/user', require('./routes')); + +app.listen(port, () => { + console.log(`Server started on http://localhost:${port}`); +}); +``` + +### Файл-обробник маршрутів + +``` +const { Router, query } = require("express"); +const mysql = require('mysql2/promise'); +const { extend } = require('lodash'); + +const connectionUrl = 'mysql://root:@localhost:3306/opendatamanagementsystem'; + +const sql = { + createUser: `INSERT INTO USER(ID, USERNAME, EMAIL, PASSWORD, AVATAR, DONATE_ID, ROLE_ID) VALUES (:id, :username, :email, :password, :avatar, :donate_id, :role_id)`, + readUserByID: `SELECT * FROM USER WHERE ID= :id`, + readAllUser: `SELECT * FROM USER`, + updateUserByID: `UPDATE USER SET USERNAME= :username, EMAIL= :email, PASSWORD= :password, AVATAR= :avatar, DONATE_ID= donate_id, ROLE_ID= :role_id WHERE ID= :id`, + deleteUserByID: `DELETE FROM USER WHERE ID= :id`, +}; + +const executeSQL = async (query, values) => { + let connection; + let sqlStatement; + try { + connection = await mysql.createConnection({ + uri: connectionUrl, + password: 'Pro100jeka$', + namedPlaceholders: true + }); + + sqlStatement = await connection.format(query, values); + + const [ results, fields ] = await connection.execute(sqlStatement); + return results; + } catch (err) { + throw new Error(`SQL: ${sqlStatement} - ${err.toString()}`); + } finally { + if (connection) connection.end(); + } +}; + +const router = Router(); + +router.post('/:id', async (req, res) => { + try { + const values = extend({}, req.body, req.params); + let result = await executeSQL(sql.createUser, values); + result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send({ + status: 500, + error: err.toString() + }); + } +}); + +router.get('/', async (req, res) => { + try { + const result = await executeSQL(sql.readAllUser); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.get('/:id', async (req, res) => { + try { + const result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.put('/:id', async (req, res) => { + try { + const values = extend({}, req.body, req.params); + let result = await executeSQL(sql.updateUserByID, values); + result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.delete('/:id', async (req, res) => { + try { + const result = await executeSQL(sql.readUserByID, req.params); + await executeSQL(sql.deleteUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +module.exports = router; +``` \ No newline at end of file diff --git a/docs/test/README.md b/docs/test/README.md index 4cf256392..4163fc7d2 100644 --- a/docs/test/README.md +++ b/docs/test/README.md @@ -1,4 +1,30 @@ # Тестування працездатності системи -*В цьому розділі необхідно вказати засоби тестування, навести вихідні коди тестів та результати тестування.* +## Запуск сервера на 5000 порті +![](./screenshots/loading_server.png) +## Перевірка поточної бази даних (Get) +![](./screenshots/get.png) + +## Додавання сутності (Create) + +### Спроба створити сутність з id, яке вже зайняте +![](./screenshots/post_err.png) +### Створення нової сутність з унікальним id +![](./screenshots/post_success.png) +### Перевірка +![](./screenshots/get_after_posting.png) + +## Зміна параметрів сутності (Put) + +### Зміна параметрів сутності +![](./screenshots/put.png) +### Перевірка +![](./screenshots/get_after_putting.png) + +## Видалення сутності (Delete) + +### Видалення сутності +![](./screenshots/delete.png) +### Перевірка +![](./screenshots/get_after_deleting.png) \ No newline at end of file diff --git a/docs/test/screenshots/delete.png b/docs/test/screenshots/delete.png new file mode 100644 index 000000000..b3f0b756a Binary files /dev/null and b/docs/test/screenshots/delete.png differ diff --git a/docs/test/screenshots/get.png b/docs/test/screenshots/get.png new file mode 100644 index 000000000..36fed0ff6 Binary files /dev/null and b/docs/test/screenshots/get.png differ diff --git a/docs/test/screenshots/get_after_deleting.png b/docs/test/screenshots/get_after_deleting.png new file mode 100644 index 000000000..85a655ae5 Binary files /dev/null and b/docs/test/screenshots/get_after_deleting.png differ diff --git a/docs/test/screenshots/get_after_posting.png b/docs/test/screenshots/get_after_posting.png new file mode 100644 index 000000000..3b628d564 Binary files /dev/null and b/docs/test/screenshots/get_after_posting.png differ diff --git a/docs/test/screenshots/get_after_putting.png b/docs/test/screenshots/get_after_putting.png new file mode 100644 index 000000000..6696aa6f5 Binary files /dev/null and b/docs/test/screenshots/get_after_putting.png differ diff --git a/docs/test/screenshots/loading_server.png b/docs/test/screenshots/loading_server.png new file mode 100644 index 000000000..e062db9af Binary files /dev/null and b/docs/test/screenshots/loading_server.png differ diff --git a/docs/test/screenshots/post_err.png b/docs/test/screenshots/post_err.png new file mode 100644 index 000000000..517b6ecb8 Binary files /dev/null and b/docs/test/screenshots/post_err.png differ diff --git a/docs/test/screenshots/post_success.png b/docs/test/screenshots/post_success.png new file mode 100644 index 000000000..bbf11c492 Binary files /dev/null and b/docs/test/screenshots/post_success.png differ diff --git a/docs/test/screenshots/put.png b/docs/test/screenshots/put.png new file mode 100644 index 000000000..ee4ef3305 Binary files /dev/null and b/docs/test/screenshots/put.png differ diff --git a/docs/use cases/README.md b/docs/use cases/README.md index b72b73691..ae2d183e5 100644 --- a/docs/use cases/README.md +++ b/docs/use cases/README.md @@ -1,149 +1,945 @@ -# Модель прецедентів +# Діаграми прецедентів -В цьому файлі необхідно перелічити всі документи, розроблені в проекті та дати посилання на них. +### Загальна схема -*Модель прецедентів повинна містити загальні оглядові діаграми та специфікації прецедентів.* +
+ +@startuml + +actor "Загальний користувач" as GeneralUser +actor "Зареєстрований користувач" as AuthUser +actor "Редактор" as Editor +actor "Адміністратор" as Admin + +usecase "Зареєструватись" as UserReg +usecase "Авторизуватись" as UserAuth +usecase "Взаємодія з даними \nсистеми" as DataInteract #2cf25a +usecase "Пожертвувати кошти" as Donate +usecase "Редагування \nданих" as EditData +usecase "Управління даними \nсистеми" as MngData #2cf25a +usecase "Управління редакторами \nсистеми" as MngEditors #2cf25a +GeneralUser -u-> UserReg +GeneralUser -u-> UserAuth +GeneralUser -u-> Donate +AuthUser -u-|> GeneralUser -Вбудовування зображень діаграм здійснюється з використанням сервісу [plantuml.com](https://plantuml.com/). +AuthUser -r-> DataInteract + +Editor -u-|> AuthUser +Editor -l-> EditData + +Admin -u-|> Editor +Admin -l-> MngData +Admin -r-> MngEditors + +@enduml -В markdown-файлі використовується опис діаграми +
-```md +### Схема загального користувача -
@startuml - right header - Package: UCD_3.0 - end header +"Загальний користувач" as actor +usecase "Зареєструватись" as UserAuth +usecase "Авторизуватись" as UserReg +usecase "Пожертвувати кошти" as Donate - title - UC_8. Редагувати конфігурацію порталу - Діаграма прецедентів - end title +actor -d-> UserAuth +actor -d-> UserReg +actor -d-> Donate +@enduml - actor "Користувач" as User #eeeeaa - - package UCD_1{ - usecase "UC_1\nПереглянути список \nзвітів" as UC_1 #aaeeaa - } - - usecase "UC_1.1\nЗастосувати фільтр" as UC_1.1 - usecase "UC_1.2\nПереглянути метадані \nзвіту" as UC_1.2 - usecase "UC_1.2.1\nДати оцінку звіту" as UC_1.2.1 - usecase "UC_1.2.2\nПереглянути інформацію \nпро авторів звіту" as UC_1.2.2 - - package UCD_1 { - usecase "UC_4\nВикликати звіт" as UC_4 #aaeeaa - } + + +### Схема зареєстрованого користувача + +
+ +@startuml + +"Зареєстрований користувач" as actor + +usecase "Взаємодія з даними \nсистеми" as DataInteract #palegreen + +usecase "Знайти набір даних" as SearchData +usecase "Візуалізувати дані(таблиця, тощо)" as VisualData +usecase "Завантажити файл даних" as DownloadData + +actor -u-> DataInteract + +SearchData .d.> DataInteract :extends +VisualData .d.> DataInteract :extends +DownloadData .d.> DataInteract :extends + + +@enduml + +
+ +### Схема редактора + +
+ +@startuml + +"Редактор" as actor + +usecase "Редагування \nданих" as EditData + +actor -d-> EditData + +@enduml + +
+ +### Схема адміністратора + +
+ +@startuml + +"Адміністратор" as actor + +usecase "Управління даними\nсистеми" as MngData #2cf25a +usecase "Управління редакторами\nсистеми" as MngEditors #2cf25a + +usecase "Завантажити дані" as UploadData +usecase "Видалити дані" as RemoveData + +usecase "Затвердити кандидатуру\nредактора" as GrantEdPermit +usecase "Зняти права\nредактора з користувача" as RemoveEdPermit + + +actor -u-> MngData +actor -d-> MngEditors + +UploadData .d.> MngData :extends +RemoveData .d.> MngData :extends + +GrantEdPermit .u.> MngEditors :extends +RemoveEdPermit .u.> MngEditors :extends + +@enduml + +
+ +## Сценарії використання + +### Сценарій створення облікового запису + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:CreateAccount
НАЗВА:Створити обліковий запис
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач не зареєстрований в системі
РЕЗУЛЬТАТ:Новий обліковий запис
ВИКЛЮЧНІ СИТУАЦІЇ: CreateAccount_EX_AccountExists Існує обліковий запис
CreateAccount_EX_EmptyInputFields Пусті поля вводу
+ +@startuml + +|Користувач| + + start - usecase "UC_1.1.1\n Використати \nпошукові теги" as UC_1.1.1 - usecase "UC_1.1.2\n Використати \nрядок пошуку" as UC_1.1.2 - usecase "UC_1.1.3\n Використати \nавторів" as UC_1.1.3 + :починає взаємодію; + + :натискає на кнопку + "Зареєструватися"; + + :вводить реєстраційні дані; + + :натискає на кнопку + "Зареєструватися"; + note #ffaaaa + Можлива + CreateAccount_EX_EmptyInputFields + end note +|Система| + + :перевіряє наявність + облікового запису користувача; + note right #ffaaaa + Можлива + CreateAccount_EX_AccountExists + end note + + :створює новий обліковий запис; +|Користувач| + + :закінчує взаємодію; + + stop; - User -> UC_1 - UC_1.1 .u.> UC_1 :extends - UC_1.2 .u.> UC_1 :extends - UC_4 .d.> UC_1.2 :extends - UC_1.2 .> UC_1.2 :extends - UC_1.2.1 .u.> UC_1.2 :extends - UC_1.2.2 .u.> UC_1.2 :extends - UC_1 ..> UC_1.2.2 :extends +@enduml + +### Сценарій авторизування користувача + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:UserAuthorization
НАЗВА:Авторизувати користувача
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач зареєстрований в системі
РЕЗУЛЬТАТ:Вхід у систему
ВИКЛЮЧНІ СИТУАЦІЇ: UserAuthorization_EX_IncorrectData Невірно введені дані
UserAuthorization_EX_NotRegistered Не зареєстрований
UserAuthorization_EX_EmptyInputFields Пусті поля вводу
+ +@startuml + +|Користувач| + + start + :починає взаємодію; + + :натискає на кнопку "Увійти"; + + :вводить авторизаційні дані; + + :натискає на кнопку "Увійти"; + note left #ffaaaa + Можлива + UserAuthorization_EX_EmptyInputFields + end note - UC_1.1.1 -u-|> UC_1.1 - UC_1.1.2 -u-|> UC_1.1 - UC_1.1.3 -u-|> UC_1.1 +|Система| + + :перевіряє наявність + облікового запису користувача; + note right #ffaaaa + Можлива + UserAuthorization_EX_NotRegistered + end note + + :перевіряє авторизаційні дані; + note right #ffaaaa + Можлива + UserAuthorization_EX_IncorrectData + end note + + :надає доступ користувачу + до облікового запису; - right footer - Аналітичний портал. Модель прецедентів. - НТУУ КПІ ім.І.Сікорського - Киів-2020 - end footer +|Користувач| + + :закінчує взаємодію; + stop; + @enduml + +### Сценарій пошуку наборів даних -**Діаграма прецедентів** + + + + + - -``` + + + + -яка буде відображена наступним чином + + + + -
+
+ + + + + + + + + + + + + +
ID:SearchDataset
НАЗВА:Знайти набір даних
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі
РЕЗУЛЬТАТ:Шуканий набір даних
ВИКЛЮЧНІ СИТУАЦІЇ: SearchDataset_EX_DatasetDoesntExist Шуканого набору даних не існує
@startuml - right header - Package: UCD_3.0 - end header +|Користувач| + + start + + :починає взаємодію; - title - UC_8. Редагувати конфігурацію порталу - Діаграма прецедентів - end title + :вводить в пошукове поле запит; + :обирає потрібні фільтри; - actor "Користувач" as User #eeeeaa + :натискає на кнопку "Пошук"; - package UCD_1{ - usecase "UC_1\nПереглянути список \nзвітів" as UC_1 #aaeeaa - } +|Система| + + :відображає список + шуканих даних; + note right #ffaaaa + Можлива + SearchDataset_EX_DatasetDoesntExist + end note + +|Користувач| + + :натискає на потрібний + набір даних; + +|Система| + + :відкриває шукані дані; + +|Користувач| + + :закінчує взаємодію; + + stop; - usecase "UC_1.1\nЗастосувати фільтр" as UC_1.1 - usecase "UC_1.2\nПереглянути метадані \nзвіту" as UC_1.2 - usecase "UC_1.2.1\nДати оцінку звіту" as UC_1.2.1 - usecase "UC_1.2.2\nПереглянути інформацію \nпро авторів звіту" as UC_1.2.2 +@enduml + +### Сценарій віртуалізації наборів даних + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:VisualizationDataset
НАЗВА:Візуалізувати набір даних таблицею, графіком
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі, набір даних є в системі
РЕЗУЛЬТАТ:Графік чи таблиця даних
ВИКЛЮЧНІ СИТУАЦІЇ: VisualizationDataset_EX_VisualizationImpossible Візуалізація неможлива
+ +@startuml + +|Користувач| + + start - package UCD_1 { - usecase "UC_4\nВикликати звіт" as UC_4 #aaeeaa - } + :починає взаємодію; + + :натискає на кнопку + "Візуалізація даних"; + +|Система| + + :відображає список можливих + форматів даних (таблиця, графік); + +|Користувач| + + :обирає потрібний формат; + +|Система| + + :надає потрібний графік + чи таблицю даних; + note right #ffaaaa + Можлива + VisualizationDataset_EX_VisualizationImpossible + end note + +|Користувач| + + :закінчує взаємодію; + + stop; - usecase "UC_1.1.1\n Використати \nпошукові теги" as UC_1.1.1 - usecase "UC_1.1.2\n Використати \nрядок пошуку" as UC_1.1.2 - usecase "UC_1.1.3\n Використати \nавторів" as UC_1.1.3 +@enduml + +### Сценарій завантаження файлів + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:DownloadFile
НАЗВА:Завантажити файл набору даних
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:Користувач авторизований в системі
РЕЗУЛЬТАТ:Завантажений файл набору даних
ВИКЛЮЧНІ СИТУАЦІЇ: DownloadFIle_EX_CancelSaveFile Користувач відмінив збереження файлу
DownloadFIle_EX_NotEnoughMemory Недостатньо вільної пам'яті
+ + @startuml + +|Користувач| + + start + :починає взаємодію; + + :натискає на кнопку + "Зберегти файл"; + +|Система| + + :запитує підтвердження + на збереження файлу; + +|Користувач| + + :підтверджує збереження; + note left #ffaaaa + Можлива + DownloadFIle_EX_CancelSaveFile + end note + + +|Система| + + :завантажує файл; + note right #ffaaaa + Можлива + DownloadFIle_EX_NotEnoughMemory + end note + +|Користувач| + + :закінчує взаємодію; + + stop; +@enduml + +### Сценарій пожертвування коштів на покращення роботи застосунку + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:DonateSystem
НАЗВА:Пожертвувати кошти на покращення роботи застосунку
УЧАСНИКИ:Користувач, Система
ПЕРЕДУМОВИ:-
РЕЗУЛЬТАТ:Переведені кошти на рахунок розробників
ВИКЛЮЧНІ СИТУАЦІЇ:DonateSystem_EX_DonateSystemError Помилка транзакції
+ +@startuml + +|Користувач| + + start - User -> UC_1 - UC_1.1 .u.> UC_1 :extends - UC_1.2 .u.> UC_1 :extends - UC_4 .d.> UC_1.2 :extends - UC_1.2 .> UC_1.2 :extends - UC_1.2.1 .u.> UC_1.2 :extends - UC_1.2.2 .u.> UC_1.2 :extends - UC_1 ..> UC_1.2.2 :extends + :починає взаємодію; + + :натискає на кнопку + "Donate system""; + +|Система| + + :відкриває форму; + +|Користувач| + + :заповнює інформаційні + дані; + :Користувач натискає + на кнопку "Donate"; + + +|Система| + + :Система переводить кошти + на рахунок розробників; + note right #ffaaaa + Можлива + DonateSystem_EX_DonateSystemError + end note + +|Користувач| + + :закінчує взаємодію; + stop; + +@enduml + + +### Сценарій завантаження набору данних + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:UploadDataset
НАЗВА:Завантажити набір даних
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі
РЕЗУЛЬТАТ:Завантажений набір даних на сервер
ВИКЛЮЧНІ СИТУАЦІЇ: UploadDataset_EX_DatasetExists Набір даних вже існує
UploadDataset_EX_DatasetCancelled Адміністратор скасував завантаження
+ +@startuml + +|Адміністратор| + + start + :починає взаємодію; + + :натискає на кнопку + "Завантажити дані"; + :вибирає потрібні дані; + +|Система| + + :запитує підтвердження + на завантаження даних; + +|Адміністратор| + + :підтверджує завантаження; + note left #ffaaaa + Можлива + UploadDataset_EX_DatasetCancelled + end note + + +|Система| + + :створює набір даних; + note right #ffaaaa + Можлива + UploadDataset_EX_DatasetExists + end note + +|Адміністратор| + + :закінчує взаємодію; + +@enduml + +### Сценарій видалення набору данних + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:RemoveDataset
НАЗВА:Видалити набір даних
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі, набір даних існує
РЕЗУЛЬТАТ:Видалений набір даних
ВИКЛЮЧНІ СИТУАЦІЇ:RemoveDataset_EX_DatasetCancelled Адміністратор скасував видалення
+ +@startuml + +|Адміністратор| + + start - UC_1.1.1 -u-|> UC_1.1 - UC_1.1.2 -u-|> UC_1.1 - UC_1.1.3 -u-|> UC_1.1 + :починає взаємодію; + + :виконує пошук + набору даних; + +|Система| + + :відображає список даних; + +|Адміністратор| + + :вибирає потрібні + дані; + :натискає на кнопку + "Видалити дані"; + +|Система| + + :запитує підтвердження + на видалення даних; + +|Адміністратор| + + :Адміністратор підтверджує + видалення; + note left #ffaaaa + Можлива + RemoveDataset_EX_DatasetCancelled + end note + + +|Система| + + :видаляє дані; + +|Адміністратор| + + :закінчує взаємодію; + +@enduml + +### Сценарій зняття прав редактора + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:RemoveEditorPermission
НАЗВА:Зняти права редактора з користувача
УЧАСНИКИ:Адміністратор, Система
ПЕРЕДУМОВИ:Адміністратор авторизований у системі
РЕЗУЛЬТАТ:Видалено право редактора
ВИКЛЮЧНІ СИТУАЦІЇ:RemoveEditorPermission_EX_RemoveCancelled Адміністратор відхилив видалення прав
+ +@startuml + +|Адміністратор| + + start - right footer - Аналітичний портал. Модель прецедентів. - НТУУ КПІ ім.І.Сікорського - Киів-2020 - end footer + :починає взаємодію; + + :натискає на кнопку "Список редакторів"; + +|Система| + + :відображує список редакторів; + +|Адміністратор| + + :натискає на потрібного редактора; + +|Система| + + :відображує внесені зміни редактором; + +|Адміністратор| + + :натискає на кнопку "Видалити редактора"; + +|Система| + + :запитує підтвердження на видалення прав редактора; + +|Адміністратор| + + :підтверджує видалення прав; + + note left #ffaaaa + Можлива + RemoveEditorPermission_EX_RemoveCancelled + end note + + +|Система| + + :видаляє права редактора; + +|Адміністратор| + + :закінчує взаємодію; @enduml -**Діаграма прецедентів** +### Сценарій редагування даних + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID:EditDataset
НАЗВА:Редагування набору даних
УЧАСНИКИ:Редактор, Система
ПЕРЕДУМОВИ:Редактор авторизований у системі, набір даних існує
РЕЗУЛЬТАТ:Запит на редагування набору даних
ВИКЛЮЧНІ СИТУАЦІЇ:EditDataset_EX_DatasetCancelled Редактор скасував зміни
+ +@startuml + +|Редактор| + + start + + :починає взаємодію; + + :виконує пошук набору даних; -
+|Система| + :відображує список даних; + +|Редактор| + + :натискає на потрібний набір даних; + + :натискає на кнопку "Редагувати дані"; + +|Система| + + :відкриває форму редагування; + +|Редактор| + + :вносить зміни; + + :підтверджує зміни; + + note left #ffaaaa + Можлива + EditDataSet_EX_DataSetCancelled + end note + + +|Система| + + :редагує дані; + + :показує редаговані дані; + +|Редактор| + + :закінчує взаємодію; + +@enduml diff --git a/package-lock.json b/package-lock.json index 3350ed358..a0a38f41a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "dis-edu", + "name": "open-data-management-system", "version": "2.1.0", "lockfileVersion": 1, "requires": true, @@ -2184,26 +2184,33 @@ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" } } }, @@ -3060,11 +3067,18 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -3081,14 +3095,14 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-concurrently": { "version": "1.0.5", @@ -3257,6 +3271,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -4316,6 +4339,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4331,9 +4359,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-node": { "version": "2.1.0", @@ -4517,7 +4545,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { "version": "1.3.822", @@ -4558,7 +4586,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -4725,7 +4753,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eventemitter3": { "version": "4.0.7", @@ -4801,46 +4829,89 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -5025,17 +5096,24 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } } }, "find-cache-dir": { @@ -5112,7 +5190,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "from2": { "version": "2.3.0", @@ -5164,6 +5242,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5594,21 +5680,26 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -6116,6 +6207,11 @@ "isobject": "^3.0.1" } }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6438,6 +6534,11 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -6579,7 +6680,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memory-fs": { "version": "0.4.1", @@ -6593,7 +6694,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-source-map": { "version": "1.1.0", @@ -6634,7 +6735,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { "version": "3.1.10", @@ -6835,6 +6936,68 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, + "mysql2": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", + "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "requires": { + "denque": "^2.0.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", @@ -7093,9 +7256,9 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -7295,7 +7458,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "3.0.0", @@ -8077,9 +8240,12 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "query-string": { "version": "5.1.1", @@ -8129,20 +8295,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -8407,6 +8573,11 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -8594,37 +8765,52 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -8671,14 +8857,14 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { @@ -8713,9 +8899,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", @@ -8884,6 +9070,13 @@ "faye-websocket": "^0.11.3", "uuid": "^3.4.0", "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "sockjs-client": { @@ -9043,6 +9236,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -9580,9 +9778,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "toml": { "version": "3.0.0", @@ -9762,7 +9960,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "unquote": { "version": "1.1.1", @@ -9992,12 +10190,12 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "vary": { "version": "1.1.2", @@ -10543,6 +10741,13 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "webpack-merge": { diff --git a/package.json b/package.json index 8d66fd314..0682c05d5 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,25 @@ { - "name": "dis-edu", + "name": "open-data-management-system", "version": "2.1.0", "main": "index.js", - "description": "Databases course work template", - "repository": "https://github.com/boldak/dis-edu", - "author": "Andrey Boldak ", + "description": "Open data management system", + "repository": "https://github.com/EugeneSemivolos/open-data-management-system", + "author": "Yevhenii Semyvolos ", "license": "ECL 2.0", "scripts": { "docs:dev": "npx vuepress dev docs", "docs:build": "npx vuepress build docs", - "publish": "publish.sh" + "publish": "sh publish.sh" }, "dependencies": { "@vuepress/plugin-back-to-top": "^1.7.1", "@vuepress/plugin-pwa": "^1.7.1", + "body-parser": "^1.20.1", + "cors": "^2.8.5", + "express": "^4.18.2", + "mysql2": "^2.3.2", "vuepress": "^1.7.1", - "vuepress-theme-cool": "^1.3.1" + "vuepress-theme-cool": "^1.3.1", + "lodash": "^4.17.21" } } diff --git a/publish.sh b/publish.sh index 8dcaea4ce..058182d4b 100644 --- a/publish.sh +++ b/publish.sh @@ -17,9 +17,9 @@ git add -A git commit -m 'deploy' # if you are deploying to https://.github.io -# git push -f git@github.com:boldak/.github.io.git master +# git push -f git@github.com:EugeneSemivolos/open-data-management-system.git master:gh-pages # if you are deploying to https://.github.io/ -git push -f https://github.com/boldak/dis-edu.git master:gh-pages +git push -f https://github.com/EugeneSemivolos/open-data-management-system.git master:gh-pages cd - diff --git a/src/js/index.js b/src/js/index.js new file mode 100644 index 000000000..612604b2f --- /dev/null +++ b/src/js/index.js @@ -0,0 +1,15 @@ +const express = require('express'); +const bodyParser = require('body-parser'); + +const port = 5000; + +const app = express(); + +app.use(bodyParser.text()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use('/user', require('./routes')); + +app.listen(port, () => { + console.log(`Server started on http://localhost:${port}`); +}); \ No newline at end of file diff --git a/src/js/routes.js b/src/js/routes.js new file mode 100644 index 000000000..de98b51d3 --- /dev/null +++ b/src/js/routes.js @@ -0,0 +1,91 @@ +const { Router, query } = require("express"); +const mysql = require('mysql2/promise'); +const { extend } = require('lodash'); + +const connectionUrl = 'mysql://root:@localhost:3306/opendatamanagementsystem'; + +const sql = { + createUser: `INSERT INTO USER(ID, USERNAME, EMAIL, PASSWORD, AVATAR, DONATE_ID, ROLE_ID) VALUES (:id, :username, :email, :password, :avatar, :donate_id, :role_id)`, + readUserByID: `SELECT * FROM USER WHERE ID= :id`, + readAllUser: `SELECT * FROM USER`, + updateUserByID: `UPDATE USER SET USERNAME= :username, EMAIL= :email, PASSWORD= :password, AVATAR= :avatar, DONATE_ID= donate_id, ROLE_ID= :role_id WHERE ID= :id`, + deleteUserByID: `DELETE FROM USER WHERE ID= :id`, +}; + +const executeSQL = async (query, values) => { + let connection; + let sqlStatement; + try { + connection = await mysql.createConnection({ + uri: connectionUrl, + password: 'Pro100jeka$', + namedPlaceholders: true + }); + + sqlStatement = await connection.format(query, values); + + const [ results, fields ] = await connection.execute(sqlStatement); + return results; + } catch (err) { + throw new Error(`SQL: ${sqlStatement} - ${err.toString()}`); + } finally { + if (connection) connection.end(); + } +}; + +const router = Router(); + +router.post('/:id', async (req, res) => { + try { + const values = extend({}, req.body, req.params); + let result = await executeSQL(sql.createUser, values); + result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send({ + status: 500, + error: err.toString() + }); + } +}); + +router.get('/', async (req, res) => { + try { + const result = await executeSQL(sql.readAllUser); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.get('/:id', async (req, res) => { + try { + const result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.put('/:id', async (req, res) => { + try { + const values = extend({}, req.body, req.params); + let result = await executeSQL(sql.updateUserByID, values); + result = await executeSQL(sql.readUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +router.delete('/:id', async (req, res) => { + try { + const result = await executeSQL(sql.readUserByID, req.params); + await executeSQL(sql.deleteUserByID, req.params); + res.status(200).send(result); + } catch (err) { + return res.status(500).send(err.toString()); + } +}); + +module.exports = router; \ No newline at end of file