Rosa Gutierrez
1d2ed91e89
Extract payload building into dedicated classes
...
Separates notification payload construction from push delivery by
introducing DefaultPayload, EventPayload, and MentionPayload classes
that encapsulate the title, body, and URL generation for each
notification type.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
05819f84a2
Refactor notification push system with registry pattern
...
Replace NotificationPusher with a cleaner architecture:
- Add Notification::Pushable concern with push target registry
- Add Notification::Push base class with template methods
- Add Notification::Push::Web for web push (OSS)
- Add Notification::Push::Native for native push (SaaS)
- Add Notification::WebPushJob and Notification::NativePushJob
Key design:
- Registry pattern: Notification.register_push_target(:web)
- Template method: push calls should_push? then perform_push
- Subclasses override should_push? (with super) and perform_push
- Each target handles its own job enqueueing
Also:
- Add Notification#pushable? for checking push eligibility
- Add Notification#identity delegation to user
- Reorganize tests to match new class structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
Tidy up saas engine a bit more
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
555132bbef
Change device ownership from User to Identity
...
Devices now belong to Identity instead of User, allowing a single
device registration to work across all accounts an identity has
access to.
- Move User::Devices to Identity::Devices
- Update DevicesController to use Current.identity
- Update NotificationPusher::Native to use user.identity.devices
- Clean up tests to use @identity directly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
Fix reference to `user.devices`, left-over from the identity switch
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
d3cc79a5bc
Simplify device routes and use ActiveRecord validations
...
- Use RESTful DELETE /devices/:id where :id can be token or database ID
- Remove redundant unregister collection route
- Remove old Users::DevicesController
- Return 404 when device not found instead of silently succeeding
- Return 422 for invalid platform via ActiveRecord validation
- Update action_push_native to main branch (includes validate: true on enum)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
9d32f3e845
Refactor devices controller and extract registration to model
...
- Remove Users namespace from DevicesController (now just DevicesController)
- Create ApplicationPushDevice model extending ActionPushNative::Device
- Move device registration logic (find_or_initialize + update) to model
- Update User::Devices concern to use ApplicationPushDevice
- Fix push notification tests (endpoint validation, job count expectations)
- Update push_config_test to use ActionPushNative.config
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 19:31:13 +01:00
Fernando Olivares
7e0470a692
Send the URL instead of path in notifications
2026-02-25 19:31:13 +01:00
Fernando Olivares
ade39b15ab
Add title/body to android notifications too
2026-02-25 19:31:13 +01:00
Fernando Olivares
29d3960a3c
Remove UUID requirement from push notification device registration
...
- Remove UUID column from devices table entirely
- Update unique index from (owner, uuid) to (owner, token)
- Simplify create action to just create device records
- Add token-based unregister route for API clients
- Consolidate error handling with rescue_from
- Update fixtures to remove uuid references
Devices are now identified by (owner, token) instead of UUID.
This simplifies the client-side registration flow.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
2121b6dc3d
Use version of action_push_native with proper config paths support
...
See https://github.com/rails/action_push_native/pull/89
Now we can delete the OSS version of `config/push.yml`, no longer needed.
2026-02-25 19:31:13 +01:00
Fernando Olivares
7d04bb514f
Add Firebase configuration
...
- Update local script to load Firebase key
- Configure Firebase projectId in push.yml
2026-02-25 19:31:13 +01:00
Fernando Olivares
55336873b2
Fix database issues and add APNS configuration
...
- Fix owner_id type to UUID in devices migration
- Fix NOT NULL crash in device registration
- Add APNS config and 1Password integration
- Add --apns flag to bin/dev for local development
- Clean up devices controller
2026-02-25 19:31:13 +01:00
Fernando Olivares
3c54cd84fc
Add native push notification infrastructure
...
- Add action_push_native gem and SaaS configuration
- Add device registration API and UI
- Add User::Devices concern
- Add NotificationPusher::Native for push delivery
- Add tests and fixtures for native push
2026-02-25 19:31:13 +01:00
Rosa Gutierrez
628a43ef61
Small native API changes: include identity ID, return empty signup completion body
...
Include identity.id in the my/identity.json response and return an
empty body from the CREATE signup/completions.json endpoint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 14:34:09 +01:00
Samuel Péchèr
988dc637da
Merge pull request #2606 from basecamp/lexxy-0.7.6.beta
...
Update Lexxy to 0.7.6.beta
2026-02-25 10:30:13 +00:00
Adrien Maston
bab9d1d34a
Merge pull request #2594 from basecamp/mobile/fix-card-background-image
...
Mobile / Fix card background image
2026-02-25 11:20:27 +01:00
Adrien Maston
7fa0504057
Merge pull request #2605 from basecamp/mobile/fix-clipped-stalled-bubble
...
Mobile / Fix clipped stalled bubble
2026-02-25 10:20:53 +01:00
Adrien Maston
3a9c8fdcb0
Merge pull request #2604 from basecamp/mobile/fix-flash-position
...
Mobile / Fix flash position
2026-02-25 10:20:20 +01:00
dependabot[bot]
31713aa396
Bump docker/build-push-action from 6.18.0 to 6.19.2 ( #2587 )
...
Bumps [docker/build-push-action](https://github.com/docker/build-push-action ) from 6.18.0 to 6.19.2.
- [Release notes](https://github.com/docker/build-push-action/releases )
- [Commits](https://github.com/docker/build-push-action/compare/v6.18.0...v6.19.2 )
---
updated-dependencies:
- dependency-name: docker/build-push-action
dependency-version: 6.19.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-24 23:27:38 -08:00
Samuel Péchèr
0038641ede
Update Lexxy to 0.7.6.beta
2026-02-24 20:25:07 +00:00
Adrien Maston
10c24b7734
Tweak translation
2026-02-24 17:48:24 +01:00
Adrien Maston
26282e3435
Use safe inset
2026-02-24 17:21:59 +01:00
Adrien Maston
88235a2737
Merge pull request #2602 from basecamp/fix-watching-overflow-dialog
...
Fix "watching" overflow dialog
2026-02-24 16:33:40 +01:00
Rosa Gutierrez
9ded80d448
Add test for notifying new mentionees when editing a comment
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 15:56:27 +01:00
Rosa Gutierrez
60b3c9c772
Fix duplicate push notification for mention and comment event
...
Event notifiers used the `mentionees` DB association to exclude mentioned
users from comment/card notifications. Since mentions are created async
via Mention::CreateJob, a race condition meant the mentionee list could
be empty when the event notification job ran first, causing the user to
receive both a comment and a mention push notification.
Use `scan_mentionees` instead, which scans the rich text body directly
for mentioned users without depending on Mention records existing yet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 15:56:27 +01:00
Adrien Maston
bd4cfbfd10
Change display on [open] dialog
2026-02-24 15:49:47 +01:00
Adrien Maston
7b93ec35b4
Merge pull request #2598 from basecamp/mobile/tweak-card-draft
...
Mobile / Tweak card draft
2026-02-24 14:56:31 +01:00
Denis Svara
3a14e3e338
Merge pull request #2599 from basecamp/mobile/path-config-setup
...
Mobile: Path config endpoint
2026-02-24 14:52:09 +01:00
Adrien Maston
bf98b1a6d7
Adjust closed stamp position on perma
2026-02-24 12:44:13 +01:00
Denis Švara
c0c78152c9
Add ios path config.
2026-02-24 11:26:07 +01:00
Denis Švara
e00a51b6c2
Add android path config.
2026-02-24 11:26:00 +01:00
Denis Švara
de3c8c46b5
Add constrained route.
2026-02-24 11:25:43 +01:00
Denis Švara
db9f67589c
Implement ClientConfigurationsController for mobile client path config.
2026-02-24 11:25:07 +01:00
Adrien Maston
b76f608c67
Simplify
...
Remove shadows and backgrounds
2026-02-24 11:22:20 +01:00
Stanko Krtalić
13d60932df
Merge pull request #2597 from basecamp/import-improvements
...
Import improvements
2026-02-24 08:40:17 +01:00
Stanko K.R.
0648583289
Fix other test failures caused by default host manipulation
2026-02-24 08:35:11 +01:00
Stanko K.R.
66fdcae960
Fix CI failure with no host set
2026-02-24 08:28:52 +01:00
Stanko K.R.
2f9d4533c5
Relativize absolute links to the instance on export
2026-02-24 08:22:01 +01:00
Stanko K.R.
4eadce8ffe
Automatically update account slugs in links
2026-02-24 08:11:47 +01:00
Stanko K.R.
55779f8ac4
Organize the record sets better
2026-02-24 07:36:51 +01:00
Stanko K.R.
d8ed2f44b8
Reconcile card count after import
2026-02-24 07:36:20 +01:00
dependabot[bot]
395cc06f5c
Bump aws-sdk-s3 from 1.211.0 to 1.213.0 ( #2502 )
...
Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby ) from 1.211.0 to 1.213.0.
- [Release notes](https://github.com/aws/aws-sdk-ruby/releases )
- [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md )
- [Commits](https://github.com/aws/aws-sdk-ruby/commits )
---
updated-dependencies:
- dependency-name: aws-sdk-s3
dependency-version: 1.213.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-23 18:53:45 -05:00
dependabot[bot]
b0b14ead28
Bump sqlite3 from 2.8.0 to 2.9.0 ( #2386 )
...
Bumps [sqlite3](https://github.com/sparklemotion/sqlite3-ruby ) from 2.8.0 to 2.9.0.
- [Release notes](https://github.com/sparklemotion/sqlite3-ruby/releases )
- [Changelog](https://github.com/sparklemotion/sqlite3-ruby/blob/main/CHANGELOG.md )
- [Commits](https://github.com/sparklemotion/sqlite3-ruby/compare/v2.8.0...v2.9.0 )
---
updated-dependencies:
- dependency-name: sqlite3
dependency-version: 2.9.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-23 18:48:52 -05:00
dependabot[bot]
3063a40f0f
Bump trilogy from 2.9.0 to 2.10.0 ( #2388 )
...
Bumps [trilogy](https://github.com/trilogy-libraries/trilogy ) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/trilogy-libraries/trilogy/releases )
- [Changelog](https://github.com/trilogy-libraries/trilogy/blob/main/CHANGELOG.md )
- [Commits](https://github.com/trilogy-libraries/trilogy/compare/v2.9.0...v2.10.0 )
---
updated-dependencies:
- dependency-name: trilogy
dependency-version: 2.10.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-23 18:43:47 -05:00
dependabot[bot]
361d4a7a52
Bump solid_queue from 1.2.4 to 1.3.1 ( #2425 )
...
Bumps [solid_queue](https://github.com/rails/solid_queue ) from 1.2.4 to 1.3.1.
- [Release notes](https://github.com/rails/solid_queue/releases )
- [Commits](https://github.com/rails/solid_queue/compare/v1.2.4...v1.3.1 )
---
updated-dependencies:
- dependency-name: solid_queue
dependency-version: 1.3.1
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-23 18:42:48 -05:00
dependabot[bot]
6f99e43f5b
Bump puma from 7.1.0 to 7.2.0 ( #2462 )
...
* Bump puma from 7.1.0 to 7.2.0
Bumps [puma](https://github.com/puma/puma ) from 7.1.0 to 7.2.0.
- [Release notes](https://github.com/puma/puma/releases )
- [Changelog](https://github.com/puma/puma/blob/main/History.md )
- [Commits](https://github.com/puma/puma/compare/v7.1.0...v7.2.0 )
---
updated-dependencies:
- dependency-name: puma
dependency-version: 7.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
* Sync Gemfile.saas.lock
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-23 17:25:30 -05:00
dependabot[bot]
5fad13c59f
Bump rack from 3.2.4 to 3.2.5 ( #2559 )
...
* Bump rack from 3.2.4 to 3.2.5
Bumps [rack](https://github.com/rack/rack ) from 3.2.4 to 3.2.5.
- [Release notes](https://github.com/rack/rack/releases )
- [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md )
- [Commits](https://github.com/rack/rack/compare/v3.2.4...v3.2.5 )
---
updated-dependencies:
- dependency-name: rack
dependency-version: 3.2.5
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com >
* Sync Gemfile.saas.lock
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-23 17:22:21 -05:00
dependabot[bot]
85bb2aa1fa
Bump turbo-rails from 2.0.21 to 2.0.23 ( #2501 )
...
* Bump turbo-rails from 2.0.21 to 2.0.23
Bumps [turbo-rails](https://github.com/hotwired/turbo-rails ) from 2.0.21 to 2.0.23.
- [Release notes](https://github.com/hotwired/turbo-rails/releases )
- [Commits](https://github.com/hotwired/turbo-rails/compare/v2.0.21...v2.0.23 )
---
updated-dependencies:
- dependency-name: turbo-rails
dependency-version: 2.0.23
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com >
* Sync Gemfile.saas.lock
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-23 17:09:22 -05:00
dependabot[bot]
446640b8e9
Bump the development-dependencies group with 2 updates ( #2588 )
...
* Bump the development-dependencies group with 2 updates
Bumps the development-dependencies group with 2 updates: [brakeman](https://github.com/presidentbeef/brakeman ) and [mocha](https://github.com/freerange/mocha ).
Updates `brakeman` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/presidentbeef/brakeman/releases )
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md )
- [Commits](https://github.com/presidentbeef/brakeman/compare/v8.0.1...v8.0.2 )
Updates `mocha` from 3.0.1 to 3.0.2
- [Changelog](https://github.com/freerange/mocha/blob/main/RELEASE.md )
- [Commits](https://github.com/freerange/mocha/compare/v3.0.1...v3.0.2 )
---
updated-dependencies:
- dependency-name: brakeman
dependency-version: 8.0.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
- dependency-name: mocha
dependency-version: 3.0.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: development-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com >
* Sync Gemfile.saas.lock
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-23 16:41:44 -05:00
dependabot[bot]
d8908c4b92
Bump bootsnap from 1.22.0 to 1.23.0 ( #2589 )
...
* Bump bootsnap from 1.22.0 to 1.23.0
Bumps [bootsnap](https://github.com/rails/bootsnap ) from 1.22.0 to 1.23.0.
- [Release notes](https://github.com/rails/bootsnap/releases )
- [Changelog](https://github.com/rails/bootsnap/blob/main/CHANGELOG.md )
- [Commits](https://github.com/rails/bootsnap/compare/v1.22.0...v1.23.0 )
---
updated-dependencies:
- dependency-name: bootsnap
dependency-version: 1.23.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
* Sync Gemfile.saas.lock
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-23 16:41:17 -05:00
Jay Ohms
d17acd39ef
Merge pull request #2595 from basecamp/mobile/board-pull-to-refresh
...
Prevent pull-to-refresh gesture from conflicting with side scrolling on board perma
2026-02-23 11:43:24 -05:00