Skip to content

IMS Features Not Covered by tutorials-frontend POC

Admin tools, real-time displays, batch jobs, and other IMS features that exist in the legacy system but are not yet part of the tutorials-frontend POC.

Overview

The IMS application includes a legacy React 15 admin frontend (ui/ module) with 11 distinct pages, a WebSocket-based real-time display (display-application/ + display-ui/ modules), and Spring Batch jobs (job/ module). The tutorials-frontend POC currently covers only the learner-facing tutorial navigation, progress tracking, and App Space event view.

This document catalogs everything else.


1. Content Admin UI (Legacy React 15)

The admin UI is a full CRUD management interface for all IMS entities. It runs as part of the IMS WAR deployment and is accessed by content authors and administrators.

Tech stack: React 15, Redux, Redux-Saga, Webpack 2, HATEOAS/HAL client.

1.1 Tutorials Management (/tutorials)

Type: Read-only table (tutorials are created via AEM/GitHub, not the admin UI)

ColumnSource
TitleLinked to external tutorial page
Primary TagprimaryTag.name
ExperienceexperienceTag.name
Time to CompleteFormatted hours/minutes
Deletion ReasonSoft-delete reason if applicable

API: GET /tutorials with pagination, sorting, search, tag/repository filtering.

POC gap: The POC has no admin view of tutorials. Tutorial content is managed via GitHub repos, but there's no equivalent of this read-only overview table.


1.2 Groups Management (/groups, /groups/new, /groups/:id/edit)

Type: Full CRUD with table list + create/edit forms

Create/Edit fields:

  • Title (required)
  • Description
  • Primary Tag (searchable dropdown, required)
  • Tags (multi-select, required)
  • Experience Tag (filtered dropdown, required)
  • Tutorials (ordered multi-select — defines which tutorials belong to the group)
  • Reset Update Date checkbox (edit only)

API: GET/POST/PATCH/DELETE /groups, with HATEOAS discovery for related tags and tutorials.

POC gap: No group management UI. The POC displays groups within missions but has no way to create, edit, or delete them.


1.3 Missions Management (/missions, /missions/new, /missions/:id/edit)

Type: Full CRUD with complex nested form

Create/Edit fields:

  • Title, Description, Primary Tag, Tags, Experience Tag (same pattern as Groups)
  • Community Mission ID (external SAP Community reference)
  • Event association (optional dropdown — links mission to a timed event)
  • Mission Type (radio): Sequential or Set
    • Sequential: multiple completion paths, full validation rules
    • Set: single path, simplified validation with completion criteria count
  • Completion Paths (nested list):
    • Each path has: Title, Description
    • Each path contains ordered steps, each step has:
      • Type dropdown: Tutorial, Group, or Checkpoint
      • Tutorial/Group selector (conditional on type)
      • Prize selector (optional)

API: GET/POST/PATCH/DELETE /missions, with HATEOAS discovery for tags, events, prizes, tutorials, groups.

POC gap: No mission management UI. This is the most complex admin form — the nested completion-path editor with conditional step types is a significant piece of functionality.


1.4 Events Management (/events, /events/new, /events/:id/edit)

Type: Full CRUD

Create/Edit fields:

  • Name (required)
  • Start Date (datetime picker with timezone handling)
  • End Date (datetime picker)
  • Time Zone (dropdown with UTC offset display)

API: GET/POST/PATCH/DELETE /events

POC gap: No event management. The POC's App Space hardcodes MISSION_ID = 24609 and eventId=38. There's no way to create or configure events.


1.5 Prizes Management (/prizes, /prizes/new, /prizes/:id/edit)

Type: Full CRUD (simple — name field only)

API: GET/POST/PATCH/DELETE /prizes

POC gap: No prize management. Prizes appear in App Space progress series responses but can't be created or edited.


1.6 Accomplishments Management (/accomplishments, /accomplishments/new, /accomplishments/:id/edit)

Type: Full CRUD

Create/Edit fields:

  • Name (required)
  • Description
  • Rule (required textarea — SQL/business logic rule that defines when the accomplishment is awarded)

API: GET/POST/PATCH/DELETE /accomplishments

