Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,12 @@

```bash
git pull --rebase
```
```

## RBAC

В системе предусмотрено 3 роли: пользователь, модератор и администратор:

```plain
Пользователь (USER) <- Модератор (MODER) <- Администратор (ADMIN)
```
24 changes: 24 additions & 0 deletions docs/страницы.md
Original file line number Diff line number Diff line change
@@ -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`, а не отдельными страницами.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -17,43 +14,22 @@
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;

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)
Expand All @@ -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/ResourceList.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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@

import com.DesktopApplicationClientJava.controllers.utils.Controller;

public class SearchController extends Controller {}
public class ResourceListController extends Controller {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:id="root"
fx:controller="com.DesktopApplicationClientJava.controllers.SearchController">
fx:controller="com.DesktopApplicationClientJava.controllers.ResourceListController">
<Label text="Welcome!" fx:id="welcomeLabel" styleClass="h1" />
</VBox>
Loading