Rabbit Wiki ‐ Project Architecture and Structure - Klipar/VAVA_Project GitHub Wiki
Система складається з трьох шарів. Layer 2 і Layer 3 розгорнуті на одному сервері; клієнт (Layer 1) взаємодіє з ними виключно через HTTPS.
┌─────────────────────────────────────────────────────────┐
│ Layer 1: ПРЕЗЕНТАЦІЙНИЙ │
│ (Presentation / UI Layer) │
│ Клієнтська частина │
└─────────────────────────────────────────────────────────┘
↕ HTTP / REST API
┌─────────────────────────────────────────────────────────┐
│ Layer 2: АПЛІКАЦІЙНИЙ │
│ (Application / Backend Layer) │
│ Сервер застосунку + AI Рекомендаційна система │
└─────────────────────────────────────────────────────────┘
↕ внутрішні запити
┌─────────────────────────────────────────────────────────┐
│ Layer 3: ДАНИХ │
│ (Data / Persistence Layer) │
│ База даних │
└─────────────────────────────────────────────────────────┘
Технологія: JavaFX + Java
Відповідальність: рольовий інтерфейс, взаємодія з користувачем, відправка HTTP-запитів до Layer 2. Пряме звернення до БД або AI заборонено.
Технічні вимоги до розробки:
- FXML + Controller класи для кожного екрану
- Локалізація через
ResourceBundle(EN + SK) — обов'язкова вимога - Lombok для моделей / DTO
- Колекції —
List,Map,Setз правильно підібраними структурами (LinkedHashMapдля впорядкованих задач,PriorityQueueдля черги за пріоритетом) - Логування через
java.util.loggingабо Log4j — логування логіки + всіх Exception/Error - Регулярні вирази — фільтрація/пошук задач, валідація email, пароля
- XML — імпорт/експорт даних (профіль користувача та його характеристики для AI) через
JAXBабоDOM/SAX
Побудований на FXML + Controller-класах. Кожній ролі відповідає свій набір екранів. Обов'язкова локалізація через ResourceBundle (EN + SK). DTO-моделі через Lombok.
Auth — сторінка логіну; опціонально — зміна пароля після першого входу.
Regular Worker — домашня сторінка з найближчими дедлайнами, список проєктів, перегляд і відправка задачі на review, перемикання між Kanban і list-режимом, профіль.
Team Leader — огляд задач від менеджера + навантаження команди, Kanban-дошка, форма створення задачі з AI-рекомендацією (топ-3 кандидати), адмін-панель команди (створення/видалення акаунтів воркерів), планування задач.
Manager — огляд проєктів і статусу команд, форма створення проєкту з AI-рекомендацією команди (топ-3), Kanban на рівні команд, адмін-панель (створення/видалення акаунтів Team Leader-ів).
Спільні компоненти — система нотифікацій, рольова навігація, профіль користувача.
Service-класи для кожного модуля. Звертаються до Layer 2 виключно через HTTP-модуль — ніколи напряму.
| Сервіс | Відповідальність |
|---|---|
| AuthService | Логін / логаут / перевірка прав при кожному запиті |
| SessionService | Управління сесіями на стороні клієнта |
| UserService | Створення та видалення акаунтів (відповідно до ролі), оновлення профілю |
| ProjectService | Створення проєктів, призначення команді, відстеження статусу |
| TaskService | CRUD задач, управління статусами (new → in_progress → review → done/returned), пріоритизація, review-процес |
| AiService | Формування запиту до Layer 2, передача топ-3 рекомендацій у відповідний UI-модуль |
| NotificationService | Тригери подій, журнал нотифікацій |
| KanbanService | Формування даних для дошки, фільтрація та сортування |
Єдина точка обробки всіх HTTP-запитів до Layer 2. Service-класи не взаємодіють із ним напряму — доступ здійснюється виключно через відповідні сервіси.
У проекті для реалізації HTTP-взаємодії використовується вбудований сервер із пакету com.sun.net.httpserver, зокрема класи:
HttpServerHttpHandlerHttpExchange
Модуль відповідає за прийом і обробку HTTP-запитів, маршрутизацію до відповідних обробників, а також обробку помилок з’єднання і логування всіх збоїв під час виконання запитів.
├── client/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/rabbit/client/
│ │ ├── MainApp.java
│ │ ├── ui/
│ │ │ ├── auth/
│ │ │ │ ├── LoginController.java
│ │ │ │ └── FirstLoginController.java
│ │ │ ├── worker/
│ │ │ │ ├── WorkerHomeController.java
│ │ │ │ ├── TaskViewController.java
│ │ │ ├── teamleader/
│ │ │ │ ├── LeaderHomeController.java
│ │ │ │ ├── TaskCreateController.java
│ │ │ │ └── AiRecommendController.java
│ │ │ ├── manager/
│ │ │ │ ├── ManagerHomeController.java
│ │ │ │ ├── ProjectCreateController.java
│ │ │ │ └── TeamRecommendController.java
│ │ │ └── shared/
│ │ │ ├── NotificationController.java
│ │ │ ├── ProfileController.java
│ │ │ ├── KanbanController.java
│ │ │ └── NavController.java
│ │ ├── service/
│ │ │ ├── TaskService.java
│ │ │ ├── ProjectService.java
│ │ │ ├── UserService.java
│ │ │ ├── AuthService.java
│ │ │ ├── NotificationService.java
│ │ │ ├── AiService.java
│ │ │ ├── KanbanService.java
│ │ │ └── SessionService.java
│ │ └── http/
│ │ ├── ApiClient.java
│ │ └── RequestBuilder.java
│ └── resources/
│ ├── fxml/
│ │ ├── auth/
│ │ ├── worker/
│ │ ├── teamleader/
│ │ ├── manager/
│ │ └── shared/
│ ├── i18n/
│ │ ├── messages_en.properties
│ │ └── messages_sk.properties
│ └── images/
│
├── common/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/rabbit/common/
│ ├── dto/
│ │ ├── TaskDTO.java
│ │ ├── ProjectDTO.java
│ │ ├── UserDTO.java
│ │ └── NotificationDTO.java
│ ├── enums/
│ │ ├── TaskStatus.java
│ │ ├── Priority.java
│ │ ├── UserRole.java
│ │ └── ProjectStatus.java
│ ├── constants/
│ │ ├── ApiEndpoints.java
│ │ └── AppConstants.java
│ ├── exceptions/
│ │ ├── ApiException.java
│ │ └── AuthException.java
│ └── util/
│ ├── JsonMapper.java
│ └── DateUtils.java
Технологія: Java HTTP-сервер
Відповідальність: прийом запитів від клієнта, авторизація на сервері, маршрутизація, взаємодія з БД і AI-сервісом, повернення JSON-відповідей. З'єднання з PostgreSQL. Логування всіх запитів і збоїв.
Middleware — AuthMiddleware перевіряє токени/сесії при кожному запиті; DBMiddleware управляє пулом з'єднань до БД.
Handlers — приймають HTTP-запити і делегують логіку сервісам: AuthHandler, TaskHandler, ProjectHandler, UserHandler, NotificationHandler, AiHandler.
Services — бізнес-логіка сервера: AuthService, TaskService, ProjectService, UserService, NotificationService, SessionService, AiProxyService.
Repositories — взаємодія з PostgreSQL через JDBC: UserRepository, TaskRepository, ProjectRepository, NotificationRepository.
AI-модуль — AiRecommendClient надсилає HTTP-запити до AI-сервісу; AiResponseParser обробляє JSON-відповідь.
Міграції — MigrationRunner + migrations/V1__initMigration.sql.
├── common/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/rabbit/common/
│ ├── dto/
│ │ ├── TaskDTO.java
│ │ ├── ProjectDTO.java
│ │ ├── UserDTO.java
│ │ └── NotificationDTO.java
│ ├── enums/
│ │ ├── TaskStatus.java
│ │ ├── Priority.java
│ │ ├── UserRole.java
│ │ └── ProjectStatus.java
│ ├── constants/
│ │ ├── ApiEndpoints.java
│ │ └── AppConstants.java
│ ├── exceptions/
│ │ ├── ApiException.java
│ │ └── AuthException.java
│ └── util/
│ ├── JsonMapper.java
│ └── DateUtils.java
├── docker-compose.yaml
├── pom.xml
├── README.md
└── server/
├── pom.xml
└── src/
└── main/
├── java/
│ └── com/rabbit/server/
│ ├── Main.java
│ ├── http/
│ │ └── HttpServerApp.java
│ ├── handler/
│ │ ├── AuthHandler.java
│ │ ├── TaskHandler.java
│ │ ├── ProjectHandler.java
│ │ ├── UserHandler.java
│ │ ├── NotificationHandler.java
│ │ └── AiHandler.java
│ ├── service/
│ │ ├── AuthService.java
│ │ ├── TaskService.java
│ │ ├── ProjectService.java
│ │ ├── UserService.java
│ │ ├── NotificationService.java
│ │ ├── AiProxyService.java
│ │ └── SessionService.java
│ ├── repository/
│ │ ├── UserRepository.java
│ │ ├── TaskRepository.java
│ │ ├── ProjectRepository.java
│ │ └── NotificationRepository.java
│ ├── middleware/
│ │ └── AuthMiddleware.java
│ ├── controller/
│ ├── database/
│ │ └── MigrationRunner.java
│ ├── ai/
│ │ ├── AiRecommendClient.java
│ │ └── AiResponseParser.java
│ └── config/
│ └── ServerConfig.java
└── resources/
└── migrations/
└── V1__initMigration.sql
Розгортання: окремий процес на тому ж сервері, що й БД. Layer 2 надсилає JSON та отримує JSON.
Розгортання: на тому ж сервері, що й Layer 2.
erDiagram
user {
int id PK
String name
String nickname
String email
String password
enum role
TIMESTAMP created_at
}
user_project {
int user_id FK
int project_id FK
enum role
TIMESTAMP joined_at
TIMESTAMP left_at
}
project {
int id PK
String title
String description
TIMESTAMP deadline
enum status
}
task {
int id PK
int assigned_to FK
int project_id FK
int created_by FK
String title
String description
int priority
enum status
TIMESTAMP deadline
}
notification {
int id PK
String message
TIMESTAMP created_at
}
user_notification {
int user_id FK
int notification_id FK
bool is_read
}
user ||--o{ user_project : "id -> user_id"
project ||--o{ user_project : "id -> project_id"
project ||--o{ task : "id -> project_id"
user ||--o{ task : "id -> assigned_to"
user ||--o{ user_notification : "id -> user_id"
notification ||--o{ user_notification : "id -> notification_id"
user — зберігає всіх зареєстрованих користувачів системи. Поле role визначає глобальну роль (наприклад, admin або user). Поле nickname використовується для відображення в інтерфейсі.
project — основна сутність дошки. Кожен проект має заголовок, опис, дедлайн та статус (наприклад, active, completed, archived). Поле created_by посилається на користувача, який створив проект.
user_project — зв'язкова таблиця типу "багато до багатьох" між user та project. Додатково зберігає роль учасника в конкретному проекті (наприклад, owner, member, viewer), а також дату входу і виходу з проекту.
task — завдання, яке належить до певного проекту. Прив'язане до виконавця (assigned_to) та автора (created_by). Має пріоритет (числовий), статус (наприклад, todo, in_progress, done) і власний дедлайн.
notification — шаблон сповіщення з текстом і датою створення. Одне сповіщення може бути відправлено кільком користувачам.
user_notification — зв'язкова таблиця між user та notification. Поле is_read дозволяє відслідковувати, чи прочитав конкретний користувач це сповіщення.
| Операція | Хто може | Деталі |
|---|---|---|
| CREATE | Manager, Team Leader | Manager створює Team Leader-ів; Team Leader — своїх Worker-ів. Самостійна реєстрація заборонена. |
| READ | Усі ролі | Кожен бачить себе. Team Leader — своїх Worker-ів. Manager — своїх Team Leader-ів і їхні команди. |
| UPDATE | Власник акаунту | Можна редагувати лише власні дані: ім’я, нік, email, пароль, компетенції. |
| DELETE | Manager, Team Leader | Manager видаляє Team Leader-ів; Team Leader — своїх Worker-ів. Видалення "вгору" заборонено. |
| Операція | Хто може | Деталі |
|---|---|---|
| CREATE | ManagerTeam Leader | Manager створює та призначає їх Team Leader, а він у свою чергу призначає Worker. |
| READ | Усі ролі | Manager бачить усі свої проєкти. Team Leader і Worker — лише ті, де є в user_project. |
| UPDATE | ManagerTeam Leader | Manager та Team Leader можуть змінювати назву, опис, теги, дедлайн, статус. |
| Операція | Хто може | Деталі |
|---|---|---|
| CREATE | ManagerTeam Leader | Декомпозиція проєкту: опис, теги, дедлайн, пріоритет, виконавець (вручну або AI). |
| READ | Усі ролі | Worker бачить свої задачі. Team Leader — усі задачі команди. Manager — задачі в межах проєктів. |
| UPDATE | Manager, Worker, Team Leader | Worker змінює статус. Team Leader може змінювати будь-які поля, підтверджувати або повертати задачу. |
| DELETE | Manager, Team Leader | Manager та Team Leader можуть видалити задачу зі свого проекту. Worker — не може. |
| Операція | Хто може | Деталі |
|---|---|---|
| CREATE | Система | Автоматично при призначенні задачі, зміні статусу, дедлайні, review. |
| READ | Власник | Бачить лише свої нотифікації. При читанні → is_read = true. |
| DELETE | Власник, Система |
| Таблиці | Тип | Опис |
|---|---|---|
| user ↔ project | many-to-many через user_project | Учасники проєктів з роллю та датами |
| project → task | one-to-many | Задачі проєкту |
| user → task | one-to-many | Призначені задачі виконавця |
| notification ↔ user | many-to-many через user_notification | Доставка та відмітка про прочитання |
Власний проект повинен включати теми, розглянуті на лекціях, та відповідати таким вимогам:
-
Багаторівнева архітектура з чітким розділенням щонайменше на такі шари:
- Презентаційний шар (GUI)
- Бізнес-шар (прикладна логіка)
- Шар даних (база даних)
-
Колекції
Необхідно використовувати відповідні структури даних залежно від характеру та архітектури проєкту. -
Логування
Логування бізнес-логіки додатку, а також обробка та логування винятків (Exceptions) і помилок. -
Локалізація
Підтримка перекладів і локалізації щонайменше для англійської (ENG) та словацької (SK) мов. -
XML
Імпорт і експорт даних у форматі XML. -
Регулярні вирази
Використання для пошуку з параметрами та фільтрації даних. -
JDBC
Підключення до вибраної бази даних (MySQL, PostgreSQL, SQLite або Oracle Database).
Дозволяється використання NoSQL баз даних за умови використання JDBC (наприклад, MongoDB).
Для GUI-додатків (Swing або JavaFX) обов’язково використовувати тільки JDBC без ORM (заборонено використовувати JPA, Hibernate, EclipseLink, MyBatis).
Для портального рішення на базі Liferay (Community Edition CE) використання ORM дозволене. -
Валідація та безпека
Обробка та перевірка вхідних даних, захист від базових SQL-ін’єкцій.
Датамоделі повинні бути правильно інкапсульовані: без публічних полів, доступ лише через getter/setter методи. -
GUI-додаток
Реалізація у вигляді настільного додатку (Swing або JavaFX) або портального рішення (Liferay CE).
Заборонено використовувати Android, Spring або Spring Boot. -
Ролі користувачів
Додаток повинен підтримувати щонайменше 3 різні ролі, наприклад:- адміністратор (admin)
- розширений користувач (power/super user)
- звичайний користувач (user)
-
Кількість екранів
Додаток має містити приблизно 5–8 екранів. -
Lombok
Використання бібліотеки Lombok для автоматизації генерації повторюваного коду