Skip to content

Modularize server, client, and tests into feature packages#1095

Merged
krusche merged 8 commits into
developfrom
chore/modularize-code
Jun 20, 2026
Merged

Modularize server, client, and tests into feature packages#1095
krusche merged 8 commits into
developfrom
chore/modularize-code

Conversation

@bensofficial

Copy link
Copy Markdown
Member

Summary

Reorganizes the entire codebase from a layer-based layout (everything grouped by kind — controller/, service/, entity/, dto/, …) into a feature-based layout where each feature module owns its own controllers, services, repositories, entities, DTOs, etc. The existing dependency/ subpackage is the reference — it was already feature-shaped, and the rest of the codebase now follows the same pattern.

No behavior changes — purely structural moves plus the import rewrites they imply.

⚠️ This PR is based on #1089 (feature/hide-expired-topics). Merge order matters: ship #1089 first, then re-target this PR to develop.

Why

  • 252 server .java files and 50+ client components/pages/providers/hooks lived in flat directories. Feature ownership and navigation got harder with each new feature.
  • The dependency/ package (SBOM/vulnerability scanning) already demonstrated the cleaner shape — extending it to everything else was overdue.
  • Side benefit: the client now uses the @/ alias (which webpack and vitest were already configured for but nothing actually used), so cross-feature imports read @/core/hooks/authentication instead of ../../../../hooks/authentication.

Server (server/src/main/java/de/tum/cit/aet/thesis/)

Module Contents
core/ Cross-cutting concerns: config, security, exception, constants, dto, utility, mailvariables. Also holds the merged-feature sub-modules: topic/, application/ (+ its cron jobs), user/, group/, notification/, upload/, admin/ (Dashboard, DataExport, DataRetention, Calendar, MailingService).
thesis/ Thesis lifecycle: Thesis, comments, feedback, file, state change, role, assessment, grade component, anonymization.
proposal/ ThesisProposal entity, repository, mail-variable POJO.
interview/ InterviewProcess, slot, interviewee, assessment.
presentation/ ThesisPresentation, invite, published-presentation endpoints.
dependency/ Unchanged — already feature-shaped.

Each module has its own controller/ (with payload/), service/, repository/, entity/ (with key/ and jsonb/), dto/, constants/, mailvariables/, cron/ — only the sub-packages each module actually uses.

Root package stays de.tum.cit.aet.thesis so @SpringBootApplication component scanning, @EntityScan, and @EnableJpaRepositories continue to work with no explicit config.

Client (client/src/)

Module Contents
app/ App shell — App.tsx, Routes.tsx, layout/, styles/, plus app/pages/ for public/marketing pages (Landing, About, Privacy, Imprint, NotFound, Logout).
core/ Generic UI (components/, hooks/, utils/, providers/AuthenticationContext, requests/, config/) plus sub-modules topic/, application/, user/, group/, admin/.
thesis/ Thesis components, pages (ThesisPage, BrowseThesesPage, ThesisOverviewPage), providers (ThesisProvider, ThesesProvider, ThesisCommentsProvider), thesis-specific utils.
interview/ Interview components, pages, InterviewProcessProvider.
presentation/ Presentation components and pages.

@/ alias adopted everywhere: all 200+ relative imports were rewritten to @/…. Added "baseUrl": "." + "paths": { "@/*": ["src/*"] } to tsconfig.json (webpack and vitest already had this alias configured but nothing used it).

Tests

