Skip to content

[DevPortal] Fix admin UI and subscriptions#2275

Open
lasanthaS wants to merge 9 commits into
wso2:mainfrom
lasanthaS:main
Open

[DevPortal] Fix admin UI and subscriptions#2275
lasanthaS wants to merge 9 commits into
wso2:mainfrom
lasanthaS:main

Conversation

@lasanthaS

Copy link
Copy Markdown
Contributor

Purpose

Explain why this feature or fix is required. Describe the underlying problems, issues, or needs driving this feature/fix and include links to related issues in the following format: Resolves issue1, issue2, etc.

Goals

Describe what solutions this feature or fix introduces to address the problems outlined above.

Approach

$subject

Security checks

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Updated the Developer Portal’s admin and subscription experience across APIs, MCPs, and workflows.

  • Reworked API and MCP landing/listing pages with new hero layouts, badges, subscription ribbons, and updated navigation/sidebar behavior.
  • Added MCP-specific landing/configuration UI, highlighting, and subscription management flows, including token viewing, suspend/resume, unsubscribe, and plan switching.
  • Simplified subscriptions navigation by removing the per-API subscriptions page and related routing/partials.
  • Expanded API management flows with bulk selection/delete, deprecate actions, richer wizard validation, drag-and-drop uploads, and documentation upload handling.
  • Added API documentation listing support and updated metadata/storage logic for API docs and updates.
  • Enhanced sample seeding to support both sample APIs and sample MCPs.
  • Refreshed shared styling, fonts, and helper logic to match the new UI and subscription behavior.
  • Removed obsolete CLAUDE.md developer documentation.

Walkthrough

The PR adds an API docs listing endpoint and supporting metadata, DAO, and service changes; extends sample seeding to include MCP samples; updates API and MCP catalog pages to show deprecated and subscribed states; replaces the MCP landing layout with a two-column configuration and subscription-management UI; removes the old API subscriptions route and page wiring; and revises the API Flows page for bulk selection, deprecation, document uploads, and a three-step wizard.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ListApiDocs as apiContentHandler.listApiDocs
  participant ApiMetadataService as apiMetadataService.listApiDocs
  participant ApiFileDao as apiFileDao.listDocNames
  participant APIContentDB as APIContentDatabase

  Client->>ListApiDocs: GET /o/{orgId}/devportal/v1/apis/{apiId}/docs
  ListApiDocs->>ApiMetadataService: listApiDocs(orgId, apiId)
  ApiMetadataService->>ApiFileDao: listDocNames(orgId, apiId)
  ApiFileDao->>APIContentDB: query FILE_NAME rows
  APIContentDB-->>ApiFileDao: FILE_NAME values
  ApiFileDao-->>ApiMetadataService: file names
  ApiMetadataService-->>ListApiDocs: [{ fileName }]
  ListApiDocs-->>Client: 200 JSON
Loading
sequenceDiagram
  participant Browser
  participant TokenModal as window.showSubscriptionTokenModal
  participant WarningModal as window.openWarningModal
  participant DevportalApi as devportalApi
  participant SubscribeFn as subscribe

  Browser->>TokenModal: open token modal
  TokenModal->>DevportalApi: GET /subscriptions/{id}
  DevportalApi-->>TokenModal: token payload
  TokenModal-->>Browser: display token modal

  Browser->>WarningModal: switch plan
  WarningModal->>DevportalApi: DELETE /subscriptions/{id}
  DevportalApi-->>WarningModal: delete response
  WarningModal->>SubscribeFn: create replacement subscription
  SubscribeFn-->>Browser: refresh card state
Loading

