Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add notification table and model for in-system notifications - #69

Open
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend
Open

Add notification table and model for in-system notifications#69
samindiii wants to merge 9 commits into
thoth-tech:9.xfrom
samindiii:feature/extension-notification-backend

Conversation

@samindiii

@samindiiisamindiii commented May 18, 2025

Copy link
Copy Markdown

Description

This PR contains backend changes from PR:60 by Sahiru. The first five commits are Sahiru's and have already been reviewed in the relevant PR. In his PR, he created the backend for the Staff Grant Extension Feature and additionally created the backend notification system for emails.

This PR contains the backend notification system for in-system notifications. Since we currently do not have a way to persist notifications to display on the onTrack homepage, I created a notifications table and associated model. This table will store notifications for each user along with an associated message. This functionality can be extended in the future to store a boolean read value etc. The model has a relation with the user object so that we can access notifications for a specific user.

In terms of the Staff Grant Extension feature, a notification is created whenever an extension is granted successfully. This means we have a way of persisting the notification so that it doesn't just exist in memory but can be stored until it is read and deleted by the user. Additionally added tests to check that a notification is created when an extension is granted successfully.

Type of change

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

To test this:

In your terminal, change directory to doubtfire-api - if you are in doubtfire-deploy, simply run the following

cd doubtfire-api

Run the following to apply pending migrations and update your database schema:

rails db:migrate

Run all test files using the following command:

rails test

Run the staff grant extension test using the following command:

rails test test/api/staff_grant_extension_test.rb

Screenshot 2025-05-18 at 4 23 22 PM

Additionally, if you want to test the notifications system integration with the front end, pull the front end code from PR:353 This means you can now view your notifications on the ontrack homepage.

  1. Login as student (astudent, password)
  2. Open a rails console
  3. Create a new notification for user_id: 13 (a_student has a user_id of 13 in my db- it might not be the same for you)
    Notification.create!(user_id: 13, message: "Test notification for student 13")
  4. Navigate to your homepage and check that you have a new notification (red number on top of the bell)

Screenshot 2025-05-18 at 1 51 59 PM

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if appropriate
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have created or extended unit tests to address my new additions
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

If you have any questions, please contact @macite or @jakerenzella.

Sahiru Withanageand others added 8 commits May 11, 2025 14:05
Enable staff to grant extensions to multiple students without formal requests.
Reuse existing student extension logic through a new service for consistency.
Supports flexible academic support and streamlines staff workflows.
Relates to the OnTrack Staff Grant Extension design documentation.
…rpolated strings
This aligns the test file with the string formatting convention used in the rest of the codebase.
Single quotes are preferred when string interpolation is not needed, improving consistency.
Reviewed as part of peer feedback.
Linked extension_comments_api (student-requested extensions) to use the
shared ExtensionService, previously set up for staff-granted extensions.
This refactor ensures both student and staff extension flows use the
same logic, improving consistency and reducing duplication.
Implemented backend logic to send emails to tutor and student when extensions are granted. Also enable it so the front end can use the returned information from the api to display notifications.
A comment line change made in the staff grant extension feature branch that hasn't been updated here. Changing to keep the consistency.
@samindiiisamindiii changed the title Feature/extension notification backendAdd Notification Table, Model for in-system notificationsMay 18, 2025
@samindiiisamindiii changed the title Add Notification Table, Model for in-system notificationsAdd notification table and model for in-system notificationsMay 18, 2025

@SahiruWithanageSahiruWithanage left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey Samindi !

I've reviewed the pr and it looks solid! The code is concise and follows the project's patterns well. I like how you've structured the database with a clean notification model connected to users and your API endpoints for fetching and deleting notifications are well-implemented.

A few minor suggestions that might be worth considering: adding some basic validations to the Notification model (e.g., presence/length for message), adding tests specifically for the notification API endpoints to ensure complete coverage and implementing pagination for the GET endpoint as notifications could accumulate over time (for an example someone might not click this at all for a long time and decides to click it only to get flooded with notifications).

I ran the Rails tests and no issues came up related to this implementation, which is a good sign but worth considering adding some test cases specific for this feature.

Overall, this provides a good foundation for the in-system notifications that accomplishes the goal of showing extension notifications to students. Great work!!

@JoeMaclJoeMacl left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Tested everything and it’s working great! Code is well structured and easy to follow.

As Sahiru mentioned, it’d be great to add some basic validations to the notification model like presence: true and maybe a character limit for the message. Also, adding pagination to the GET /notifications endpoint would help handle cases where students accumulate a lot of notifications over time.

Overall, great job! :)

@aNebula

Copy link
Copy Markdown

@samindiii LGTM. Please open an upstream pull request against 9.x branch in /doubtfire-lms/doubtfire-api.
Remember to include the description and link frontend PRs (if they are opened, and vice-versa)

- Add notifcation factory
- Add unit tests for notifications
- Only send first 20 notifications to front end
- Have a max characters of 500
@samindiii

Copy link
Copy Markdown
Author

Fixed up the code based on Sahiru and Joe's suggestions. Added a new test for the notifications API
rails test test/api/notifications_api_test.rb

@SteveDalaSteveDala mentioned this pull request Jan 22, 2026
11 tasks
Thirus224849242 pushed a commit to Thirus224849242/doubtfire-api that referenced this pull request Aug 25, 2026
…abot/bundler/websocket-driver-0.8.2
chore(deps): bump websocket-driver from 0.7.7 to 0.8.2
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@samindiii@aNebula@JoeMacl@SahiruWithanage