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)             │
│                       База даних                        │
└─────────────────────────────────────────────────────────┘

Layer 1 — Presentation layer (GUI)

Технологія: 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

UI-підшар

Побудований на 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-взаємодія (com.sun.net.httpserver)

Єдина точка обробки всіх HTTP-запитів до Layer 2. Service-класи не взаємодіють із ним напряму — доступ здійснюється виключно через відповідні сервіси.

У проекті для реалізації HTTP-взаємодії використовується вбудований сервер із пакету com.sun.net.httpserver, зокрема класи:

  • HttpServer
  • HttpHandler
  • HttpExchange

Модуль відповідає за прийом і обробку 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

Layer 2 — Business layer (application logic)

Технологія: Java HTTP-сервер

Відповідальність: прийом запитів від клієнта, авторизація на сервері, маршрутизація, взаємодія з БД і AI-сервісом, повернення JSON-відповідей. З'єднання з PostgreSQL. Логування всіх запитів і збоїв.

Компоненти

MiddlewareAuthMiddleware перевіряє токени/сесії при кожному запиті; 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

AI Recommendation Service

Розгортання: окремий процес на тому ж сервері, що й БД. Layer 2 надсилає JSON та отримує JSON.

Layer 3 — Data / Persistence Layer (DB)

Розгортання: на тому ж сервері, що й 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"
    
Loading

Таблиці

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 дозволяє відслідковувати, чи прочитав конкретний користувач це сповіщення.

Правила доступу до сутностей

User

Операція Хто може Деталі
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-ів. Видалення "вгору" заборонено.

Project

Операція Хто може Деталі
CREATE ManagerTeam Leader Manager створює та призначає їх Team Leader, а він у свою чергу призначає Worker.
READ Усі ролі Manager бачить усі свої проєкти. Team Leader і Worker — лише ті, де є в user_project.
UPDATE ManagerTeam Leader Manager та Team Leader можуть змінювати назву, опис, теги, дедлайн, статус.

Task

Операція Хто може Деталі
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 — не може.

Notification

Операція Хто може Деталі
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 Доставка та відмітка про прочитання

Вимоги до проекту описані в GITHUB

Власний проект повинен включати теми, розглянуті на лекціях, та відповідати таким вимогам:

  • Багаторівнева архітектура з чітким розділенням щонайменше на такі шари:
    • Презентаційний шар (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 для автоматизації генерації повторюваного коду
⚠️ **GitHub.com Fallback** ⚠️