From 8af8b8b6a934f656a5c9cdc8f2a0283cbcdedff7 Mon Sep 17 00:00:00 2001 From: Vladimir Valekzhanin Date: Tue, 6 Oct 2026 11:36:51 +0300 Subject: [PATCH 1/3] docs: write a rough page plan --- README.md | 10 +++++++- ...20\260\320\275\320\270\321\206\321\213.md" | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 "docs/\321\201\321\202\321\200\320\260\320\275\320\270\321\206\321\213.md" diff --git a/README.md b/README.md index c6f75b3..f8e7199 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,12 @@ ```bash git pull --rebase -``` \ No newline at end of file +``` + +## RBAC + +В системе предусмотрено 3 роли: пользователь, модератор и администратор: + +```plain +Пользователь (USER) <- Модератор (MODER) <- Администратор (ADMIN) +``` diff --git "a/docs/\321\201\321\202\321\200\320\260\320\275\320\270\321\206\321\213.md" "b/docs/\321\201\321\202\321\200\320\260\320\275\320\270\321\206\321\213.md" new file mode 100644 index 0000000..fe19b74 --- /dev/null +++ "b/docs/\321\201\321\202\321\200\320\260\320\275\320\270\321\206\321\213.md" @@ -0,0 +1,24 @@ +# Страницы приложения + +## RBAC + +Иерархия: `USER <- MODER <- ADMIN` (старшая наследует права младшей). +Доступ `USER` означает `USER, MODER, ADMIN`; `MODER` означает `MODER, ADMIN`. + +Маршрут — путь к FXML для `Navigator.goTo(...)`. + +| № | Название страницы | Маршрут (FXML) | Доступ | Назначение | +| --- | -------------------------------------------- | ---------------------------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------- | +| 1 | Вход (email + пароль) | `/fxml/LoginForm.fxml` | гость (публичная) | Аутентификация через `AuthService`, после успеха → №2 | +| 2 | Список ресурсов и сортировка (главная) | `/fxml/ResourceList.fxml` (переименовать из `Search.fxml`) | `USER` | Поиск/фильтр/сортировка, пагинация `offset/count` через `ResourceService.search` | +| 3 | Просмотр метаданных документа | `/fxml/ResourceDetails.fxml` (новая) | `USER` | Только чтение: `ResourceService.getById` → `title, description, createdAt, updatedAt, uuid` | +| 4 | Форма ресурса (создание/редактирование) | `/fxml/ResourceForm.fxml` (новая) | `MODER` | `create/update` через `ResourceService`; удаление — действием из №2/№3 с подтверждением, без отдельной страницы | +| 5 | Список пользователей | `/fxml/UserList.fxml` (новая) | `ADMIN` | Поиск/фильтр через `UsersService.search` + `UserFilter`; удаление действием из списка | +| 6 | Форма пользователя (создание/редактирование) | `/fxml/UserForm.fxml` (новая) | `ADMIN` | `create` через `RegisterData`, `update` через `UpdateUserData`, `getById` для предзаполнения | + +## Примечания по реализации + +* №1: упростить `LoginFormController` — удалить `firstName/lastName/thirdName`, оставить `email + password` + вызов `AuthService`/`LoginRequest` (сейчас там заглушка `authenticate()` с `Role.USER`). +* №2: переименование `Search.fxml → ResourceList.fxml` + переименование `SearchController → ResourceListController`; обновить `Program.INITIAL_PAGE_PATH` и `navigator.goTo("/fxml/Search.fxml")` в `LoginFormController`. +* SoC: списки (№2, №5) не содержат логики форм; формы (№4, №6) работают в двух режимах `create/edit` по наличию `uuid`, валидация через существующие `validation/*Validator`. +* Кнопки create/edit/delete рендерятся по роли из `Session.getCurrentUser().role`, а не отдельными страницами. From 4c2233f5ec3be94951416da430880a99d90da6f5 Mon Sep 17 00:00:00 2001 From: Vladimir Valekzhanin Date: Tue, 6 Oct 2026 11:38:35 +0300 Subject: [PATCH 2/3] feat(auth): simplify login form to email and password --- .../controllers/LoginFormController.java | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java index c115ad5..afacf73 100644 --- a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java +++ b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java @@ -1,13 +1,10 @@ package com.DesktopApplicationClientJava.controllers; import com.DesktopApplicationClientJava.controllers.utils.Controller; -import com.DesktopApplicationClientJava.entities.Role; import com.DesktopApplicationClientJava.entities.User; +import com.DesktopApplicationClientJava.services.ServiceException; import com.DesktopApplicationClientJava.validation.EmailValidator; -import com.DesktopApplicationClientJava.validation.FirstNameValidator; -import com.DesktopApplicationClientJava.validation.LastNameValidator; import com.DesktopApplicationClientJava.validation.PasswordValidator; -import com.DesktopApplicationClientJava.validation.ThirdNameValidator; import com.DesktopApplicationClientJava.validation.utils.ErrorMessages; import com.dlsc.formsfx.model.structure.Field; import com.dlsc.formsfx.model.structure.Form; @@ -17,9 +14,9 @@ import com.dlsc.formsfx.model.validators.Validator; import com.dlsc.formsfx.view.renderer.FormRenderer; import java.util.List; -import java.util.UUID; import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.layout.VBox; @@ -27,33 +24,12 @@ public class LoginFormController extends Controller { @FXML private VBox formContainer; @FXML private Button submitButton; - private StringField firstName; - private StringField lastName; - private StringField thirdName; private StringField email; private PasswordField password; private Form loginForm; @FXML private void initialize() { - firstName = - Field.ofStringType("") - .label(FirstNameValidator.FIELD_NAME) - .placeholder("Антон") - .required(ErrorMessages.Required) - .validate(toArray(FirstNameValidator.validators())); - lastName = - Field.ofStringType("") - .label(LastNameValidator.FIELD_NAME) - .placeholder("Антонов") - .required(ErrorMessages.Required) - .validate(toArray(LastNameValidator.validators())); - thirdName = - Field.ofStringType("") - .label(ThirdNameValidator.FIELD_NAME) - .placeholder("Антонович") - .required(ErrorMessages.Required) - .validate(toArray(ThirdNameValidator.validators())); email = Field.ofStringType("") .label(EmailValidator.FIELD_NAME) @@ -66,33 +42,30 @@ private void initialize() { .required(ErrorMessages.Required) .validate(toArray(PasswordValidator.validators())); - loginForm = Form.of(Section.of(firstName, lastName, thirdName, email, password)); + loginForm = Form.of(Section.of(email, password)); formContainer.getChildren().add(new FormRenderer(loginForm)); } @FXML private void onSubmit(ActionEvent event) { - boolean valid = - firstName.validate() - & lastName.validate() - & thirdName.validate() - & email.validate() - & password.validate(); + boolean valid = email.validate() & password.validate(); if (!valid) { return; } - User user = authenticate(firstName.getValue(), lastName.getValue(), email.getValue()); - if (user == null) { - return; + try { + User user = services.getAuthService().login(email.getValue(), password.getValue()); + if (user == null) { + return; + } + navigator.goTo("/fxml/Search.fxml"); + } catch (ServiceException e) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Ошибка входа"); + alert.setHeaderText(null); + alert.setContentText(e.getMessage()); + alert.showAndWait(); } - - session.setCurrentUser(user); - navigator.goTo("/fxml/Search.fxml"); - } - - private User authenticate(String firstName, String lastName, String email) { - return new User(UUID.randomUUID(), email, Role.USER, firstName, lastName, true); } @SuppressWarnings("unchecked") From eb0cebb63ce5de10d14d6b21506c90984ce10067 Mon Sep 17 00:00:00 2001 From: Vladimir Valekzhanin Date: Tue, 6 Oct 2026 11:39:28 +0300 Subject: [PATCH 3/3] refactor(ui): rename Search page to ResourceList --- src/main/java/com/DesktopApplicationClientJava/Program.java | 2 +- .../controllers/LoginFormController.java | 2 +- .../{SearchController.java => ResourceListController.java} | 2 +- src/main/resources/fxml/{Search.fxml => ResourceList.fxml} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/com/DesktopApplicationClientJava/controllers/{SearchController.java => ResourceListController.java} (68%) rename src/main/resources/fxml/{Search.fxml => ResourceList.fxml} (92%) diff --git a/src/main/java/com/DesktopApplicationClientJava/Program.java b/src/main/java/com/DesktopApplicationClientJava/Program.java index 9ec2026..1576b79 100644 --- a/src/main/java/com/DesktopApplicationClientJava/Program.java +++ b/src/main/java/com/DesktopApplicationClientJava/Program.java @@ -13,7 +13,7 @@ import javafx.stage.Stage; public class Program extends Application { - private static final String INITIAL_PAGE_PATH = "/fxml/Search.fxml"; + private static final String INITIAL_PAGE_PATH = "/fxml/ResourceList.fxml"; private static final double WINDOW_WIDTH = 800.0; private static final double WINDOW_HEIGHT = 600.0; diff --git a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java index afacf73..86d8d6f 100644 --- a/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java +++ b/src/main/java/com/DesktopApplicationClientJava/controllers/LoginFormController.java @@ -58,7 +58,7 @@ private void onSubmit(ActionEvent event) { if (user == null) { return; } - navigator.goTo("/fxml/Search.fxml"); + navigator.goTo("/fxml/ResourceList.fxml"); } catch (ServiceException e) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("Ошибка входа"); diff --git a/src/main/java/com/DesktopApplicationClientJava/controllers/SearchController.java b/src/main/java/com/DesktopApplicationClientJava/controllers/ResourceListController.java similarity index 68% rename from src/main/java/com/DesktopApplicationClientJava/controllers/SearchController.java rename to src/main/java/com/DesktopApplicationClientJava/controllers/ResourceListController.java index 9112fdd..690b421 100644 --- a/src/main/java/com/DesktopApplicationClientJava/controllers/SearchController.java +++ b/src/main/java/com/DesktopApplicationClientJava/controllers/ResourceListController.java @@ -2,4 +2,4 @@ import com.DesktopApplicationClientJava.controllers.utils.Controller; -public class SearchController extends Controller {} +public class ResourceListController extends Controller {} diff --git a/src/main/resources/fxml/Search.fxml b/src/main/resources/fxml/ResourceList.fxml similarity index 92% rename from src/main/resources/fxml/Search.fxml rename to src/main/resources/fxml/ResourceList.fxml index b6b8878..07bb5e7 100644 --- a/src/main/resources/fxml/Search.fxml +++ b/src/main/resources/fxml/ResourceList.fxml @@ -4,6 +4,6 @@ + fx:controller="com.DesktopApplicationClientJava.controllers.ResourceListController"> \ No newline at end of file