Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Grant Notes feed #3428 #3532

Merged
merged 32 commits into from
Oct 2, 2024
Merged

Feature: Grant Notes feed #3428 #3532

merged 32 commits into from
Oct 2, 2024

Conversation

greg-adams
Copy link
Contributor

@greg-adams greg-adams commented Sep 20, 2024

Ticket #3428

Description

  • Adds Grant Notes input and feed for Grant Activity sidebar
  • Includes some adjustments for Grant Followers modal to align on styling/implementation
  • Minor adjustments to BE service includes:
    • adding lead ahead approach for pagination mirroring grant followers (next indicating additional set)
    • adding flag to indicate note revision

Screenshots / Demo Video

Screenshot from 2024-09-20 15-58-26

Testing

Automated and Unit Tests

  • Added Unit tests

Manual tests for Reviewer

  • Added steps to test feature/functionality manually

Checklist

  • Provided ticket and description
  • Provided screenshots/demo
  • Provided testing information
  • Provided adequate test coverage for all new code
  • Added PR reviewers

sushilrajeeva and others added 18 commits September 5, 2024 18:59
- Implemented `getOrganizationNotesForGrantByUser()` function in `grantsCollaboration/notes.js`
- Renamed `getOrganizationNotesForGrant()` to `getCurrentNoteRevisions()` and updated signature
- Made conditional `WHERE` clause for `grantId` and `userId` in `getCurrentNoteRevisions()`
- Created API route `GET /:grantId/notes/user/:userId` in `grants.js` for fetching user-specific grant notes
- Added validation for `afterRevision` and `limit` query parameters in the new API
- Ensured results are paginated and ordered by `created_at` in descending order
- Added necessary imports/exports in `grantsCollaboration/index.js`
…t-notes-specific-user-FinderAPI' into feat/grant-notes
@github-actions github-actions bot added dependencies Pull requests that update a dependency file enhancement New feature or request javascript Pull requests that update Javascript code labels Sep 20, 2024
@greg-adams greg-adams self-assigned this Sep 20, 2024
Copy link

github-actions bot commented Sep 20, 2024

QA Summary

QA Check Result
🌐 Client Tests
🔗 Server Tests
🤝 E2E Tests
📏 ESLint
🧹 TFLint

Test Coverage