Suggested reviewers

  • RakhithaRR
  • VirajSalaka
  • renuka-fernando
  • tharindu1st
  • malinthaprasan
  • AnuGayan
  • chamilaadhi
  • Arshardh
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description only partially follows the template and leaves several required sections empty or as placeholders. Fill in the Approach details and add the missing User stories, Documentation, Automation tests, Samples, Related PRs, and Test environment sections.
Docstring Coverage ⚠️ Warning Docstring coverage is 30.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and matches the main changes: DevPortal admin UI fixes and subscription flow updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch main

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.

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/wso2/api-platform/issues/comments/4798861608","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- review_stack_entry_start -->\n\n[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/wso2/api-platform/pull/2275?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)\n\n<!-- review_stack_entry_end -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> <details>\n> <summary>⚙️ Run configuration</summary>\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: CHILL\n> \n> **Plan**: Pro\n> \n> **Run ID**: `2d621f9b-d6b2-4e1b-af1e-b8612350451a`\n> \n> </details>\n> \n> <details>\n> <summary>📥 Commits</summary>\n> \n> Reviewing files that changed from the base of the PR and between d9aeb768fd7a29ffea5c51f23d3a4edd8db0ea57 and cf8b324c4bb5524e84bc5630cba59b1657e9929a.\n> \n> </details>\n> \n> <details>\n> <summary>📒 Files selected for processing (50)</summary>\n> \n> * `portals/developer-portal/CLAUDE.md`\n> * `portals/developer-portal/docs/devportal-openapi-spec-v1.yaml`\n> * `portals/developer-portal/src/controllers/apiContentController.js`\n> * `portals/developer-portal/src/controllers/subscriptionsContentController.js`\n> * `portals/developer-portal/src/controllers/viewConfigureController.js`\n> * `portals/developer-portal/src/dao/apiDao.js`\n> * `portals/developer-portal/src/dao/apiFileDao.js`\n> * `portals/developer-portal/src/dao/subscriptionDao.js`\n> * `portals/developer-portal/src/db/betterSqlite3Compat.js`\n> * `portals/developer-portal/src/defaultContent/pages/api-keys/page.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/api-landing/page.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/api-landing/partials/api-detail-banner.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/api-landing/partials/api-subscription-plans.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/api-subscriptions/page.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/api-subscriptions/partials/api-subscription-list.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/apis/partials/api-listing.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/home/partials/home.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/home/partials/onboarding-overlay.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-config-sidebar.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-default.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-detail-banner.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-subscription-plans.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/mcp/partials/mcp-listing.hbs`\n> * `portals/developer-portal/src/defaultContent/pages/subscriptions/page.hbs`\n> * `portals/developer-portal/src/defaultContent/partials/sidebar.hbs`\n> * `portals/developer-portal/src/defaultContent/styles/api-content.css`\n> * `portals/developer-portal/src/defaultContent/styles/api-landing.css`\n> * `portals/developer-portal/src/defaultContent/styles/api-listing.css`\n> * `portals/developer-portal/src/defaultContent/styles/components.css`\n> * `portals/developer-portal/src/defaultContent/styles/home.css`\n> * `portals/developer-portal/src/defaultContent/styles/login.css`\n> * `portals/developer-portal/src/defaultContent/styles/main.css`\n> * `portals/developer-portal/src/defaultContent/styles/mcp-landing.css`\n> * `portals/developer-portal/src/helpers/handlebarsHelpers.js`\n> * `portals/developer-portal/src/middlewares/registerPartials.js`\n> * `portals/developer-portal/src/pages/api-flows/page.hbs`\n> * `portals/developer-portal/src/pages/api-flows/partials/api-flows.hbs`\n> * `portals/developer-portal/src/pages/api-flows/partials/create-api-flow.hbs`\n> * `portals/developer-portal/src/pages/default-home/page.hbs`\n> * `portals/developer-portal/src/pages/login-page/partials/signin-card.hbs`\n> * `portals/developer-portal/src/routes/api/handlers/apiContentHandler.js`\n> * `portals/developer-portal/src/routes/pages/apiContentRoute.js`\n> * `portals/developer-portal/src/scripts/api-flows.js`\n> * `portals/developer-portal/src/scripts/common.js`\n> * `portals/developer-portal/src/services/apiMetadataService.js`\n> * `portals/developer-portal/src/services/sampleSeederService.js`\n> * `portals/developer-portal/src/styles/api-flows.css`\n> * `portals/developer-portal/src/styles/settings-layout.css`\n> * `portals/developer-portal/src/utils/constants.js`\n> \n> </details>\n> \n> \n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n\n</details>\n<details open>\n<summary>⚔️ Resolve merge conflicts</summary>\n\n- [ ] <!-- {\"checkboxId\": \"c3a5b2e1-4d7f-4a8c-b9d6-e1f2c3d4a5b6\"} --> Resolve merge conflict in branch `main`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=wso2/api-platform&utm_content=2275)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n\n<sub>Comment `@coderabbitai help` to get the list of available commands.</sub>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"signal":{},"retries":3,"retryAfter":16}}}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 15

🧹 Nitpick comments (2)
portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs (1)

21-28: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Consider pinning CDN assets with Subresource Integrity.

The Highlight.js stylesheet and script are loaded from a third-party CDN without integrity/crossorigin attributes. Adding SRI hashes strengthens supply-chain assurance for these pinned versions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs`
around lines 21 - 28, The Highlight.js CDN assets in page.hbs are loaded without
Subresource Integrity, so update the stylesheet and script tags to include
matching integrity values and crossorigin attributes. Keep the existing
Highlight.js version pinned, and make the change in the pageHead/pageScripts
block where the external highlight.js resources are referenced.

Source: Path instructions

portals/developer-portal/src/controllers/viewConfigureController.js (1)

74-74: 🎯 Functional Correctness | 🔵 Trivial

Verify the casing of DP_SUBSCRIPTION_POLICies used in api.DP_SUBSCRIPTION_POLICies.

The code relies on a mixed-case property DP_SUBSCRIPTION_POLICies that is manually assigned in apiMetadataService.js (line 477) rather than generated automatically by Sequelize's standard as alias convention (which typically uses DP_SUBSCRIPTION_POLICY or pluralized model names in the codebase).

While this currently functions due to the explicit manual injection in the data layer, this inconsistency creates a hidden coupling where changes to the DAO implementation or manual assignment logic could silently break the controller without throwing an error. Aligning the property name with the standard association consistency used elsewhere (e.g., api.DP_SUBSCRIPTION_POLICY) is recommended to prevent fragility.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@portals/developer-portal/src/controllers/viewConfigureController.js` at line
74, The controller is reading a manually injected mixed-case association
property, so align the `viewConfigureController` lookup with the standard
Sequelize association name used by the data layer. Update the
`subscriptionPolicies` mapping to use the canonical association symbol exposed
by `apiMetadataService` (for example the normal `DP_SUBSCRIPTION_POLICY` style)
and adjust the controller to rely on that stable name rather than the fragile
`DP_SUBSCRIPTION_POLICies` alias. Verify the corresponding property assignment
in `apiMetadataService` matches the same casing so the controller and DAO stay
consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@portals/developer-portal/src/controllers/apiContentController.js`:
- Around line 116-125: The tag list is being built from the full metadata
instead of the filtered results, so `apiTags` can mismatch the current page.
Update `apiContentController` to derive tags from `filteredList` right after the
`isMcpPage`/`filteredList` logic, and pass those tags into `templateContent` so
`/mcps` and `/apis` only expose tags relevant to the selected API subset.
- Around line 359-365: The subscription mapping in apiContentController should
keep the raw POLICY_NAME in policyName for template comparisons while exposing
the readable label in subscriptionPlanName. Verify the object built from
sub.DP_SUBSCRIPTION_POLICY uses the right fallbacks for POLICY_NAME and
DISPLAY_NAME, and keep the subscriptionToken/maskedToken handling consistent in
the same block.

In `@portals/developer-portal/src/dao/apiFileDao.js`:
- Around line 547-553: The deleteByFileName flow in apiFileDao.js is deleting
rows by FILE_NAME and API_ID only, which can affect non-doc content that shares
the same filename. Update the APIContent query and the subsequent
APIContent.destroy call to apply the same document-type prefix filter used by
listDocNames, so only doc-scoped rows are selected and removed. Keep the change
localized around deleteByFileName and the contentsToDelete loop.

In `@portals/developer-portal/src/defaultContent/pages/api-landing/page.hbs`:
- Around line 32-38: The breadcrumb in page.hbs is resolving the API label
differently than the hero, so align the two displays to use the same field
resolution. Update the breadcrumb current item to match the logic used by
api-detail-banner.hbs and keep apiMetadata.apiInfo as the source of truth, using
the same apiTitle/apiName fallback behavior in both places so the label stays
consistent across the page.

In
`@portals/developer-portal/src/defaultContent/pages/api-landing/partials/api-subscription-plans.hbs`:
- Around line 233-249: The unsubscribe dialog title is being assembled with
dynamic plan names inserted through innerHTML, so update showUnsubDialog and
askUnsub to render the static title markup once and set the plan name via
textContent on the dedicated element instead of interpolating
_sub.subscriptionPlanName into HTML. Apply the same pattern in openWarningModal
as well, so any plan-name or similar dynamic value is handled as text and the
dialog builders remain easy to locate by their function names.

In
`@portals/developer-portal/src/defaultContent/pages/home/partials/onboarding-overlay.hbs`:
- Around line 149-150: Update the onboarding copy in onboarding-overlay.hbs so
it no longer refers only to “sample APIs” now that SAMPLES includes an MCP entry
like TravelAssistantMCP; adjust the headings/messages and any
progress/completion text to use a broader term such as samples or sample
integrations. Locate the existing onboarding strings near the SAMPLES list and
replace any API-specific wording consistently so the text matches the seeded
sample types.

In `@portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs`:
- Around line 28-33: Highlight.js initialization in page.hbs can run before the
`.mc-json-block pre code` and `.mc-config-pre code` nodes exist, so the inline
`querySelectorAll(...).forEach(hljs.highlightElement)` should be guarded until
the DOM is ready. Update the script near the `hljs.highlightElement` call to run
inside a `DOMContentLoaded` check (or equivalent ready-state guard), matching
the deferred script behavior used elsewhere, so the selector runs after the
target elements are present.

In
`@portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-default.hbs`:
- Around line 44-47: The mcp-default.hbs template uses the jsonBeautify helper,
but its registration is not clearly guaranteed in the Handlebars setup. Verify
that handlebarsHelpers.js is imported and jsonBeautify is explicitly registered
in the Handlebars instance initialization used by the developer portal, or
update the setup so this helper is included via the existing helper registration
path.

In
`@portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-subscription-plans.hbs`:
- Around line 257-267: The closeUnsub function is clearing the wrong
_activeSubCard reference because that variable is scoped inside init rather than
shared with the cancel path. Hoist _activeSubCard to the outer IIFE scope in
mcp-subscription-plans.hbs, matching the pattern used in the API partial, so
closeUnsub can reliably reset it when handling the switch/unsubscribe flow.

In
`@portals/developer-portal/src/defaultContent/pages/mcp/partials/mcp-listing.hbs`:
- Around line 136-153: The inline navigation script added in mcp-listing.hbs is
not represented in the allowlist, so update util.js by adding a separate
allowedInlineScripts entry for the data-href-only handler that matches this
script. Keep the existing api-listing combined script entry intact, and ensure
the new entry uniquely covers the click handler logic in the mcp-listing partial
so theme validation accepts it during deployment.

In `@portals/developer-portal/src/defaultContent/styles/main.css`:
- Around line 2-3: The stylesheet has Stylelint violations in the Google Fonts
import and font-family usage. Update the Inter font import in the main
stylesheet to match the configured import-notation rule, and normalize any
font-family token usage in the same file so value-keyword-case is satisfied.
Check the font declaration(s) around the existing `@import` and the related
font-family rule near the referenced style block, then keep both entries
lint-clean with the expected casing and import form.

In `@portals/developer-portal/src/defaultContent/styles/mcp-landing.css`:
- Line 434: The `currentColor` value in the MCP landing styles is tripping the
`value-keyword-case` lint rule, so update the `background` declaration in the
relevant CSS rule to use the lowercase keyword form. Keep the change isolated to
the style definition in `mcp-landing.css` and preserve the existing behavior
while making the keyword casing consistent with Stylelint expectations.

In `@portals/developer-portal/src/pages/api-flows/page.hbs`:
- Line 916: The status mapping in the API flows page is collapsing any
non-DEPRECATED value to PUBLISHED, which causes draft APIs to be published when
saved. Update the status handling around the wz-status select in page.hbs so
editing an API preserves api.apiStatus unless the user explicitly changes it;
either include DRAFT as a selectable option or keep the current value when it is
not one of the allowed choices.

In `@portals/developer-portal/src/services/apiMetadataService.js`:
- Around line 493-497: The update flow in apiMetadataService’s document-upload
section is using apiFileDao.store for req.files.docs, which is not replace-safe
when a filename is re-uploaded. Switch this path to the docs-scoped upsert logic
used by the other update flows so re-uploading the same document replaces the
existing stored file instead of failing or duplicating entries; keep the change
localized to the apiFileDao call inside the req.files.docs loop.

In `@portals/developer-portal/src/services/sampleSeederService.js`:
- Around line 100-104: The pre-check in sampleSeederService is not enough to
prevent duplicate inserts under concurrency, so the catch handling in
seedSampleAPIs and seedSampleMCPs should treat unique-constraint violations as
an idempotent duplicate. Update both catch blocks to detect the DB duplicate-key
error from the transaction insert path and push an { name, status: 'exists' }
result instead of marking it failed, keeping the existing existsByNameVersion
pre-check and result-shaping logic intact.

---

Nitpick comments:
In `@portals/developer-portal/src/controllers/viewConfigureController.js`:
- Line 74: The controller is reading a manually injected mixed-case association
property, so align the `viewConfigureController` lookup with the standard
Sequelize association name used by the data layer. Update the
`subscriptionPolicies` mapping to use the canonical association symbol exposed
by `apiMetadataService` (for example the normal `DP_SUBSCRIPTION_POLICY` style)
and adjust the controller to rely on that stable name rather than the fragile
`DP_SUBSCRIPTION_POLICies` alias. Verify the corresponding property assignment
in `apiMetadataService` matches the same casing so the controller and DAO stay
consistent.

In `@portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs`:
- Around line 21-28: The Highlight.js CDN assets in page.hbs are loaded without
Subresource Integrity, so update the stylesheet and script tags to include
matching integrity values and crossorigin attributes. Keep the existing
Highlight.js version pinned, and make the change in the pageHead/pageScripts
block where the external highlight.js resources are referenced.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2d621f9b-d6b2-4e1b-af1e-b8612350451a

📥 Commits

Reviewing files that changed from the base of the PR and between d9aeb76 and cf8b324.

📒 Files selected for processing (50)
  • portals/developer-portal/CLAUDE.md
  • portals/developer-portal/docs/devportal-openapi-spec-v1.yaml
  • portals/developer-portal/src/controllers/apiContentController.js
  • portals/developer-portal/src/controllers/subscriptionsContentController.js
  • portals/developer-portal/src/controllers/viewConfigureController.js
  • portals/developer-portal/src/dao/apiDao.js
  • portals/developer-portal/src/dao/apiFileDao.js
  • portals/developer-portal/src/dao/subscriptionDao.js
  • portals/developer-portal/src/db/betterSqlite3Compat.js
  • portals/developer-portal/src/defaultContent/pages/api-keys/page.hbs
  • portals/developer-portal/src/defaultContent/pages/api-landing/page.hbs
  • portals/developer-portal/src/defaultContent/pages/api-landing/partials/api-detail-banner.hbs
  • portals/developer-portal/src/defaultContent/pages/api-landing/partials/api-subscription-plans.hbs
  • portals/developer-portal/src/defaultContent/pages/api-subscriptions/page.hbs
  • portals/developer-portal/src/defaultContent/pages/api-subscriptions/partials/api-subscription-list.hbs
  • portals/developer-portal/src/defaultContent/pages/apis/partials/api-listing.hbs
  • portals/developer-portal/src/defaultContent/pages/home/partials/home.hbs
  • portals/developer-portal/src/defaultContent/pages/home/partials/onboarding-overlay.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp-landing/page.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-config-sidebar.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-default.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-detail-banner.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp-landing/partials/mcp-subscription-plans.hbs
  • portals/developer-portal/src/defaultContent/pages/mcp/partials/mcp-listing.hbs
  • portals/developer-portal/src/defaultContent/pages/subscriptions/page.hbs
  • portals/developer-portal/src/defaultContent/partials/sidebar.hbs
  • portals/developer-portal/src/defaultContent/styles/api-content.css
  • portals/developer-portal/src/defaultContent/styles/api-landing.css
  • portals/developer-portal/src/defaultContent/styles/api-listing.css
  • portals/developer-portal/src/defaultContent/styles/components.css
  • portals/developer-portal/src/defaultContent/styles/home.css
  • portals/developer-portal/src/defaultContent/styles/login.css
  • portals/developer-portal/src/defaultContent/styles/main.css
  • portals/developer-portal/src/defaultContent/styles/mcp-landing.css
  • portals/developer-portal/src/helpers/handlebarsHelpers.js
  • portals/developer-portal/src/middlewares/registerPartials.js
  • portals/developer-portal/src/pages/api-flows/page.hbs
  • portals/developer-portal/src/pages/api-flows/partials/api-flows.hbs
  • portals/developer-portal/src/pages/api-flows/partials/create-api-flow.hbs
  • portals/developer-portal/src/pages/default-home/page.hbs
  • portals/developer-portal/src/pages/login-page/partials/signin-card.hbs
  • portals/developer-portal/src/routes/api/handlers/apiContentHandler.js
  • portals/developer-portal/src/routes/pages/apiContentRoute.js
  • portals/developer-portal/src/scripts/api-flows.js
  • portals/developer-portal/src/scripts/common.js
  • portals/developer-portal/src/services/apiMetadataService.js
  • portals/developer-portal/src/services/sampleSeederService.js
  • portals/developer-portal/src/styles/api-flows.css
  • portals/developer-portal/src/styles/settings-layout.css
  • portals/developer-portal/src/utils/constants.js
💤 Files with no reviewable changes (8)
  • portals/developer-portal/src/defaultContent/pages/api-subscriptions/page.hbs
  • portals/developer-portal/src/defaultContent/pages/subscriptions/page.hbs
  • portals/developer-portal/src/defaultContent/pages/api-subscriptions/partials/api-subscription-list.hbs
  • portals/developer-portal/CLAUDE.md
  • portals/developer-portal/src/routes/pages/apiContentRoute.js
  • portals/developer-portal/src/defaultContent/styles/api-content.css
  • portals/developer-portal/src/styles/api-flows.css
  • portals/developer-portal/src/defaultContent/styles/login.css

Comment thread portals/developer-portal/src/controllers/apiContentController.js
Comment thread portals/developer-portal/src/controllers/apiContentController.js
Comment thread portals/developer-portal/src/dao/apiFileDao.js
Comment thread portals/developer-portal/src/defaultContent/styles/main.css
Comment thread portals/developer-portal/src/defaultContent/styles/mcp-landing.css Outdated
Comment thread portals/developer-portal/src/pages/api-flows/page.hbs
Comment thread portals/developer-portal/src/services/apiMetadataService.js
Comment thread portals/developer-portal/src/services/sampleSeederService.js
lasanthaS and others added 2 commits June 25, 2026 19:00
….css

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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.

1 participant