Conversation
There was a problem hiding this comment.
Pull request overview
Adds a “rewards summary” data path that queries Mooclet reward values directly (instead of deriving from stored posteriors) and surfaces the aggregated results in the experiment details “Reward Feedback” section.
Changes:
- Introduces shared types for rewards summary rows and exports them from the
upgrade_typespackage. - Frontend: adds API endpoint + NGRX actions/effects/reducer/selector plumbing to fetch and store rewards summaries per experiment and display them in the dashboard table.
- Backend: adds an
/experiments/mooclet-rewards/:idendpoint plus services to query Mooclet/valuedata and aggregate counts/success rates by condition.
Reviewed changes
Copilot reviewed 30 out of 30 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| types/src/index.ts | Re-exports new rewards summary types from the Mooclet types module. |
| types/src/Mooclet/index.ts | Adds ExperimentRewardsByCondition and ExperimentRewardsSummary shared types. |
| frontend/projects/upgrade/src/environments/environment-types.ts | Adds getMoocletRewardsData to the API endpoints interface. |
| frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-reward-feedback-section-card/ts-configurable-reward-count-table/ts-configurable-reward-count-table.component.ts | Updates table input typing to consume rewards summary rows. |
| frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-reward-feedback-section-card/ts-configurable-reward-count-table/ts-configurable-reward-count-table.component.html | Updates success rate rendering to display the new string format. |
| frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-reward-feedback-section-card/experiment-reward-feedback-section-card.component.ts | Switches the section card to fetch/display rewards summary via ExperimentService. |
| frontend/projects/upgrade/src/app/features/dashboard/experiments/pages/experiment-details-page/experiment-details-page-content/experiment-reward-feedback-section-card/experiment-reward-feedback-section-card.component.html | Binds table data/loading states to the new observables. |
| frontend/projects/upgrade/src/app/core/local-storage/local-storage.service.ts | Adds defaults for isLoadingRewardsSummary and rewardsSummaries in stored experiment state. |
| frontend/projects/upgrade/src/app/core/local-storage/local-storage.service.spec.ts | Updates local storage defaults tests for the new state fields. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.selectors.ts | Adds selectors for rewards summary data and loading state. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.selector.spec.ts | Adds selector tests for rewards summary + loading selectors. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.reducer.ts | Adds reducer handling for rewards summary fetch success/failure + loading flag. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.reducer.spec.ts | Adds reducer tests for rewards summary actions. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts | Extends ExperimentState with rewards summary storage and loading flag; removes old posteriors table row type. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.effects.ts | Adds effect to call API and dispatch rewards summary success/failure actions. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.effects.spec.ts | Adds effect tests for the rewards summary fetch flow. |
| frontend/projects/upgrade/src/app/core/experiments/store/experiments.actions.ts | Adds NGRX actions for rewards summary fetch flow. |
| frontend/projects/upgrade/src/app/core/experiments/experiments.service.ts | Adds service methods to dispatch fetch action and select rewards summary/loading state. |
| frontend/projects/upgrade/src/app/core/experiments/experiments.data.service.ts | Adds HTTP call to /experiments/mooclet-rewards/:id. |
| frontend/projects/upgrade/src/app/core/api-endpoints.constants.ts | Adds /experiments/mooclet-rewards constant. |
| clientlibs/js/quickTest.ts | Updates local quick test values for reward testing. |
| backend/rest-client-vscode/MoocletAPI.http | Updates Rest Client examples and adds a rewards query example. |
| backend/packages/Upgrade/test/unit/services/MoocletRewardsService.test.ts | Adds unit tests for new rewards summary aggregation methods. |
| backend/packages/Upgrade/test/unit/services/MoocletDataService.test.ts | Adds unit tests for new Mooclet rewards query method. |
| backend/packages/Upgrade/test/unit/controllers/mocks/MoocletRewardsServiceMock.ts | Adds controller mock to support new endpoint tests. |
| backend/packages/Upgrade/test/unit/controllers/ExperimentController.test.ts | Wires in the new rewards service mock for controller tests. |
| backend/packages/Upgrade/src/types/Mooclet.ts | Adds paginated response type and request body for reward count query. |
| backend/packages/Upgrade/src/api/services/MoocletRewardsService.ts | Adds rewards summary fetch + aggregation logic by condition/version mapping. |
| backend/packages/Upgrade/src/api/services/MoocletDataService.ts | Adds getRewardsForExperiment to query Mooclet /value data. |
| backend/packages/Upgrade/src/api/controllers/ExperimentController.ts | Adds /experiments/mooclet-rewards/:id endpoint behind env.mooclets.enabled. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
backend/packages/Upgrade/src/api/services/MoocletRewardsService.ts
Outdated
Show resolved
Hide resolved
...tion-card/ts-configurable-reward-count-table/ts-configurable-reward-count-table.component.ts
Outdated
Show resolved
Hide resolved
...experiment-reward-feedback-section-card/experiment-reward-feedback-section-card.component.ts
Outdated
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/experiments/store/experiments.model.ts
Outdated
Show resolved
Hide resolved
...experiment-reward-feedback-section-card/experiment-reward-feedback-section-card.component.ts
Outdated
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/experiments/store/experiments.actions.ts
Outdated
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/experiments/experiments.data.service.ts
Outdated
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/experiments/store/experiments.selectors.ts
Outdated
Show resolved
Hide resolved
frontend/projects/upgrade/src/app/core/experiments/store/experiments.selector.spec.ts
Outdated
Show resolved
Hide resolved
23188b3 to
bc27a8c
Compare
bc27a8c to
137c1a4
Compare
137c1a4 to
f3b5088
Compare
| moocletRewardsResponse: MoocletPaginatedResponse<MoocletValueResponseDetails>, | ||
| logger: UpgradeLogger | ||
| ): Promise<ExperimentRewardsSummary> { | ||
| const rewards: MoocletValueResponseDetails[] = moocletRewardsResponse.results; |
There was a problem hiding this comment.
Based on the type, this is a paginated response? Could it ever be possible that the results in moocletRewardsResponse.results will be an incomplete data set of only the first [page_length] results?
There was a problem hiding this comment.
i'll re-look at this, I was thinking I could configure the mooclet server to ignore page max limitations but that doesn't seem to work the way i hoped. i guess will need to have it iterate until all are fetched.
There was a problem hiding this comment.
i will push up a commit to iterate through if there are more results than the max page size. Also, the max page size is configurable in Django so I'm going to make it pretty big (it's at 100 currently, 10000 seems good, why not. I checked and nothing else is likely to be affected by this as we wouldn't need limiting by pages for anything we're doing).
bcb37
left a comment
There was a problem hiding this comment.
This looks good and seems to work. Just one question.
#2955
this adds functionality to directly query the mooclet "value" table to count rewards instead of using the currentPosteriors, which is always stale and a little confusing in the UI.
The display remains the same, and we are able to use existing infrastructure to do so without making changes to the mooclet code. 👍