POC gap: No accomplishment/badge management. The TutorialLayout.vue displays badges from the progress response but there's no admin UI to define them.


1.7 Tags (/tags)

Type: Read-only table

ColumnDescription
TitleTag name
MD formatMarkdown representation
Full pathHierarchical tag path

API: GET /tags

POC gap: No tag management view. Tags are used for filtering in the Tutorial Navigator but managed elsewhere.


1.8 Board / Analytics Dashboard (/board)

Type: Read-only dashboard with charts and KPI tiles

Metrics displayed:

  • Pie chart: Tutorials up-to-date vs. requiring review (from tutorialMeta/infographics)
  • KPI tiles:
    • Total users
    • Total tutorials
    • Total groups
    • Total missions
    • Average tutorial completion %
    • Average group completion %
    • Average mission completion %

API:

  • GET /statistic — overall counts
  • GET /task-records/search/avgProgressByTaskType?taskType=TUTORIAL (and GROUP, MISSION)
  • GET /tutorialMeta/infographics — tutorial freshness counts

POC gap: No analytics dashboard at all.


1.9 Tutorial Dashboard (/tutorialDashboard)

Type: Advanced table with bulk actions — the primary content author tool

This is the most operationally important admin page — it's how content authors track tutorial freshness, ownership, and review status.

ColumnDescription
TutorialLinked title
OwnerContributor name
First AuthorCreator name
Primary TagCategory
Last UpdatedDate
Last ReviewedDate
Repository OwnerName
RepositoryName
MonitoredCheckbox (bulk-toggleable)
ReviewedCheckbox (individually toggleable)
Last Reminder EmailNotification stage info

Features:

  • Monitored status toggle — bulk action to mark tutorials as "monitored by me"
  • Reviewed status toggle — mark individual tutorial as reviewed (resets the outdated timer)
  • Filter by: tags, repository, "monitored by me", outdated status
  • Sort by any column
  • Search by text

API:

  • POST /tutorialMeta/search — complex search with sort params
  • POST /tutorialMeta/setMonitoredStatus?status={bool} — bulk update (body: list of IDs)
  • POST /tutorialMeta/setReviewedStatus?status={bool}&id={id} — individual update
  • GET /tutorialMeta/tags?size=100000 — all tags for filtering
  • GET /tutorialRepository/sortedRepositories?size=100000 — all repos for filtering

POC gap: No tutorial metadata management. This is critical for content operations — without it, there's no way to track which tutorials need review or who owns them.


1.10 Statistics Export (/statistics)

Type: Form + CSV download

Fields:

  • Start Date (required datetime)
  • End Date (required datetime)
  • Mission ID (optional, numeric)

Output: CSV file named CONFIDENTIAL_DD_MMM_YYYY_DD_MMM_YYYY_MISSIONID

API: GET /awardMissions/download.csv?startDate={ts}&endDate={ts}&missionID={id}

POC gap: No statistics export functionality.


1.11 Privacy Protection (/privacy)

Type: User lookup + data operations (GDPR compliance tool)

Search form:

  • PET Number (required)
  • DSR Request Number (required)
  • User ID / C-Number (required)

Operations:

  • View history — table of user's task records (date, type, title, time spent)
  • Download history — export as CSV
  • Anonymize — irreversibly remove user identity and anonymize progress data (with confirmation dialog)

API:

  • GET /task-records/search/findByAccountNumber?accountNumber={c}&petNumber={p}&dsrRequestNumber={d}
  • GET /task-records/download/{filename}.csv?...
  • GET /users/anonymize?accountNumber={c}

POC gap: No GDPR/privacy tooling. This is a compliance requirement that will need to be addressed.


2. Real-Time Event Display (WebSocket)

The display-application/ and display-ui/ modules provide a live dashboard for events (e.g., SAP TechEd, Sapphire). It shows real-time tutorial completion updates grouped into "buckets" (categories by primary tag).

Architecture

Tutorial completed
  → TaskRecord saved
    → Spring ApplicationEvent: AfterUpdateOrSaveTaskRecordEvent
      → BucketUpdateTaskRecordEventHandler
        → BucketUpdateClient.sendBucketUpdate()
          → STOMP message to /topic/events/{eventId}/tutorials
            → All WebSocket subscribers receive BucketUpdateMessage

Endpoints

TypePathDescription
RESTGET /statistic/events/{eventId}/bucketsInitial bucket data (tag-grouped completion counts)
WebSocketSTOMP endpoint: /display (SockJS fallback)Connection endpoint
WebSocketSubscribe: /topic/events/{eventId}/tutorialsReal-time completion updates

Bucket Model

A "bucket" groups completed tutorials by their primary tag within an event's time window. The count is computed via native SQL in BucketRepositoryImpl:

SELECT tag, COUNT(completed tutorials)
FROM task_records
WHERE event_id = ? AND status = 'COMPLETED' AND task_type = 'TUTORIAL'
GROUP BY primary_tag

Display UI

Separate React frontend (display-ui/ module) — pre-built, read-only. Consumes WebSocket messages and renders live completion dashboards. Distinct from the admin UI.

Auth: WebSocket endpoint is public. REST bucket retrieval requires DisplayApp scope.

POC gap: The App Space component (AppSpace.vue) shows event progress but is not real-time — it fetches once on mount. There's no WebSocket integration for live updates.


3. Notification System (Outdated Tutorials)

Automated email notification system that alerts tutorial contributors when their tutorials become outdated (not reviewed within a configurable period).

4-Stage Escalation

StageRecipientsTemplate
0 (First)Tutorial ownerFIRST_OUTDATED_TUTORIAL_NOTIFICATION
1 (Second)Owner + CC: repository ownerSECOND_OUTDATED_TUTORIAL_NOTIFICATION
2 (Third)Owner + CC: admin list + repository ownerTHIRD_OUTDATED_TUTORIAL_NOTIFICATION
3 (Final)Admin list onlyFINAL_OUTDATED_TUTORIAL_NOTIFICATION

Scheduler

  • Cron: 0 0 9 * * ? (daily at 9:00 AM)
  • Resend interval: 1 month between stages
  • Runs with SYSTEM security context

Configuration

yaml
tutorial-meta:
  notification:
    months-to-resend: 1
    email-config-name: emailListForOutdated
    notifications-allowed: isNotificationSendingAllowed
    cron: 0 0 9 * * ?

Admin Endpoints

MethodPathDescription
GET/getRecipientListGet configured email recipients
POST/updateRecipientListUpdate recipient list
GET/sendNotificationManually trigger all pending notifications
GET/sendTutorialNotification?tutorialId={id}Trigger notification for specific tutorial
POST/updateNotificationsSendingStatusEnable/disable automatic sending

POC gap: No notification management. The Tutorial Dashboard's "Last Reminder Email" column and the notification scheduler have no equivalent.


Admin-curated list of promoted tutorials, groups, or missions for homepage display.

How It Works

The Task entity has a featuredOrder integer field. When a task is marked as featured, FeaturedTaskServiceImpl sets this field to an incrementing counter (starting from the current max + 1). Unmarking resets it to 0.

Endpoints

MethodPathAuthDescription
GET/findAllFeaturedTasksAdmin, DeveloperAppGet all featured tasks
GET/getAllFeaturedIdsListAdmin, DeveloperAppGet featured task IDs
GET/getAllFeaturedIdsMapAdmin, DeveloperAppGet featured IDs with display order
POST/setFeaturedOrder/{ids}AdminMark tasks as featured (comma-separated IDs)
DELETE/deleteFeaturedOrder/{ids}AdminUnmark tasks as featured

POC gap: The Tutorial Navigator has no "featured" section or curation capability.


5. Leaderboard & Rankings

User-facing feature showing rankings by task type completion.

Implementation

Exposed as a Spring Data REST projection on the User entity:

GET /users/{id}?projection=leaderBoardRankings

Returns: uuid, sapId, profile, accomplishments, and computed leaderBoardRankings (rankings by GROUP, MISSION, TUTORIAL task types).

  • Cache: eventId cache with 600-second TTL
  • Implementation: LeaderBoardRankingsRepositoryImpl with native SQL queries