Coverage report for `packages/client`
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 35.28 34.1 31.93 36.84
🔴  src 0 100 100 0
🔴   App.vue 0 100 100 0 2-9
🔴  src/arpa_reporter 0 100 100 0
🔴   App.vue 0 100 100 0 2-13
🟡  ...ter/components 58.58 48 46.8 59.78
🟡   AlertBox.vue 80 75 50 80 13
🔴   ...oadButton.vue 20 0 0 20 2-7,38-67
🟢   ...ileButton.vue 100 100 100 100
🟢   ...ttonSmall.vue 100 100 100 100
🟢   ...mplateBtn.vue 100 100 100 100
🟡   ...avigation.vue 67.74 63.63 52.63 67.74 ...13-219,228-235
🔴   StandardForm.vue 45 50 41.66 45.45 ...24-128,135-157
🟢  ...porter/helpers 84.61 79.48 87.5 84.61
🟢   form-helpers.js 84.21 79.48 85.71 84.21 7,16,25,81-83
🟢   short-uuid.js 100 100 100 100
🔴  ...eporter/router 0 0 0 0
🔴   index.js 0 0 0 0 20-131
🔴  ...reporter/store 3.92 0 2.17 4.12
🔴   index.js 3.92 0 2.17 4.12 11-14,32-261
🔴  ...reporter/views 40.98 25.13 41.37 42.91
🟢   AgenciesView.vue 100 0 100 100 16
🔴   AgencyView.vue 40.74 36.36 50 45.83 53-62,70-96
🔴   HomeView.vue 26.66 34.14 36.36 26.66 36-66,113,137-207
🔴   LoginView.vue 29.62 36.36 20 30.76 1,4,19-34,72-100
🔴   ...plateView.vue 27.02 35.71 45.45 25 ...2,30-37,69-113
🔴   ...ploadView.vue 24.24 16.66 33.33 26.66 1,30-31,116-144
🔴   ...eriodView.vue 48 18.18 75 52.17 64-90
🟡   ...riodsView.vue 57.57 28.57 60 59.37 101,132,149-171
🔴   ...pientView.vue 40 10.52 30.76 41.02 73-93,110-152
🔴   ...ientsView.vue 48.48 8.33 46.66 53.33 ...46,165-190,203
🟡   UploadView.vue 61.53 43.75 62.5 61.36 ...41-442,448-449
🔴   UploadsView.vue 16.66 0 0 18.18 59,110-287
🔴   UserView.vue 46.34 33.33 68.75 48.64 84,97-137
🟡   UsersView.vue 60 7.69 62.5 66.66 91-92,105-107,123
🔴   ...ationView.vue 37.03 18.18 26.66 41.66 ...19,238,246-270
🟡  src/components 52.75 43.54 53.67 53.44
🔴   ...vityTable.vue 18.75 0 28.57 19.35 115-185
🟡   BaseLayout.vue 69.56 53.84 60 69.56 172,219-231
🔴   CopyButton.vue 30 33.33 40 30 5,53-62
🟡   ...tActivity.vue 78.26 62.85 80 78.26 ...30-135,170,184
🟢   GrantNote.vue 95.23 66.66 100 95.23 58
🟡   GrantNotes.vue 78.57 80.95 77.77 78.04 147-149,168-179
🔴   GrantsTable.vue 45.03 38.77 45 46.85 ...51-455,463-543
🔴   ...dUploader.vue 24.24 33.33 37.5 24.24 16,25,74-111
🔴   SearchFilter.vue 40.74 28 37.5 40 ...52,64,67,72-82
🔴   ShareGrant.vue 44.11 71.42 23.07 45.45 ...03-107,126-147
🟡   UserAvatar.vue 70 75 100 62.5 35-37
🟢   ...eaderText.vue 100 100 100 100
🔴  ...ponents/Modals 30.27 44.34 34 34.09
🔴   ...anization.vue 17.39 65.62 30 22.22 1-14,149-178
🔴   AddTeam.vue 45.45 55.55 61.53 57.69 ...04,210,222-245
🔴   AddUser.vue 36.66 66.66 60 37.5 ...40,145,148-176
🔴   ...anization.vue 15.38 64.28 14.28 16.66 1-15,58-78
🔴   EditTeam.vue 18.18 26.43 33.33 20.83 ...29,208,216-301
🔴   EditUser.vue 21.05 66.66 25 22.22 1,101-128
🔴   ...ilsLegacy.vue 22.03 0 0 24.07 131,177,205-369
🟢   ...Followers.vue 87.5 88.88 66.66 87.5 10,142-143
🟡   ImportTeams.vue 50 41.17 50 53.33 28,64-69,81-82
🔴   ImportUsers.vue 42.85 60 40 46.15 29,65-80
🔴   ...archPanel.vue 27.9 15.78 23.52 28.57 ...68-178,211-255
🔴   SearchPanel.vue 21.62 63.26 32 27.58 ...77-380,386-458
🔴  src/helpers 18.12 17.92 18.6 18.88
🟢   constants.js 100 100 100 100
🟢   currency.js 100 100 100 100
🟡   dates.js 66.66 100 33.33 100
🔴   fetchApi.js 6 13.79 5.26 6.12 10-12,20-132
🔴   filters.js 4 0 0 4.54 19-51
🔴   form-helpers.js 0 0 0 0 5-82
🟡   gtag.js 77.77 90 75 77.77 12,51
🟢   testHelpers.js 100 100 100 100
🔴   ...patWarning.js 0 0 0 0 39-61
🟢  ...s/featureFlags 84.61 100 71.42 84.61
🟡   index.js 60 100 60 60 8,16
🟢   utils.js 100 100 100 100
🔴  src/mixin 20 0 28.57 20
🔴   ...zableTable.js 20 0 28.57 20 16-31,36-37,42
🔴  src/router 18.91 14.28 11.11 18.91
🔴   index.js 18.91 14.28 11.11 18.91 ...76-177,181-200
🟢  src/store 100 100 100 100
🟢   index.js 100 100 100 100
🔴  src/store/modules 2.91 0 4.51 3.04
🔴   agencies.js 5.26 100 8.33 5.55 13-70
🔴   alerts.js 20 100 20 20 10-24
🔴   grants.js 1.04 0 0.98 1.08 61-443
🔴   organization.js 33.33 100 33.33 33.33 21-25
🔴   roles.js 20 100 20 25 13-22
🔴   tenants.js 11.11 100 14.28 12.5 13-32
🔴   users.js 2.43 0 4.76 2.5 17-100
🔴  src/views 42.76 35.95 32.45 44.48
🔴   ...orterView.vue 25.58 51.85 18.18 26.82 ...,62,84,109-151
🟡   ...boardView.vue 50 17.64 50 52 89-98,114-125
🔴   ...tailsView.vue 32.97 14.28 17.07 33.69 ...92-431,437-458
🟢   GrantsView.vue 100 100 100 100
🔴   LoginView.vue 34.61 33.33 22.22 36 1,22,57,109-136
🟡   MyGrantsView.vue 77.77 66.66 66.66 77.77 1,69
🟡   ...ofileView.vue 77.27 75 42.85 77.27 1,32,63,130-134
🟢   NotFoundView.vue 100 100 100 100
🔴   ...tionsView.vue 47.05 57.14 41.66 53.33 ...97-100,114-118
🔴   ...ivityView.vue 46.42 23.8 43.75 46.42 ...01,114,120-134
🔴   TeamsView.vue 44.44 88.88 41.66 53.33 1,58,142,156-163
🟡   UsersView.vue 50 66.66 36.36 53.84 ...16-121,133-139
Coverage report for `packages/server`
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🟡 All files 59.73 53.07 55.33 59.81
🟢  src 81.63 33.33 60 81.63
🟢   configure.js 81.63 33.33 60 81.63 42,61-68,97-99
🟢  src/arpa_reporter 98.75 66.66 100 98.75
🟢   configure.js 97.36 40 100 97.36 36
🟢   environment.js 100 100 100 100
🟢   use-request.js 100 100 100 100
🟡  src/arpa_reporter/db 50.73 45.88 50 51.9
🟡   arpa-subrecipients.js 53.19 50 38.46 54.54 23-60,101,113-122
🔴   reporting-periods.js 37.2 46.87 40 38.09 46,77-156
🟢   settings.js 100 83.33 100 100 13
🟡   uploads.js 50 28.57 52.38 51.42 18-29,84,99-124,141-150
🔴  src/arpa_reporter/lib 29.57 33.08 34.56 28.46
🟢   arpa-ec-codes.js 100 100 100 100
🔴   audit-report.js 21.44 19.35 24.19 21.32 ...28-529,554-684,732-758
🟡   ensure-async-context.js 75 100 50 100
🟢   format.js 90.62 90 90 91.3 41-42
🟡   log.js 75 50 50 75 13,25
🟡   preconditions.js 66.66 33.33 100 66.66 3
🔴   spreadsheet.js 9.09 0 0 9.09 15-32
🟢   validation-error.js 85.71 100 50 85.71 16
🔴  src/arpa_reporter/routes 40 14.92 14.28 40.6
🔴   agencies.js 22.58 0 0 23.33 13-21,26-53
🟡   application_settings.js 75 100 0 75 10-11
🟡   audit-report.js 68.91 58.33 100 68.91 57-58,64-78,100-116
🟢   exports.js 81.42 83.33 100 81.42 61-75,98-99
🔴   reporting-periods.js 20 0 0 20.43 ...25-137,143-149,154-180
🔴   subrecipients.js 23.8 0 0 23.8 12-13,17-27,31-48,52-63
🔴   uploads.js 28.28 7.89 9.09 29.16 ...33-154,164-166,173-180
🔴   users.js 19.6 0 0 20 15-35,39-44,48-81
🔴  src/arpa_reporter/services 44.32 34.79 46.42 44.6
🔴   generate-arpa-report.js 36.86 2.77 50 37.24 ...-975,984-997,1071-1138
🔴   get-template.js 21.62 0 0 21.62 18-79
🟡   persist-upload.js 68.6 90 69.56 68.67 ...58-200,221-235,273-295
🔴   records.js 20.75 0 11.11 21.15 38-204,221-276
🔴   revalidate-uploads.js 37.5 100 0 37.5 5-14
🔴   validate-upload.js 43.56 58.51 37.03 44.2 ...52,371,393,411-688,703
🟢   validation-rules.js 98.18 90 90.9 100 157,173
🟡  src/db 74.26 71.42 68.42 74.29
🟢   connection.js 100 50 100 100 6
🟢   constants.js 100 100 100 100
🟡   helpers.js 75 83.33 50 75 5,21-22
🟢   index.js 82.4 78.54 82.08 82.35 ...48-1414,1596-1597,1604
🟢   saved_search_migration.js 92 88.23 71.42 93.61 5,69,134
🔴   [tenant_creation.js](https://github.com/usdigitalresponse/usdr-gost/blob/71401734b2d18ae7...*[Comment body truncated]*

Copy link

github-actions bot commented Sep 20, 2024

Terraform Summary

Step Result
🖌 Terraform Format & Style
⚙️ Terraform Initialization
🤖 Terraform Validation
📖 Terraform Plan

Hint: If "Terraform Format & Style" failed, run terraform fmt -recursive from the terraform/ directory and commit the results.

Output

Validation Output
stdout:
Success! The configuration is valid.


-------------------------------------
stderr:

Plan Summary
CHANGE RESOURCE
add module.website.aws_s3_object.origin_dist_artifact["assets/ActivityTable-HpSWc4vq.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/ActivityTable-HpSWc4vq.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/ArpaAnnualPerformanceReporterView-DdpOv8mW.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/ArpaAnnualPerformanceReporterView-DdpOv8mW.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/DashboardView-B3C_sjpt.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/DashboardView-B3C_sjpt.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsLegacy-CvOoHrw2.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsLegacy-CvOoHrw2.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-B56Swxv6.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-B56Swxv6.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-CJjPy3Va.css"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsTable-2hWeFXuk.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsTable-2hWeFXuk.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsView-MJODZw-0.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsView-MJODZw-0.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyGrantsView-CXksCoX9.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyGrantsView-CXksCoX9.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyProfileView-DAcYT_c9.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyProfileView-DAcYT_c9.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/NotFoundView-Dq2D2r_T.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/NotFoundView-Dq2D2r_T.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/OrganizationsView-hxT44UGj.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/OrganizationsView-hxT44UGj.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecentActivityView-Zz0cso3k.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecentActivityView-Zz0cso3k.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecordUploader-DQE-VI5b.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecordUploader-DQE-VI5b.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/TeamsView-1qbFi53E.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/TeamsView-1qbFi53E.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/UsersView-DNjMta-f.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/UsersView-DNjMta-f.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/arpa_reporter-D8GHjn_n.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/arpa_reporter-D8GHjn_n.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/form-helpers-l9UGmAU7.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/form-helpers-l9UGmAU7.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-BUfKPw1G.css"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-CkyDCPhB.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-CkyDCPhB.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/style-BJUrPwgR.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/style-BJUrPwgR.js.map"]
update module.api.aws_ecs_service.default[0]
module.api.module.grant_digest_scheduled_task.aws_iam_role_policy.default[0]
module.api.module.grant_digest_scheduled_task.aws_scheduler_schedule.default[0]
module.arpa_audit_report.aws_ecs_service.default
module.arpa_treasury_report.aws_ecs_service.default
module.consume_grants.aws_ecs_service.default
module.website.aws_s3_object.deploy-config[0]
module.website.aws_s3_object.origin_dist_artifact["arpa_reporter/index.html"]
module.website.aws_s3_object.origin_dist_artifact["index.html"]
recreate module.api.aws_ecs_task_definition.default[0]
module.arpa_audit_report.aws_ecs_task_definition.consumer
module.arpa_treasury_report.aws_ecs_task_definition.consumer
module.consume_grants.aws_ecs_task_definition.consume_grants
delete module.website.aws_s3_object.origin_dist_artifact["assets/ActivityTable-BERNsNoe.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/ActivityTable-BERNsNoe.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/ArpaAnnualPerformanceReporterView-MTGBQi4m.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/ArpaAnnualPerformanceReporterView-MTGBQi4m.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/DashboardView-DnODJoQA.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/DashboardView-DnODJoQA.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsLegacy-nImTPqRD.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsLegacy-nImTPqRD.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-DRPQpa6U.css"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-DdwKhj2G.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantDetailsView-DdwKhj2G.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsTable-Bxcy79UT.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsTable-Bxcy79UT.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsView-n-AWSHay.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/GrantsView-n-AWSHay.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyGrantsView-CjfGULuS.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyGrantsView-CjfGULuS.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyProfileView-BpJVLbar.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/MyProfileView-BpJVLbar.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/NotFoundView-Dx5h8LJl.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/NotFoundView-Dx5h8LJl.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/OrganizationsView-DQYt2bKT.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/OrganizationsView-DQYt2bKT.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecentActivityView-Cfmtqc9y.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecentActivityView-Cfmtqc9y.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecordUploader-BQGjkB12.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/RecordUploader-BQGjkB12.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/TeamsView-QAgym5pp.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/TeamsView-QAgym5pp.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/UsersView-CFZTK-eh.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/UsersView-CFZTK-eh.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/arpa_reporter-CODkg3ML.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/arpa_reporter-CODkg3ML.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/form-helpers-Bc7ZeoY_.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/form-helpers-Bc7ZeoY_.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-Cswunvjw.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-Cswunvjw.js.map"]
module.website.aws_s3_object.origin_dist_artifact["assets/main-D0aFysxv.css"]
module.website.aws_s3_object.origin_dist_artifact["assets/style-BjEXhLiJ.js"]
module.website.aws_s3_object.origin_dist_artifact["assets/style-BjEXhLiJ.js.map"]

Pusher: @greg-adams, Action: pull_request_target, Workflow: Continuous Integration

@greg-adams
Copy link
Contributor Author

@TylerHendrickson Changes from #3471 are merged and PR can be reviewed

Copy link
Member

@TylerHendrickson TylerHendrickson left a comment

Choose a reason for hiding this comment

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

@greg-adams Overall this is looking great. I have a few suggestions that I'd like your take on ahead of approval.

'r.text',
])
const subquery = knex
.select(knex.raw(`r.*, count(*) OVER() AS total_revisions`))
Copy link
Member

Choose a reason for hiding this comment

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

This is a bit of a nit, but given that we're only interested in knowing whether there is more than 1 revision (rather than the total), I'm wondering if we should limit the potential impact of the window function by moving it to a new layer between the outermost query and the subquery, for example:

-- outer query
LEFT JOIN LATERAL (
  SELECT 
    recent_revs.*, 
    count(recent_revs.*) OVER() > 1 as is_revised
  FROM (
    SELECT
      r.id,
      r.grant_note_id,
      r.created_at,
      r.text
    FROM grant_notes_revisions r
    WHERE r.grant_note_id = grant_notes.id
    ORDER BY r.created_at DESC
    LIMIT 2
  ) AS recent_revs
  ORDER BY recent_revs.created_at DESC
  LIMIT 1
) AS rev

The basic idea is that the window function would be prevented from counting more than 2 rows, rather than needing to scan an unbounded number of rows.

PS- I tried to see if just adding > 1 to the window function as it's currently implemented would do this automatically, but it seems that the Postgres query planner still performs the full count beyond just satisfying the > 1 determination.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

no worries, I've updated to include this limit

@@ -86,21 +84,29 @@ async function getCurrentNoteRevisions(
}

if (afterRevision) {
query = query.andWhere('rev.id', '>', afterRevision);
query = query.andWhere('rev.id', '<', afterRevision);
Copy link
Member

Choose a reason for hiding this comment

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

Good catch.

Given this, what do you think about renaming the afterRevision variable name, given that it's currently a bit misleading? A few thoughts on what to do instead:

  1. Rename to beforeRevision. Other than leaving it as-is, this seems the most straightforward.
  2. Rename to paginateFrom (similar to the API) or cursor (more descriptive). Both of these are more generic (and maybe appropriate for standardizing other similar functions in the grantsCollaboration package).

Personally, I prefer the second option because they don't imply a direction, which would be better if we eventually decided to expand functionality by allowing callers to specify a direction.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes this makes sense - I've updated both to use cursor naming, and we can add direction where needed

</b-form-group>
</div>

<!-- Users Note -->
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
<!-- Users Note -->
<!-- Current User's Note -->

async fetchNextNotes() {
const query = {
grantId: this.currentGrant.grant_id,
limit: 4,
Copy link
Member

Choose a reason for hiding this comment

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

Per a conversation I had with @ClaireValdivia recently about improving test-ability, what do you think of adding this function to packages/client/src/helpers/featureFlags/index.js, and calling that function on this line?

export function grantNotesLimit() {
  return parseInt(getFeatureFlags().grantNotesLimit, 10) || 4;
}

This would enable users to run something like window.APP_CONFIG.overrideFeatureFlag(grantNotesLimit, 1) and change the pagination size on-the-fly.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

very useful idea - added!

Copy link
Member

@TylerHendrickson TylerHendrickson left a comment

Choose a reason for hiding this comment

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

@greg-adams Looks great – approved!

@greg-adams greg-adams enabled auto-merge (squash) October 2, 2024 15:48
@greg-adams greg-adams merged commit 5e71973 into main Oct 2, 2024
19 checks passed
@greg-adams greg-adams deleted the feat/grant-notes branch October 2, 2024 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file enhancement New feature or request javascript Pull requests that update Javascript code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants