feat: external SAP channels P1 foundation - #2142
Merged
Merged
Conversation
- Hugo section hugo/content/channels/_index.md + layout hugo/layouts/channels/list.html baking channels.json via .Site.Data.channels.channels into a <script type=application/json> data island; island referenced via island-src partial (content-hash safe) - Vue 3 island hugo-apps/src/channels-directory/ with ChannelsDirectory.vue (faceted search: query, category, platform, ownerScope; community badge on non-SAP channels) - Pure filterChannels() exported from filter.ts; filter.test.ts covers all filter axes (3/3 pass) - Vite entry channels-directory registered in hugo-apps/vite.config.ts
- list.html: add | safeJS to jsonify pipeline so Go html/template emits the JSON value verbatim inside <script> rather than as a JS string literal (matches browse sibling pattern; without it JSON.parse returns a string, not an array, and the island renders zero cards) - filter.test.ts: add YouTube fixture row so platform filter shows exclusion; add multi-facet combination it() proving rows must satisfy ALL active facets (query+ownerScope, category+ownerScope, ownerScope+platform); 4 tests now
Adds docs/developers/reference/channels.md covering: - Channels entity (namespace, persistence journal, array columns, curated cols) - seed-channels re-ingest CLI (idempotent upsert, preserve curated, retire-on-absence, flags) - /build/channels feed → fetch-channels.ts → hugo/data/channels.json (wired into build:all) - /channels Hugo directory page + channels-directory Vue island (filterChannels facets) - promote-channels verb-lane fill (category→shelf, FOCUS_TO_VERB, community never START_HERE) - AdminService.Channels projection + admin FE app + shell wiring via generate-manifest - P1 scope / P2-P4 deferred items Adds one Top Gotchas bullet in CLAUDE.md pointing to channels.md.
cds build --production regenerated db/last-dev/csn.json (adds the Channels entity definition, +191 lines) and generated the new v1 migration table db/src/com.sap.developers.ims.Channels.hdbmigrationtable. Required to make the check-cds-build-staging CI gate green for the new persisted entity.
jung-thomas
marked this pull request as ready for review
September 4, 2026 17:42
This was referenced Sep 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
External Channels — P1 foundation
Integrates the 238-channel SAP developer-channels research dataset into developers.sap.com as a living, DB-driven, re-ingestable subsystem. P1 scope only (foundation + ingestion +
/channelsdirectory + Surface A verb-lane fill + admin CRUD). P2–P4 (collections, topic crosswalk, submissions) are separate follow-up plans.Spec:
docs/superpowers/specs/2026-09-04-external-channels-integration-design.mdPlan:
docs/superpowers/plans/2026-09-04-external-channels-p1-foundation.mdWhat's in this PR
Channelsentity (db/channels.cds,com.sap.developers.ims) — source of truth;@assert.unique.sourceId,@assert.rangeenums, 4 array-of-String cols, curation columns (isPublished/isFeatured/editorialNote/linkStatusOverride…). Journaled viadb/persistence.cds; aggregated indb/schema.cds.scripts/seed-channels.cjs(idempotent upsert onsourceId, preserves curated columns, soft retire-on-absence) + puresrv/lib/channels/normalize.js(cite-stripping, enum normalization, content hash)./build/channelsread feed (srv/server.js, published + non-broken, parsed arrays) →scripts/fetch-channels.tsbakeshugo/data/channels.json(wired intobuild:all) → Hugo/channelspage + Vue facet/search island (hugo-apps/src/channels-directory/).srv/lib/channels/promote-to-shelves.js+scripts/promote-channels-to-shelves.cjs; community items never land inSTART_HERE(structural guard), uppercaseHomepageVerbmapping, idempotent upsert on[verb,url],THIRD_PARTYbadge.AdminService.Channelsdraft-enabled projection (XSUAA-guarded) + Fiori Elements appapp/admin/channels/wired into the admin shell (generator-driven manifest, nav entry).docs/developers/reference/channels.md+CLAUDE.mdgotcha bullet.Verification
npx cds deploy --to sqlite::memory:→ exit 0.Follow-ups (non-blocking, for Tom's call)
focusAreas&statusare baked intochannels.jsonbut not yet wired as facets; per-channel card shows a single "Community" badge (no SAP-official/User-Group/Third-party split, no related-links display)./build/channelsfeed spreads the full row (...r) — managed audit + curation columns into the anon feed; no secrets, and matches the sibling/build/homepage-shelvespattern.CONNECTverb unreachable inFOCUS_TO_VERB;CATEGORY_TO_SHELFcase-sensitive exact-match;mapChannelToShelftyped|nullbut never returns null (cosmetic).Deploy note
Admin-shell changes are bundle-gated — require a FULL
mbt build/npm run deploy(no--skip-build, no-mscoping) or the admin UI ships stale.