POC gap: No leaderboard or ranking display anywhere in the POC.


6. Spring Batch Jobs

Background processing jobs that run on schedule. All execute with SYSTEM authority.

JobSchedulePurpose
Task Record State CalculationOn task-record save (event-driven)Cascade status up the hierarchy (Tutorial → Group → Mission)
Analytics (Adobe)On task-record saveSend completion events to Adobe Analytics (sap.d1.sc.omtrdc.net)
NGDS SyncEvery 2 hours (0 0 */2 * * *)Push task records to SAP internal tracking
Accomplishment ProcessingOn task-record saveEvaluate accomplishment rules, create records
Account MergeDaily at midnightProcess pending account consolidation requests
Active Learner StatsDaily at midnightCompute daily active learner counts
Tags CleanupEvery 6 monthsRemove unused tags
Step Failure CleanupDaily at midnightRemove stale step records older than 30 days
General CleanupEvery hourClean up orphaned/stale data
Batch Metadata CleanupEvery hour at :15Purge old Spring Batch execution metadata

Thread pool: 20 threads, with 50% capacity (10 threads) reserved for analytics jobs via PriorityJobLauncher.

POC gap: The POC has no batch processing. If the CAP backend takes over step completion, it will need to handle (or delegate to IMS) the cascading status calculation, analytics, accomplishment evaluation, and NGDS sync that these jobs perform.


7. Tutorial Repository & Contributor Tracking

Tracks GitHub repository ownership and tutorial contributor information. Used by the notification system for email routing.

Data Model

RepositoryModel (ims_tutorial_repository)
  ├── name (String)
  └── owner → TutorialContributor

TutorialContributor (ims_tutorial_author)
  ├── name (String)
  └── email (String)

TutorialMeta (ims_tutorial_meta)
  ├── tutorial → Tutorial
  ├── repository → RepositoryModel
  ├── notificationNumber (short) — current escalation stage
  └── lastNotificationDate

Endpoints

MethodPathDescription
GET/tutorialRepository/sortedRepositoriesList repos sorted (used by Tutorial Dashboard filter)
PATCH/tutorialRepository/updateTutorialRepositoryOwner/{name}Update repo owner

POC gap: No repository or contributor management. The POC fetches tutorials from GitHub but doesn't track ownership metadata.


8. Account Merge

Consolidates multiple SAP user accounts into one, merging all task records and progress.

Flow

  1. External system (SCI) calls POST /api/v1/user-merge/{uuid} with secondary accounts
  2. IMS stores the merge request
  3. Daily batch job processes pending merges via AccountMergeProcessor
  4. Status queryable via GET /api/v1/user-merge/{uuid}/status

Auth: Requires CONSOLIDATION_SCOPE — not accessible from the admin UI or frontend. Called by SAP's identity consolidation service.

POC gap: Out of scope for the frontend, but the CAP backend would need to be aware of merged users if it maintains its own user table.


Summary: POC Coverage Gap

FeatureIMS ModulePriorityNotes
Tutorial Dashboard (freshness/ownership)Admin UIHighCore content operations tool
Mission Management (nested path editor)Admin UIHighComplex form, no alternative exists
Groups ManagementAdmin UIHighRequired for mission path composition
Board / Analytics DashboardAdmin UIMediumOperational visibility
Events ManagementAdmin UIMediumRequired for App Space configuration
Privacy/GDPR ToolsAdmin UIMediumCompliance requirement
Notification SystemBackendMediumAutomated, but needs admin config UI
Featured Tasks CurationAdmin UIMediumHomepage curation
Real-Time Event Display (WebSocket)Display modulesMediumLive event dashboards
Prizes ManagementAdmin UILowSimple CRUD, event-specific
Accomplishments ManagementAdmin UILowRule-based badges
Statistics ExportAdmin UILowCSV download
LeaderboardUser-facingLowRankings display
Tags (read-only)Admin UILowReference table
Batch JobsBackendN/ABackend concern, not UI
Account MergeBackendN/AExternal system integration
Repository/Contributor TrackingBackendN/ABackend data model, feeds notifications