Skip to content

Страница №3: просмотр метаданных документа (read-only) - #18

Merged
vladcheck merged 10 commits into
mainfrom
vladcheck/ui-resource-details
Oct 6, 2026
Merged

vladcheck merged 10 commits into
mainfrom
vladcheck/ui-resource-details

Conversation

@vladcheck

Copy link
Copy Markdown
Owner

Что сделано

Read-only страница «Просмотр метаданных документа» (№3 из docs/страницы.md, доступ USER):

  • Метаданные: title, description, createdAt/updatedAt (формат dd.MM.yyyy HH:mm), uuid моноширинным.
  • Таблица файлов: имя, размер, content-type + кнопка «Скачать» в каждой строке (DirectoryChooser → FileService.downloadFile → статус «Сохранено: <имя>»).
  • Кнопка «Назад» → ResourceList. Ошибки сервиса (в т.ч. 404) — в errorLabel, как на логине.

Подготовка (коммит 1)

  1. Navigator.goTo с параметром: перегрузка goTo(fxml, Consumer<Object> withController) — отдаёт контроллер в колбэк после wiring, до смены root. Старый goTo(path) без изменений.
  2. Файлы в модели: Resource.files: List<FileInfo>, маппинг FileDto→FileInfo в toEntity (null → пустой список).
  3. Иерархия ролей: hasRole сравнивает по уровню USER=0 < MODER=1 < ADMIN=2, поэтому isModerator() true и для ADMIN (соответствует RBAC в доке). Сегодня hasRole в прод-коде нигде не использовался — ничего не ломает.

Тесты (коммит 2)

  • Unit (TestFX + моки): загрузка (лейблы + 2 строки), 404 → errorLabel, скачивание (статус / ошибка / отмена диалога — выбор папки вынесен в переопределяемый chooseDirectory), Назад → ResourceList.
  • AuthServiceTest: иерархия USER⊂MODER⊂ADMIN, гость → false.
  • Интеграционные (@tag integration, без моков): 404 на случайном UUID; create/getById/delete под admin.

Проверка

  • mvn verify: 42 unit-теста зелёные, spotless + checkstyle чистые (хуки тоже прошли).
  • ⚠️ Интеграционные локально пропущены: colima/docker демон сейчас не запущен, бэкенд недоступен. Прогнать при поднятом бэкенде: mvn test -Dgroups=integration -DexcludedGroups=
  • Ручной прогон едет вместе со списком №2: временный INITIAL_PAGE_PATH не ставил (без uuid страница покажет ошибку) — входной точкой будет setResourceId из ResourceList.

Вне скоупа (следующие шаги): загрузка/удаление файлов, экспорт, редактирование/удаление ресурса.

Read-only страница №3: метаданные ресурса + таблица файлов со скачиванием, кнопка Назад.

Подготовка: Navigator.goTo с Consumer-колбэком, List<FileInfo> в Resource, hasRole по иерархии USER<MODER<ADMIN.
@gitguardian

gitguardian Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

️✅ There are no secrets present in this pull request anymore.

If these secrets were true positive and are still valid, we highly recommend you to revoke them.
While these secrets were previously flagged, we no longer have a reference to the
specific commits where they were detected. Once a secret has been leaked into a git
repository, you should consider it compromised, even if it was deleted immediately.
Find here more information about risks.


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@vladcheck

Copy link
Copy Markdown
Owner Author

Интеграционные прогнаны против живого бэкенда — 3/3 зелёные (LoginIntegrationTest + 2 новых ResourceDetailsIntegrationTest: 404 на случайном UUID, create/getById/delete под admin). Команда: mvn test -Dgroups=integration -DexcludedGroups=

По ходу добавлен коммит a7b61c2 fix(api): бэкенд отдаёт firstname/lastname вместо firstName/lastName — строгий ObjectMapper ронял getMe в IOException, что маскировалось под «Ошибку соединения». Теперь неизвестные поля игнорируются. Сам рассинхрон имён — вопрос к автору бэкенда, клиент его терпит.

