Skip to content

chore(server,webapp): delete ELO league-points and weekly Slack top-3 task #1271

@FelixTJDietrich

Description

@FelixTJDietrich

Part of #1206.

What ships

One cleanup PR that removes both halves of the current ranking mechanic — the ELO league-points subsystem and the weekly Slack "top 3 reviewers" broadcast. Replacement surfaces (#1272, #1273) read from practice_finding directly without any ELO-derived input.

Server-side deletions (Java, application-server):

  • LeaguePointsService, LeaguePointsRecalculationService, LeaguePointsUpdateTask, LeagueChangeDTO, LeaguePointsConstants
  • LeaderboardSortType.LEAGUE_POINTS enum constant (the enum itself is removed by refactor(server): extract ProfileActivityService from leaderboard internals #1272's API refactor; this sub-issue removes the constant + every reference)
  • LeaguePointsRecalculator SPI under workspace/
  • SlackWeeklyLeaderboardTask (Java class) and its @Scheduled registration
  • The global allowlist LeaderboardProperties.workspaceSlugs (field, config binding, application.yml entry)
  • Tests for all deleted classes (deleted, not commented out)

Server-side schema (delegated to #1277, called out here):

Webapp (TypeScript) deletions:

  • LeagueIcon component + assets
  • ScoringExplanationDialog component
  • ELO-display components on leaderboard / profile rendering rank, league points, league-change tooltips

API contract:

The SlackMessageService from #1246 is not deleted — it remains as a per-workspace utility used by other Slack-side surfaces. Only the leaderboard-task path through it is removed.

Why

The leaderboard transformation epic's foundational decision is that ELO ranking + public weekly broadcasts contradict the SDT-aligned formative-feedback mentor thesis the rest of the product is built around. Deleting both mechanisms — not flagging them off — is the right operational move: a flag-gated leaderboard rots and leaks (the existing WorkspaceFeatures.leaderboardEnabled is webapp-only and the API leaks the data regardless, captured as a separate fix in #1276); deleted code cannot leak. Combining both deletions into one PR keeps the cleanup atomic — the rest of the epic depends on the namespace being clear.

Acceptance criteria

  • Every class listed above is deleted from server/application-server/src/main/java/de/tum/in/www1/hephaestus/; build succeeds; no remaining import references the deleted symbols
  • LeaderboardSortType.LEAGUE_POINTS is removed; any controller / service method that accepted it as a parameter rejects requests carrying it with a structured 400; test asserts the failure shape is helpful
  • LeaguePointsRecalculator SPI is removed; implementations in feature modules are deleted or simplified to no-op stubs in the same PR
  • LeaguePointsRecalculator and SlackWeeklyLeaderboardTask @Scheduled registrations are gone; Spring starts cleanly with no UnknownConfigurationProperty warning, no startup error
  • LeaderboardProperties.workspaceSlugs is removed from class + application.yml; no @ConfigurationProperties binding remains
  • LeagueIcon, ScoringExplanationDialog, and any ELO-display webapp components are deleted; profile page asserts no data-testid containing league is present (Playwright)
  • Webapp build does not import any deleted symbol; a build-time check (tsc strict + existing import-lint) fails the PR if a dead reference remains
  • All unit tests covering deleted classes are deleted; test-count delta matches deletion expectations recorded in the PR description
  • An ArchUnit test rejects any new code referencing deleted class names under de.tum.in.www1.hephaestus (covers LeaguePoints*, LeagueChange*, LeaguePointsConstants, SlackWeeklyLeaderboardTask)
  • An integration test exercises a non-leaderboard Slack message path and asserts SlackMessageService still works (the survivor is intact)
  • CHANGELOG entry under "Breaking changes" documents that workspace API responses no longer carry leaguePoints / leagueChange / rank fields, and that the weekly top-3 reviewers broadcast is removed; release notes frame the change as "replacing the broadcast with per-user reflection" via feat(server): MentorReflectionScheduler with per-user cadence and time of day #1258

Tests to write

  • Compile-time + ArchUnit-time assertions are the bulk of the test work.
  • Regression integration test for LeaderboardController endpoints asserting response shapes are stripped of deleted fields.
  • Webapp Playwright spec on the profile page asserting no league icon / score badge renders.
  • Spring-startup cleanliness test (no warnings / errors related to removed bindings).
  • SlackMessageService survival assertion.

Implementation notes

Dependencies

Depends on #1246 shipping first (so #1050 is closed by routing, not deletion). Blocks #1272, #1277.

Metadata

Metadata

Assignees

No one assigned

    Labels

    application-serverSpring Boot server: APIs, business logic, databasebreakingIntroduces breaking API or behavior changespriority:highAddress this sprint - Significant impactrefactorCode restructuring without changing behaviorwebappReact app: UI components, routes, state management

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions