* Fix Telegram notification spam with channel-level rate limiting
Addresses issue #950 where Telegram notifications were sent excessively
(96-288 messages per day per task) due to the delete-and-recreate pattern
added in commit 105a913a to fix navbar notification pile-up.
Changes:
- Add channel_sent_at JSON field to notifications table to track when
each channel (telegram, email, push) was last sent
- Add helper methods to notification model:
- markChannelAsSent(channel): Records send timestamp
- wasChannelRecentlySent(channel, threshold): Checks if sent within 24h
- Modify sendTelegramNotification() to check rate limit before sending
- Update service layer (dueTaskService, deferredTaskService,
dueProjectService) to preserve channel_sent_at when recreating
notifications
- Add comprehensive unit and integration tests (20 tests, all passing)
Impact:
- Reduces Telegram notifications from 96-288/day to 1/day per item
- Preserves in-app notification refresh behavior (every 5-15 min)
- Maintains navbar pile-up fix from original commit
- Rate limit configurable (default: 24 hours)
Fixes#950
* Fix linting and formatting issues
* Fix integration test that was trying to access private function
* Fix prettier formatting in integration test
* Break down TaskModal
* Fix an issue with counting past times
* Add daily reccurence on week
* fixup! Add daily reccurence on week
* fixup! fixup! Add daily reccurence on week
* Improve recurring widget on task page
* fixup! Improve recurring widget on task page
* Global search scaffold
* Add search preview text
* Add generic fallback for preview text in search
* fixup! Add generic fallback for preview text in search
* Add more tweaks
* fixup! Add more tweaks
* Fix an issue with criteria
* fixup! Fix an issue with criteria
* fixup! fixup! Fix an issue with criteria
* fixup! fixup! fixup! Fix an issue with criteria
* Fix an issue with priority filter
* fixup! Fix an issue with priority filter
* Add sortable pins
* fixup! Add sortable pins
* Make options collapsed by default
* Tweak UI
* Add tests
* Add translations
* Add more translations
* fixup! Add more translations
* Add minor tweaks
This migration backfills role entries for users that existed before the roles system was introduced.
- If no admins exist: Missing users become admins to prevent lockout
- If admins exist: Missing users become regular users (safe default)
- Idempotent: Safe to run multiple times
* Scaffold project states
* fixup! Scaffold project states
* Fix blinking project modal
* fixup! Fix blinking project modal
* fixup! fixup! Fix blinking project modal
* Fix an issue with the tag input autosuggest
* fixup! Fix an issue with the tag input autosuggest
* fixup! fixup! Fix an issue with the tag input autosuggest
* Add state to project details
* fixup! Add state to project details
* Add state indicator on project cards
* fixup! Add state indicator on project cards
- Add unified UID column migration for all entities
- Create centralized UID generation utility
- Update all models to use standardized UID hooks
- Fix route handlers to support UID-based lookups
- Update slug utilities for consistent UID extraction
- Fix tag tests to use query parameters instead of path params
- Configure Jest for better TypeScript support