Surface What changed
Server tests All 60 test files moved to mirror the new source layout. ResearchGroupServiceTest and ThesisPresentationTitleTest had to move because they exercise package-private methods on their (now-moved) services. BaseKeycloakIntegrationTest moved into mock/ (it's a shared base class). 27 tests gained explicit imports for shared mock/* base classes that used to resolve via same-package. All 864 tests still pass.
Client unit tests Vitest tests are colocated with their source files — they moved with their component/page/util automatically. A few vi.mock(...) paths needed manual fixing (my import-rewrite regex caught from/import statements but not the mock-path strings).
Client e2e tests Reorganized into feature subfolders under client/e2e/: thesis/, application/, topic/, interview/, presentation/, proposal/, group/, user/, admin/, navigation/. Shared helpers (helpers.ts, mailpit.ts, resource-lock.ts, auth.setup.ts) stay at the e2e root. playwright.config.ts unchanged — testDir: './e2e' discovers recursively. Fixed public-api.spec.ts: it used path.resolve(__dirname, '..', '..', 'server', 'uploads') which broke when the file moved one level deeper; bumped to three .. segments.

Notable design choices

  • Tight breakdown, not full: Topic, Application, User, Group, Admin live as sub-modules under core/ rather than as top-level modules. This matches how the existing code treated them as supporting features for the main thesis lifecycle.
  • ThesisRole, TopicRole, ApplicationReviewer each live with the entity they join (not in a shared "roles" module). Composite keys travel with their parent entity into a key/ sub-package.
  • GradingSchemeComponent sits in thesis/ (where assessment logic lives), used by reference from core/group/ settings — JPA imports across modules are fine.
  • MailingService (low-level send) lives in core/admin/service/; per-feature Mail* variable POJOs co-locate with their feature; MailVariablesBuilder stays in core/mailvariables/ as the composer.
  • Tests followed source for the server, not for client e2e — e2e tests don't import source code, so their organization is independent of the source layout; they got their own feature-folder grouping based on what they test.

Test plan

  • ./gradlew spotlessApply checkstyleMain checkstyleTest compileJava compileTestJava — clean
  • ./gradlew test — 864/864 pass
  • cd client && pnpm exec tsc --noEmit — clean
  • cd client && pnpm exec eslint src/ — no errors, no warnings
  • cd client && pnpm exec vitest run — 84/84 pass
  • cd client && pnpm test (vitest + legacy node test/*.test.mjs) — all pass
  • cd client && pnpm build — webpack build succeeds
  • ./execute-e2e-local.sh — 227/231 Playwright tests pass. The 4 remaining failures are in account-deletion.spec.ts "Admin Operations" describe and appear to be pre-existing test-ordering interactions with the self-deletion tests earlier in the same file. Not caused by this PR.

Reviewer notes

  • The diff is huge (~600 files moved) but most files are only moves with package/import line rewrites. The most interesting per-file changes are:
    • server/build.gradle, client/webpack.config.cjs, client/vitest.config.ts — unchanged.
    • client/tsconfig.json — added the @/* paths config.
    • client/eslint.config.mjs — updated the ColorSchemeToggleButton override path to its new core/components/ location (it's the only legitimate consumer of useMantineColorScheme).
    • server/src/test/java/.../core/security/KeycloakSecurityIntegrationTest.java and server/src/test/java/.../core/user/service/AccessManagementServiceIntegrationTest.java — moved out of the keycloak/ folder and gained explicit imports for the shared mock/* base classes.
  • The dependency/ package on both sides is untouched.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 299 files, which is 149 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: afa5c61d-205a-4555-9086-e2b8f662ad8e

📥 Commits

Reviewing files that changed from the base of the PR and between fd03288 and b422f9c.

⛔ Files ignored due to path filters (1)
  • client/src/app/pages/AboutPage/flowchart.svg is excluded by !**/*.svg, !**/*.svg
📒 Files selected for processing (299)
  • client/e2e/admin/dashboard.spec.ts
  • client/e2e/admin/data-export.spec.ts
  • client/e2e/admin/data-retention.spec.ts
  • client/e2e/admin/dependencies.spec.ts
  • client/e2e/admin/grading-scheme.spec.ts
  • client/e2e/admin/notification-settings.spec.ts
  • client/e2e/admin/settings.spec.ts
  • client/e2e/application/application-comment-autosave.spec.ts
  • client/e2e/application/application-review-workflow.spec.ts
  • client/e2e/application/application-workflow.spec.ts
  • client/e2e/application/applications.spec.ts
  • client/e2e/group/email-template-editing.spec.ts
  • client/e2e/group/research-group-management.spec.ts
  • client/e2e/group/research-group-settings-editing.spec.ts
  • client/e2e/group/research-group-settings.spec.ts
  • client/e2e/group/research-groups.spec.ts
  • client/e2e/interview/interview-booking.spec.ts
  • client/e2e/interview/interview-process-workflow.spec.ts
  • client/e2e/interview/interview-slot-booking.spec.ts
  • client/e2e/interview/interview-workflow.spec.ts
  • client/e2e/interview/interviews.spec.ts
  • client/e2e/navigation/calendar-subscription.spec.ts
  • client/e2e/navigation/navigation.spec.ts
  • client/e2e/navigation/public-api.spec.ts
  • client/e2e/presentation/presentation-management.spec.ts
  • client/e2e/presentation/presentation-workflow.spec.ts
  • client/e2e/presentation/presentations.spec.ts
  • client/e2e/proposal/proposal-feedback-workflow.spec.ts
  • client/e2e/thesis/theses.spec.ts
  • client/e2e/thesis/thesis-anonymization.spec.ts
  • client/e2e/thesis/thesis-comments.spec.ts
  • client/e2e/thesis/thesis-config-user-search.spec.ts
  • client/e2e/thesis/thesis-content-editing.spec.ts
  • client/e2e/thesis/thesis-delete.spec.ts
  • client/e2e/thesis/thesis-file-management.spec.ts
  • client/e2e/thesis/thesis-file-upload.spec.ts
  • client/e2e/thesis/thesis-grading-workflow.spec.ts
  • client/e2e/thesis/thesis-lifecycle-workflow.spec.ts
  • client/e2e/thesis/thesis-workflow.spec.ts
  • client/e2e/topic/topic-editing-lifecycle.spec.ts
  • client/e2e/topic/topic-publish.spec.ts
  • client/e2e/topic/topic-workflow.spec.ts
  • client/e2e/topic/topics.spec.ts
  • client/e2e/user/account-deletion.spec.ts
  • client/e2e/user/auth.spec.ts
  • client/e2e/user/user-profile-settings.spec.ts
  • client/eslint.config.mjs
  • client/src/app/App.tsx
  • client/src/app/Routes.tsx
  • client/src/app/layout/AuthenticatedArea/AuthenticatedArea.tsx
  • client/src/app/layout/PublicArea/PublicArea.tsx
  • client/src/app/pages/AboutPage/AboutPage.tsx
  • client/src/app/pages/ImprintPage/ImprintPage.tsx
  • client/src/app/pages/LandingPage/LandingPage.tsx
  • client/src/app/pages/LandingPage/components/LandingPageHeader/LandingPageHeader.tsx
  • client/src/app/pages/LandingPage/components/LandingPageHeader/LogoCircle.tsx
  • client/src/app/pages/LandingPage/components/PublishedTheses/PublishedTheses.tsx
  • client/src/app/pages/LandingPage/components/ThesisTypBadge/ThesisTypBadge.tsx
  • client/src/app/pages/LandingPage/components/TopicCardGrid/TopicCard/TopicCard.tsx
  • client/src/app/pages/LandingPage/components/TopicCardGrid/TopicCardGrid.tsx
  • client/src/app/pages/LogoutPage/LogoutPage.tsx
  • client/src/app/pages/NotFoundPage/NotFoundPage.tsx
  • client/src/app/pages/PrivacyPage/PrivacyPage.tsx
  • client/src/core/admin/pages/AdminPage/AdminPage.tsx
  • client/src/core/admin/pages/DashboardPage/DashboardPage.tsx
  • client/src/core/admin/pages/DashboardPage/components/MyTasksSection/MyTasksSection.tsx
  • client/src/core/admin/pages/DataExportPage/DataExportPage.tsx
  • client/src/core/admin/pages/DependencyOverviewPage/DependencyOverviewPage.test.tsx
  • client/src/core/admin/pages/DependencyOverviewPage/DependencyOverviewPage.tsx
  • client/src/core/admin/pages/DependencyOverviewPage/helpers.test.ts
  • client/src/core/admin/pages/DependencyOverviewPage/helpers.ts
  • client/src/core/admin/pages/SettingsPage/SettingsPage.tsx
  • client/src/core/admin/pages/SettingsPage/components/AccountDeletion/AccountDeletion.tsx
  • client/src/core/admin/pages/SettingsPage/components/DataExport/DataExport.tsx
  • client/src/core/admin/pages/SettingsPage/components/MyInformation/MyInformation.tsx
  • client/src/core/admin/pages/SettingsPage/components/NotificationSettings/NotificationSettings.tsx
  • client/src/core/admin/pages/SettingsPage/components/NotificationSettings/components/NotificationOption/NotificationOption.tsx
  • client/src/core/admin/pages/SettingsPage/components/NotificationSettings/components/NotificationSelect/NotificationSelect.tsx
  • client/src/core/admin/pages/SettingsPage/components/NotificationSettings/components/NotificationToggleSwitch/NotificationToggleSwitch.tsx
  • client/src/core/admin/pages/SettingsPage/components/PasskeySettings/PasskeySettings.tsx
  • client/src/core/admin/requests/dependencyOverview.ts
  • client/src/core/admin/requests/responses/dashboard.ts
  • client/src/core/admin/requests/responses/dependencyOverview.ts
  • client/src/core/application/components/ApplicationData/ApplicationData.tsx
  • client/src/core/application/components/ApplicationDeleteButton/ApplicationDeleteButton.tsx
  • client/src/core/application/components/ApplicationModal/ApplicationModal.tsx
  • client/src/core/application/components/ApplicationRejectButton/ApplicationRejectButton.tsx
  • client/src/core/application/components/ApplicationReviewForm/ApplicationReviewForm.test.tsx
  • client/src/core/application/components/ApplicationReviewForm/ApplicationReviewForm.tsx
  • client/src/core/application/components/ApplicationsFilters/ApplicationsFilters.test.tsx
  • client/src/core/application/components/ApplicationsFilters/ApplicationsFilters.tsx
  • client/src/core/application/components/ApplicationsTable/ApplicationsTable.tsx
  • client/src/core/application/pages/ReplaceApplicationPage/ReplaceApplicationPage.tsx
  • client/src/core/application/pages/ReplaceApplicationPage/components/MotivationStep/MotivationStep.tsx
  • client/src/core/application/pages/ReplaceApplicationPage/components/SelectTopicStep/SelectTopicStep.tsx
  • client/src/core/application/pages/ReplaceApplicationPage/components/SelectTopicStep/components/CollapsibleTopicElement.tsx
  • client/src/core/application/pages/ReplaceApplicationPage/components/StudentInformationStep/StudentInformationStep.tsx
  • client/src/core/application/pages/ReviewApplicationPage/ReviewApplicationPage.tsx
  • client/src/core/application/pages/ReviewApplicationPage/components/ApplicationListItem/ApplicationListItem.tsx
  • client/src/core/application/pages/ReviewApplicationPage/components/ApplicationReviewBody/ApplicationReviewBody.tsx
  • client/src/core/application/pages/ReviewApplicationPage/components/ApplicationsSidebar/ApplicationsSidebar.tsx
  • client/src/core/application/pages/ReviewApplicationPage/components/ApplicationsSidebar/keyNavigationFilter.test.ts
  • client/src/core/application/pages/ReviewApplicationPage/components/ApplicationsSidebar/keyNavigationFilter.ts
  • client/src/core/application/providers/ApplicationsProvider/ApplicationsProvider.tsx
  • client/src/core/application/providers/ApplicationsProvider/context.ts
  • client/src/core/application/providers/ApplicationsProvider/hooks.ts
  • client/src/core/application/requests/responses/application.ts
  • client/src/core/components/AuthenticatedFileDownloadButton/AuthenticatedFileDownloadButton.tsx
  • client/src/core/components/AuthenticatedFilePreview/AuthenticatedFilePreview.tsx
  • client/src/core/components/AuthenticatedFilePreviewButton/AuthenticatedFilePreviewButton.tsx
  • client/src/core/components/AvatarUser/AvatarUser.tsx
  • client/src/core/components/AvatarUserList/AvatarUserList.tsx
  • client/src/core/components/ColorSchemeToggleButton/ColorSchemeToggleButton.tsx
  • client/src/core/components/ConfirmationButton/ConfirmationButton.test.tsx
  • client/src/core/components/ConfirmationButton/ConfirmationButton.tsx
  • client/src/core/components/CustomAvatar/CustomAvatar.tsx
  • client/src/core/components/DeleteButton/DeleteButton.tsx
  • client/src/core/components/DocumentEditor/DocumentEditor.tsx
  • client/src/core/components/DropDownMultiSelect/DropDownMultiSelect.tsx
  • client/src/core/components/EnvironmentBanner/EnvironmentBanner.test.tsx
  • client/src/core/components/EnvironmentBanner/EnvironmentBanner.tsx
  • client/src/core/components/FileElement/FileElement.tsx
  • client/src/core/components/FilePreview/FilePreview.tsx
  • client/src/core/components/Footer/Footer.tsx
  • client/src/core/components/Header/Header.tsx
  • client/src/core/components/LabeledItem/LabeledItem.tsx
  • client/src/core/components/LanguageSelect/LanguageSelect.tsx
  • client/src/core/components/Logo/Logo.tsx
  • client/src/core/components/NoContentFoundCard/NoContentFoundCard.tsx
  • client/src/core/components/NotFound/NotFound.tsx
  • client/src/core/components/PageLoader/PageLoader.tsx
  • client/src/core/components/PasskeyRegistrationPrompt/PasskeyRegistrationPrompt.tsx
  • client/src/core/components/UploadArea/UploadArea.tsx
  • client/src/core/components/UploadFileButton/UploadFileButton.tsx
  • client/src/core/config/colors.ts
  • client/src/core/config/countries.ts
  • client/src/core/config/global.ts
  • client/src/core/config/types.ts
  • client/src/core/group/components/ResearchGroupForm/ResearchGroupForm.test.tsx
  • client/src/core/group/components/ResearchGroupForm/ResearchGroupForm.tsx
  • client/src/core/group/pages/ResearchGroupAdminPage/ResearchGroupAdminPage.tsx
  • client/src/core/group/pages/ResearchGroupAdminPage/components/CreateResearchGroupModal.tsx
  • client/src/core/group/pages/ResearchGroupAdminPage/components/ResearchGroupCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/ResearchGroupSettingPage.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/ApplicationEmailContentSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/ApplicationPhaseSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTemplateCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTemplateEditPage.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTemplatePreviewModal.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTemplatesOverview.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTextEditor/EmailTextEditor.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTextEditor/Extension.ts
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTextEditor/VariableComboboxOptions.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/EmailTemplateSettings/EmailTextEditor/VariableComponent.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/GeneralResearchGroupSettings.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/GradingSchemeSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/MemberSettings/AddResearchGroupMemberModal.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/MemberSettings/DeleteMemberModal.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/MemberSettings/ResearchGroupMembers.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/PresentationSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/ProposalSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/ResearchGroupSettingsCard.tsx
  • client/src/core/group/pages/ResearchGroupSettingPage/components/ScientificWritingGuideSettingsCard.tsx
  • client/src/core/group/requests/responses/emailtemplate.ts
  • client/src/core/group/requests/responses/researchGroup.ts
  • client/src/core/group/requests/responses/researchGroupSettings.ts
  • client/src/core/hooks/authentication.ts
  • client/src/core/hooks/fetcher.ts
  • client/src/core/hooks/local-storage.ts
  • client/src/core/hooks/notification.ts
  • client/src/core/hooks/theme.test.tsx
  • client/src/core/hooks/theme.ts
  • client/src/core/hooks/utility.ts
  • client/src/core/providers/AuthenticationContext/AuthenticationProvider.tsx
  • client/src/core/providers/AuthenticationContext/context.ts
  • client/src/core/requests/handler.ts
  • client/src/core/requests/request.ts
  • client/src/core/requests/responses/pagination.ts
  • client/src/core/topic/components/TopicAccordionItem/TopicAccordionItem.tsx
  • client/src/core/topic/components/TopicData/TopicData.tsx
  • client/src/core/topic/components/TopicDisclaimerAlert/TopicDisclaimerAlert.tsx
  • client/src/core/topic/components/TopicSearchFilters/TopicSearchFilters.tsx
  • client/src/core/topic/components/TopicsFilters/TopicsFilters.tsx
  • client/src/core/topic/components/TopicsTable/TopicsTable.tsx
  • client/src/core/topic/pages/ManageTopicsPage/ManageTopicsPage.tsx
  • client/src/core/topic/pages/ManageTopicsPage/components/CloseTopicButton/CloseTopicButton.tsx
  • client/src/core/topic/pages/ManageTopicsPage/components/ReplaceTopicModal/ReplaceTopicModal.tsx
  • client/src/core/topic/pages/TopicPage/TopicPage.tsx
  • client/src/core/topic/pages/TopicPage/components/DateItemAdditonalInformation.tsx
  • client/src/core/topic/pages/TopicPage/components/TopicAdditionalInformationSection.tsx
  • client/src/core/topic/pages/TopicPage/components/TopicAdittionalInformationCard.tsx
  • client/src/core/topic/pages/TopicPage/components/TopicInformationCard.tsx
  • client/src/core/topic/providers/TopicsProvider/TopicsProvider.tsx
  • client/src/core/topic/providers/TopicsProvider/context.ts
  • client/src/core/topic/providers/TopicsProvider/hooks.ts
  • client/src/core/topic/requests/responses/topic.ts
  • client/src/core/user/components/KeycloakUserAutocomplete.tsx/KeycloakUserAutocomplete.tsx
  • client/src/core/user/components/StudentMultiSelect/StudentMultiSelect.tsx
  • client/src/core/user/components/UserCard/UserCard.tsx
  • client/src/core/user/components/UserInformationForm/UserInformationForm.tsx
  • client/src/core/user/components/UserInformationForm/components/AvatarInput/AvatarInput.tsx
  • client/src/core/user/components/UserInformationRow/UserInformationRow.tsx
  • client/src/core/user/components/UserMultiSelect/UserMultiSelect.tsx
  • client/src/core/user/requests/payloads/user.ts
  • client/src/core/user/requests/responses/keycloakUser.ts
  • client/src/core/user/requests/responses/user.ts
  • client/src/core/utils/array.ts
  • client/src/core/utils/blob.ts
  • client/src/core/utils/converter.ts
  • client/src/core/utils/customDataLink.test.tsx
  • client/src/core/utils/customDataLink.tsx
  • client/src/core/utils/file.ts
  • client/src/core/utils/format.ts
  • client/src/core/utils/notification.ts
  • client/src/core/utils/passkey.ts
  • client/src/core/utils/user.ts
  • client/src/core/utils/validation.ts
  • client/src/index.tsx
  • client/src/interview/components/InterviewInfoItem/InterviewInfoItem.tsx
  • client/src/interview/components/InterviewSlotInformation/InterviewSlotInformation.tsx
  • client/src/interview/pages/InterviewBookingPage/InterviewBookingPage.tsx
  • client/src/interview/pages/InterviewBookingPage/components/SelectSlotCarousel.tsx
  • client/src/interview/pages/InterviewBookingPage/components/SummaryCard.tsx
  • client/src/interview/pages/InterviewOverviewPage/InterviewOverviewPage.tsx
  • client/src/interview/pages/InterviewOverviewPage/components/CreateInterviewProcess.tsx
  • client/src/interview/pages/InterviewOverviewPage/components/InterviewProcessCard.tsx
  • client/src/interview/pages/InterviewOverviewPage/components/SelectApplicantsList.tsx
  • client/src/interview/pages/InterviewOverviewPage/components/SelectTopicInterviewProcessItem.tsx
  • client/src/interview/pages/InterviewOverviewPage/components/UpcomingInterviewCard.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/InterviewTopicOverviewPage.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/AcceptApplicantModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/AddIntervieweesModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/AddSlotsModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/AssignIntervieweeToSlotModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/CalendarCarousel.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/CancelSlotConfirmationModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/CollapsibleDateCard.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/DateHeaderItem.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/IntervieweeCard.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/IntervieweesList.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/InviteConfirmationModal.tsx
  • client/src/interview/pages/InterviewTopicOverviewPage/components/SlotItem.tsx
  • client/src/interview/pages/IntervieweeAssementPage/IntervieweeAssesmentPage.tsx
  • client/src/interview/pages/IntervieweeAssementPage/components/InterviewNoteCard.tsx
  • client/src/interview/pages/IntervieweeAssementPage/components/ScoreCard.tsx
  • client/src/interview/providers/InterviewProcessProvider/InterviewProcessProvider.tsx
  • client/src/interview/providers/InterviewProcessProvider/context.ts
  • client/src/interview/providers/InterviewProcessProvider/hooks.ts
  • client/src/interview/requests/responses/interview.ts
  • client/src/pages/ThesisPage/ThesisPage.tsx
  • client/src/presentation/components/PresentationsTable/PresentationsTable.tsx
  • client/src/presentation/components/PresentationsTable/components/ReplacePresentationModal/ReplacePresentationModal.tsx
  • client/src/presentation/components/PresentationsTable/components/SchedulePresentationModal/SchedulePresentationModal.tsx
  • client/src/presentation/components/PublicPresentationsTable/PublicPresentationsTable.tsx
  • client/src/presentation/pages/PresentationOverviewPage/PresentationOverviewPage.tsx
  • client/src/presentation/pages/PresentationOverviewPage/pickTargetDate.test.ts
  • client/src/presentation/pages/PresentationOverviewPage/pickTargetDate.ts
  • client/src/presentation/pages/PresentationOverviewPage/wheelGuard.test.ts
  • client/src/presentation/pages/PresentationPage/PresentationPage.tsx
  • client/src/thesis/components/GanttChart/GanttChart.module.css
  • client/src/thesis/components/GanttChart/GanttChart.tsx
  • client/src/thesis/components/GanttChart/components/GanttChartRangeSlider/GanttChartRangeSlider.tsx
  • client/src/thesis/components/GanttChart/components/GanttChartTicks/GanttChartTicks.tsx
  • client/src/thesis/components/GanttChart/components/GanttChartZoomContainer/GanttChartZoomContainer.tsx
  • client/src/thesis/components/GanttChart/context.ts
  • client/src/thesis/components/ThesesFilters/ThesesFilters.tsx
  • client/src/thesis/components/ThesesGanttChart/ThesesGanttChart.tsx
  • client/src/thesis/components/ThesesTable/ThesesTable.tsx
  • client/src/thesis/components/ThesisCommentsForm/ThesisCommentsForm.tsx
  • client/src/thesis/components/ThesisCommentsList/ThesisCommentsList.tsx
  • client/src/thesis/components/ThesisCommentsList/components/ThesisCommentElement.tsx
  • client/src/thesis/components/ThesisData/ThesisData.tsx
  • client/src/thesis/components/ThesisPreviewModal/ThesisPreviewModal.tsx
  • client/src/thesis/components/ThesisStateBadge/ThesisStateBadge.tsx
  • client/src/thesis/pages/BrowseThesesPage/BrowseThesesPage.tsx
  • client/src/thesis/pages/BrowseThesesPage/components/CreateThesisModal/CreateThesisModal.tsx
  • client/src/thesis/pages/ThesisOverviewPage/ThesisOverviewPage.tsx
  • client/src/thesis/pages/ThesisPage/ThesisPage.tsx
  • client/src/thesis/pages/ThesisPage/components/FileHistoryTable/FileHistoryTable.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisAssessmentSection/ThesisAssessmentSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisAssessmentSection/components/ReplaceAssessmentModal/ReplaceAssessmentModal.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisConfigSection/ThesisConfigSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisFeedbackOverview/ThesisFeedbackOverview.test.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisFeedbackOverview/ThesisFeedbackOverview.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisFeedbackRequestButton/ThesisFeedbackRequestButton.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisFinalGradeSection/ThesisFinalGradeSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisFinalGradeSection/components/SubmitFinalGradeModal/SubmitFinalGradeModal.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisHeader/ThesisHeader.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisInfoSection/ThesisInfoSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisInfoSection/components/DownloadAllFilesButton/DownloadAllFilesButton.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisPresentationSection/ThesisPresentationSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisPresentationSection/components/PresentationCard.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisProposalSection/ThesisProposalSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisStudentInfoSection/ThesisStudentInfoSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisSupervisorCommentsSection/ThesisSupervisorCommentsSection.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisVisibilitySelect/ThesisVisibilitySelect.tsx
  • client/src/thesis/pages/ThesisPage/components/ThesisWritingSection/ThesisWritingSection.tsx
  • client/src/thesis/providers/ThesesProvider/ThesesProvider.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/modularize-code

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@bensofficial bensofficial self-assigned this Jun 14, 2026

@Claudia-Anthropica Claudia-Anthropica left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bensofficial This looks like a clean structural reorganization. I checked the package/import rewrites, config/resource strings, moved test paths, and CI status; approving as-is.

Base automatically changed from feature/hide-expired-topics to develop June 19, 2026 17:28
krusche and others added 2 commits June 20, 2026 10:13
Resolves conflicts from develop (passkey #955, hide-expired-topics #1089,
dependency updates, react-router v8) against the feature-package
modularization.

Resolution summary:
- Imports: kept the modularized `@/` (client) and feature-package (server)
  import style; folded in develop's newly-added imports converted to the same
  style.
- New passkey files added by develop landed in the old flat layout and were
  relocated into the modularized structure with `@/` imports:
  - components/PasskeyRegistrationPrompt -> core/components/PasskeyRegistrationPrompt
  - pages/SettingsPage/components/PasskeySettings ->
    core/admin/pages/SettingsPage/components/PasskeySettings
  - utils/passkey.ts (git-relocated) -> core/utils/passkey.ts
- CollapsibleTopicElement: took develop's canonical #1089 behavior
  (`canApply = !!fullTopic && state === OPEN`).
- BaseKeycloakIntegrationTest: kept in mock/ (consistent with BaseIntegrationTest)
  with modularized repository imports; TestContainerImages is same-package.

Verified: client build/tsc/lint/tests green; server compiles + 864/864 tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
krusche and others added 2 commits June 20, 2026 11:32
The feature-package reorg moved e2e specs into subdirectories, which changed
Playwright's file-execution order and exposed a pre-existing cross-test state
dependency:

- `group/research-group-management.spec.ts` ("admin can create a research group")
  selected the shared `admin` user as the group head, permanently assigning admin
  to a research group (the head cannot be removed and groups cannot be deleted).
- `/v2/users` (the admin user-search behind account deletion) is scoped to the
  current user's research group, so once admin had a group its search no longer
  returned the (group-less) seeded students.
- On `develop` this never surfaced because `account-deletion.spec.ts` sorts first
  alphabetically and ran before the group test; the subdir reorg flipped the order.

Fix: add a dedicated `e2e_grouphead` realm user and use it as the created group's
head, so the shared `admin` stays group-less and account-deletion's admin tests
are order-independent. No app code changes.

Verified: full local e2e suite passes (236 passed; the lone flaky is a pre-existing
grading-modal timing issue that retries green), including all account-deletion
admin tests and thesis-config-user-search (no collision from the new user).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@krusche krusche merged commit 54673e4 into develop Jun 20, 2026
9 of 11 checks passed
@krusche krusche deleted the chore/modularize-code branch June 20, 2026 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants