Skip to content

feat: extract portal packages (portal-backend and portal-app) - #707

Merged
kaviththiranga merged 3 commits into
openchoreo:mainfrom
kaviththiranga:feat/portal-backend-package
Jul 28, 2026
Merged

feat: extract portal packages (portal-backend and portal-app)#707
kaviththiranga merged 3 commits into
openchoreo:mainfrom
kaviththiranga:feat/portal-backend-package

Conversation

@kaviththiranga

Copy link
Copy Markdown
Contributor

Move the backend composition into the published
@openchoreo/backstage-portal-backend (feature bundle + IDP root-router factory) and the app shell into the private
@openchoreo/backstage-portal-app (createPortalApp); app and backend are now thin consumers. Behavior unchanged.

Part of openchoreo/openchoreo#4330

Move the backend composition into the published
@openchoreo/backstage-portal-backend (feature bundle + IDP root-router
factory) and the app shell into the private
@openchoreo/backstage-portal-app (createPortalApp); app and backend are
now thin consumers. Behavior unchanged.

Part of openchoreo/openchoreo#4330

Signed-off-by: Kavith Lokuhewage <kaviththiranga@gmail.com>
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 220 files, which is 120 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --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.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 60920bcf-f0d2-4683-8f87-d0b64a44fcca

📥 Commits