@vladcheck vladcheck self-assigned this Oct 6, 2026
@vladcheck
vladcheck requested review from Deatheh and miyagi18 October 6, 2026 14:31
Unit (TestFX + моки): метаданные + 2 файла, 404 в errorLabel, скачивание (статус/ошибка/отмена диалога), Назад; иерархия hasRole USER<MODER<ADMIN.

Интеграционные (@tag integration, без моков): 404 на случайном UUID, create/getById/delete под admin.

Дока: №3 помечена готовой, зафиксированы решения про Navigator-параметр и hasRole-иерархию.
Бэкенд возвращает firstname/lastname вместо firstName/lastName — строгий ObjectMapper ронял getMe в IOException (маскировался под ошибку соединения). Любой успешный логин против живого API падал.
FAIL_ON_UNKNOWN_PROPERTIES — временный костыль под firstname/lastname бэкенда. Убрать, когда бэкенд перейдёт на camelCase.
Интеграционные тесты тащили дублирующийся сетап (проверка бэкенда, сервисы, креды) и захардкоженный пароль сид-админа, на который ругнулся GitGuardian.

- Общая база ui.integration.IntegrationTestCase: .env через dotenv-java (JUnit/Surefire сами .env не читают, путь приходит из surefire dotenv.path), проверка живого бэкенда, инициализация сервисов.

- Пароль только из окружения или .env (IT_ADMIN_PASSWORD); без него тест скипается через assumeTrue. Секретов в исходниках больше нет, переменные IT_* задокументированы в .env.example.

- Тесты переехали в ui/integration/, @tag("integration") наследуется от базы.
@vladcheck
vladcheck force-pushed the vladcheck/ui-resource-details branch from abb64b6 to 857c22c Compare October 6, 2026 14:38
INITIAL_PAGE_PATH берётся из окружения с дефолтом /fxml/LoginForm.fxml — удобно стартовать сразу с нужной страницы для ручной проверки UI (например /fxml/ResourceDetails.fxml).

Переменная задокументирована в .env.example.
Запуск UI без бэкенда: MOCK_DATA=true собирает ServiceRegistry.mock() вместо ApiClient-версии, окно помечается [MOCK].

- Новый пакет services.mock: MockStore с сидами, MockAuthService (роль по сиду или префиксу email), MockResourceService/MockUsersService (in-memory CRUD + фильтры), MockFileService (скачивание пишет реальный файл-плейсхолдер), MockExportService.

- Контракт MockService с default-хуком doIfInitialPage(); детали без id в мок-режиме сами открывают первый сид (иначе страница пуста).

- Покрыто MockServicesTest (10) и MockFlowTest (mock→UI, 3); MOCK_DATA задокументирована в .env.example.
VS Code без Lombok-плагина не видит сгенерированные геттеры (Maven собирает через annotationProcessorPaths, падает только подсветка). Файл подскажет установить vscjava.vscode-lombok при открытии репо.
Session/Controller → @Getter/@Setter, ServiceRegistry → @AllArgsConstructor, ServiceException/ApiException → @Getter. Вычисляемый getStatus() и конструкторы с super() оставлены вручную — Lombok их не генерирует.

Минус 54 строки, поведение не менялось (verify + IT зелёные).
Два режима запуска рядом (реальный бэкенд / MOCK_DATA без бэкенда), таблица переменных .env и кто их читает. Убран устаревший совет править INITIAL_PAGE_PATH в коде.
@vladcheck vladcheck added page A UI page documentation Improvements or additions to documentation enhancement New feature or request java Pull requests that update java code labels Oct 6, 2026
@vladcheck
vladcheck merged commit 00ac0eb into main Oct 6, 2026
8 checks passed
@vladcheck
vladcheck deleted the vladcheck/ui-resource-details branch October 6, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request java Pull requests that update java code page A UI page

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Страница №3: просмотр метаданных документа (read-only)

1 participant