Reviewing files that changed from the base of the PR and between bbc68ce and d8b60e4.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (220)
  • .changeset/config.json
  • .changeset/portal-backend-package.md
  • packages/app/package.json
  • packages/app/src/App.tsx
  • packages/backend/package.json
  • packages/backend/src/index.ts
  • packages/portal-app/.eslintrc.js
  • packages/portal-app/README.md
  • packages/portal-app/package.json
  • packages/portal-app/src/apis.test.ts
  • packages/portal-app/src/apis.ts
  • packages/portal-app/src/apis/OpenChoreoFetchApi.test.ts
  • packages/portal-app/src/apis/OpenChoreoFetchApi.ts
  • packages/portal-app/src/apis/OpenChoreoPermissionApi.test.ts
  • packages/portal-app/src/apis/OpenChoreoPermissionApi.ts
  • packages/portal-app/src/apis/authRefs.ts
  • packages/portal-app/src/apis/customOverrides.test.tsx
  • packages/portal-app/src/apis/customOverrides.tsx
  • packages/portal-app/src/components/DynamicSignInPage.tsx
  • packages/portal-app/src/components/Home/HomePage.tsx
  • packages/portal-app/src/components/Home/RecentlyVisitedCard.tsx
  • packages/portal-app/src/components/Home/index.ts
  • packages/portal-app/src/components/Home/styles.ts
  • packages/portal-app/src/components/Root/LogoFull.tsx
  • packages/portal-app/src/components/Root/LogoIcon.tsx
  • packages/portal-app/src/components/Root/Root.tsx
  • packages/portal-app/src/components/Root/index.ts
  • packages/portal-app/src/components/catalog/ApiDefinitionTabs.tsx
  • packages/portal-app/src/components/catalog/CatalogCardList.tsx
  • packages/portal-app/src/components/catalog/ChoreoEntityKindPicker.tsx
  • packages/portal-app/src/components/catalog/ContainedCatalogGraphCard.tsx
  • packages/portal-app/src/components/catalog/ContextAwareCreateButton.tsx
  • packages/portal-app/src/components/catalog/CustomApiExplorerPage.tsx
  • packages/portal-app/src/components/catalog/CustomCatalogImportPage.tsx
  • packages/portal-app/src/components/catalog/CustomCatalogPage.tsx
  • packages/portal-app/src/components/catalog/CustomPersonalFilters.tsx
  • packages/portal-app/src/components/catalog/EntityLayoutWithDelete.tsx
  • packages/portal-app/src/components/catalog/EntityPage.test.tsx
  • packages/portal-app/src/components/catalog/EntityPage.tsx
  • packages/portal-app/src/components/catalog/EntityRelationWarning.tsx
  • packages/portal-app/src/components/catalog/OpenChoreoAboutCard.tsx
  • packages/portal-app/src/components/catalog/OpenChoreoCatalogEntityPage.tsx
  • packages/portal-app/src/components/catalog/SelectedKindContext.test.tsx
  • packages/portal-app/src/components/catalog/SelectedKindContext.tsx
  • packages/portal-app/src/components/catalog/WorkflowsOrExternalCICard.tsx
  • packages/portal-app/src/components/catalog/catalogLoadState.test.ts
  • packages/portal-app/src/components/catalog/catalogLoadState.ts
  • packages/portal-app/src/components/catalog/catalogSeed.test.ts
  • packages/portal-app/src/components/catalog/catalogSeed.ts
  • packages/portal-app/src/components/catalog/styles.ts
  • packages/portal-app/src/components/catalog/useKindCreateConfig.ts
  • packages/portal-app/src/components/graph/DependencyGraphZoomOverrides.tsx
  • packages/portal-app/src/components/platformOverview/PlatformOverviewPage.test.tsx
  • packages/portal-app/src/components/platformOverview/PlatformOverviewPage.tsx
  • packages/portal-app/src/components/platformOverview/index.ts
  • packages/portal-app/src/components/scaffolder/CustomTemplateCard.tsx
  • packages/portal-app/src/components/scaffolder/CustomTemplateListPage.tsx
  • packages/portal-app/src/components/scaffolder/OpenChoreoScaffolderPage.tsx
  • packages/portal-app/src/components/scaffolder/OpenChoreoTemplateOutputs.tsx
  • packages/portal-app/src/components/scaffolder/ScaffolderCategoryPicker.tsx
  • packages/portal-app/src/components/scaffolder/ScaffolderNamespacePicker.tsx
  • packages/portal-app/src/components/scaffolder/ScaffolderSearchBar.tsx
  • packages/portal-app/src/components/scaffolder/ScaffolderStarredFilter.tsx
  • packages/portal-app/src/components/scaffolder/ScaffolderTagPicker.tsx
  • packages/portal-app/src/components/scaffolder/TemplateCardSkeleton.tsx
  • packages/portal-app/src/components/scaffolder/filterPickerStyles.ts
  • packages/portal-app/src/components/scaffolder/styles.ts
  • packages/portal-app/src/components/search/CustomSearchModal.test.tsx
  • packages/portal-app/src/components/search/CustomSearchModal.tsx
  • packages/portal-app/src/components/search/SearchKindDropdown.tsx
  • packages/portal-app/src/components/search/SearchPage.tsx
  • packages/portal-app/src/components/search/SearchResultItem.tsx
  • packages/portal-app/src/createPortalApp.test.tsx
  • packages/portal-app/src/createPortalApp.tsx
  • packages/portal-app/src/hooks/index.ts
  • packages/portal-app/src/hooks/useAllKinds.ts
  • packages/portal-app/src/hooks/useUserInfo.ts
  • packages/portal-app/src/index.ts
  • packages/portal-app/src/kindIcons.ts
  • packages/portal-app/src/scaffolder/AdvancedConfigurationField/AdvancedConfigurationField.tsx
  • packages/portal-app/src/scaffolder/AdvancedConfigurationField/extensions.ts
  • packages/portal-app/src/scaffolder/AdvancedConfigurationField/index.ts
  • packages/portal-app/src/scaffolder/BuildAndDeployField/BuildAndDeployField.tsx
  • packages/portal-app/src/scaffolder/BuildAndDeployField/extensions.ts
  • packages/portal-app/src/scaffolder/BuildAndDeployField/index.ts
  • packages/portal-app/src/scaffolder/BuildTemplateParameters/BuildTemplateParametersExtension.tsx
  • packages/portal-app/src/scaffolder/BuildTemplateParameters/extensions.ts
  • packages/portal-app/src/scaffolder/BuildTemplateParameters/index.ts
  • packages/portal-app/src/scaffolder/BuildTemplatePicker/BuildTemplatePickerExtension.tsx
  • packages/portal-app/src/scaffolder/BuildTemplatePicker/extensions.ts
  • packages/portal-app/src/scaffolder/BuildTemplatePicker/index.ts
  • packages/portal-app/src/scaffolder/BuildWorkflowParameters/BuildWorkflowParametersExtension.tsx
  • packages/portal-app/src/scaffolder/BuildWorkflowParameters/index.tsx
  • packages/portal-app/src/scaffolder/BuildWorkflowPicker/BuildWorkflowPickerExtension.test.tsx
  • packages/portal-app/src/scaffolder/BuildWorkflowPicker/BuildWorkflowPickerExtension.tsx
  • packages/portal-app/src/scaffolder/BuildWorkflowPicker/index.tsx
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/ClusterComponentTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/ClusterProjectTypeYamlEditorExtension.test.tsx
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/ClusterProjectTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/ClusterResourceTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/ClusterTraitYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/ClusterWorkflowYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ComponentNamePicker/ComponentNamePickerExtension.tsx
  • packages/portal-app/src/scaffolder/ComponentNamePicker/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentNamePicker/index.ts
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/ComponentTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/ComponentWorkflowYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ContainerImageField/ContainerImageField.tsx
  • packages/portal-app/src/scaffolder/ContainerImageField/extensions.ts
  • packages/portal-app/src/scaffolder/ContainerImageField/index.ts
  • packages/portal-app/src/scaffolder/CustomReviewState/CustomReviewStep.test.tsx
  • packages/portal-app/src/scaffolder/CustomReviewState/CustomReviewStep.tsx
  • packages/portal-app/src/scaffolder/CustomReviewState/index.ts
  • packages/portal-app/src/scaffolder/CustomReviewState/styles.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/DeploymentPipelineFormWithYamlExtension.tsx
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/styles.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelinePicker/DeploymentPipelinePickerExtension.tsx
  • packages/portal-app/src/scaffolder/DeploymentPipelinePicker/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelinePicker/index.ts
  • packages/portal-app/src/scaffolder/DeploymentSourcePicker/DeploymentSourcePicker.tsx
  • packages/portal-app/src/scaffolder/DeploymentSourcePicker/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentSourcePicker/index.ts
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/EnvironmentFormWithYamlExtension.tsx
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/styles.ts
  • packages/portal-app/src/scaffolder/GitSecretField/GitSecretDialog.tsx
  • packages/portal-app/src/scaffolder/GitSourceField/GitSourceField.tsx
  • packages/portal-app/src/scaffolder/GitSourceField/extensions.ts
  • packages/portal-app/src/scaffolder/GitSourceField/index.ts
  • packages/portal-app/src/scaffolder/NamespaceEntityPicker/NamespaceEntityPicker.tsx
  • packages/portal-app/src/scaffolder/NamespaceEntityPicker/NamespaceSelectField.tsx
  • packages/portal-app/src/scaffolder/NamespaceEntityPicker/extensions.ts
  • packages/portal-app/src/scaffolder/NamespaceEntityPicker/index.ts
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/NotificationChannelFormWithYamlExtension.test.tsx
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/NotificationChannelFormWithYamlExtension.tsx
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/styles.ts
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/ProjectNamespaceField.tsx
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/index.ts
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/projectNamespaceFieldValidation.test.ts
  • packages/portal-app/src/scaffolder/ProjectParametersField/ProjectParametersField.test.tsx
  • packages/portal-app/src/scaffolder/ProjectParametersField/ProjectParametersField.tsx
  • packages/portal-app/src/scaffolder/ProjectParametersField/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectParametersField/index.ts
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/ProjectTypeYamlEditorExtension.test.tsx
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/ProjectTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ResourceNamePicker/ResourceNamePickerExtension.tsx
  • packages/portal-app/src/scaffolder/ResourceNamePicker/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceNamePicker/index.ts
  • packages/portal-app/src/scaffolder/ResourceParametersField/ResourceParametersField.tsx
  • packages/portal-app/src/scaffolder/ResourceParametersField/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceParametersField/index.ts
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/ResourceTypeYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/ScaffolderLayout.tsx
  • packages/portal-app/src/scaffolder/ScaffolderPreselectionContext.tsx
  • packages/portal-app/src/scaffolder/SwitchField/SwitchFieldExtension.test.tsx
  • packages/portal-app/src/scaffolder/SwitchField/SwitchFieldExtension.tsx
  • packages/portal-app/src/scaffolder/SwitchField/extensions.ts
  • packages/portal-app/src/scaffolder/SwitchField/index.ts
  • packages/portal-app/src/scaffolder/TraitYamlEditor/TraitYamlEditorExtension.tsx
  • packages/portal-app/src/scaffolder/TraitYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/TraitYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/TraitYamlEditor/styles.ts
  • packages/portal-app/src/scaffolder/TraitsField/NoTraitsAvailableMessage.tsx
  • packages/portal-app/src/scaffolder/TraitsField/TraitCard.tsx
  • packages/portal-app/src/scaffolder/TraitsField/TraitPicker.tsx
  • packages/portal-app/src/scaffolder/TraitsField/TraitsFieldExtension.tsx
  • packages/portal-app/src/scaffolder/TraitsField/extensions.ts
  • packages/portal-app/src/scaffolder/TraitsField/index.ts
  • packages/portal-app/src/scaffolder/WorkloadDetailsField/WorkloadDetailsField.tsx
  • packages/portal-app/src/scaffolder/WorkloadDetailsField/extensions.ts
  • packages/portal-app/src/scaffolder/WorkloadDetailsField/index.ts
  • packages/portal-app/src/scaffolder/openChoreoTokenDecorator.ts
  • packages/portal-app/src/scaffolder/types.ts
  • packages/portal-app/src/scaffolder/utils/rjsfUtils.test.ts
  • packages/portal-app/src/scaffolder/utils/rjsfUtils.tsx
  • packages/portal-app/src/setupTests.ts
  • packages/portal-app/src/themes.tsx
  • packages/portal-app/src/utils/kindUtils.ts
  • packages/portal-backend/.eslintrc.js
  • packages/portal-backend/README.md
  • packages/portal-backend/package.json
  • packages/portal-backend/src/features.test.ts
  • packages/portal-backend/src/features.ts
  • packages/portal-backend/src/index.ts
  • packages/portal-backend/src/rootHttpRouter.test.ts
  • packages/portal-backend/src/rootHttpRouter.ts
  • plugins/openchoreo-react/src/hooks/useOpenChoreoCache.test.tsx

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@codecov

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.53846% with 35 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
packages/portal-backend/src/features.ts 15.78% 32 Missing ⚠️
packages/portal-backend/src/rootHttpRouter.ts 50.00% 3 Missing ⚠️

📢 Thoughts on this report? Let us know!

Express the backend composition as data (service factories + lazy import
thunks) so tests can assert it without booting plugins; behavior unchanged.

Part of openchoreo/openchoreo#4330

Signed-off-by: Kavith Lokuhewage <kaviththiranga@gmail.com>
stefinie123
stefinie123 previously approved these changes Jul 27, 2026
With gcTime 0 the unobserved entry is evicted on a setTimeout(0), so the
second fetchQuery raced the GC timer under CI load. Fake timers keep the
timer pending so the test asserts the staleTime contract deterministically.

Signed-off-by: Kavith Lokuhewage <kaviththiranga@gmail.com>
@kaviththiranga
kaviththiranga merged commit ca4d1b2 into openchoreo:main Jul 28, 2026
9 checks passed
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.

2 participants