* feat: Request document access
Allow users without permission to a document to request access. Notifies
document managers via in-app notification and email; managers can grant
or dismiss the request.
- Adds AccessRequest model, migration, policy, presenter
- Adds accessRequests.create/info/approve/dismiss endpoints
- Adds DocumentAccessRequestNotificationsTask + email
- Adds Error403 request flow with loading state and pending indicator
- Auto-opens notifications popover via ?notifications=true (used in email)
- Adds SplitButton primitive for permission selection in notifications
- Refactors useConsumeQueryParam hook
* refactor
* fix: Make approve/dismiss idempotent on access requests
Return success when the access request has already been dismissed, or
when the user already has document membership at approve time, instead
of throwing 400. Avoids racy double-clicks on notification actions
producing user-visible errors.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* Minor fixes
---------
Co-authored-by: Tom Moor <tom@getoutline.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* wip
* Implementation complete
* tidying
* test
* Address feedback
* Remove duplicative retry logic from UpdateDocumentsPopularityScoreTask.
Now that we're split across many runs this is not neccessary
* Refactor to subclass, config to instance
* Refactor BaseTask to named export
* fix: Missing partition
* tsc
* Feedback
* Improve webhook disabling heuristic with time-based analysis
- Add WEBHOOK_FAILURE_TIME_WINDOW environment variable (default: 24 hours)
- Add WEBHOOK_FAILURE_RATE_THRESHOLD environment variable (default: 80%)
- Replace simple count-based logic with time-window failure rate analysis
- Require minimum 5 deliveries in time window before disabling
- Add comprehensive logging for webhook failure analysis
- Update email template to reflect new time-based approach
Addresses GitHub issue #9788 by making webhook disabling smarter and
considering time factors instead of just consecutive failure counts.
* Fix Logger.warn type error
Remove extra 'task' parameter from Logger.warn call to match the correct
signature: Logger.warn(message: string, extra?: Extra)
* Update WEBHOOK_FAILURE_TIME_WINDOW to use seconds instead of hours
- Change default value from 24 (hours) to 86400 (seconds)
- Update time conversion logic from hours*60*60*1000 to seconds*1000
- Rename timeWindowHours variable to timeWindowSeconds for clarity
- Update documentation comments to reflect seconds-based configuration
This provides more granular control while maintaining the same default
behavior (24 hours = 86400 seconds).
* Improve webhook failure logging and analysis threshold
- Only log webhook failure analysis when failedDeliveries.length > 0
- Extract hardcoded minimum deliveries threshold to constant
- Update minimum deliveries threshold from 5 to 10 for more reliable analysis
This reduces log noise when there are no failures and requires more data
points before considering webhook disabling.
---------
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
This PR contains the necessary work to make Outline an OAuth provider including:
- OAuth app registration
- OAuth app management
- Private / public apps (Public in cloud only)
- Full OAuth 2.0 spec compatible authentication flow
- Granular scopes
- User token management screen in settings
- Associated API endpoints for programatic access
* fix: rename to group_permissions
* fix: delete null collectionId records before setting non null constraint
* fix: use scope with collectionId not null
* fix: update model with documentId
* fix: rename to GroupPermission
* fix: rename collection_users to user_permissions
* fix: teamPermanentDeleter test
* fix: use scope with collectionId not null
* fix: update model with documentId
* fix: rename to UserPermission
* fix: create views upon table rename for zero downtime
* fix: remove comments
* helper
* Add script to move notification settings
* wip, removal of NotificationSettings
* event name
* iteration
* test
* test
* Remove last of NotificationSettings model
* refactor
* More fixes
* snapshots
* Change emails to class instances for type safety
* test
* docs
* Update migration for self-hosted
* tsc
* Comment model
* Framework, model, policy, presenter, api endpoint etc
* Iteration, first pass of UI
* fixes, refactors
* Comment commands
* comment socket support
* typing indicators
* comment component, styling
* wip
* right sidebar resize
* fix: CMD+Enter submit
* Add usePersistedState
fix: Main page scrolling on comment highlight
* drafts
* Typing indicator
* refactor
* policies
* Click thread to highlight
Improve comment timestamps
* padding
* Comment menu v1
* Change comments to use editor
* Basic comment editing
* fix: Hide commenting button when disabled at team level
* Enable opening sidebar without mark
* Move selected comment to location state
* Add comment delete confirmation
* Add comment count to document meta
* fix: Comment sidebar togglable
Add copy link to comment
* stash
* Restore History changes
* Refactor right sidebar to allow for comment animation
* Update to new router best practices
* stash
* Various improvements
* stash
* Handle click outside
* Fix incorrect placeholder in input
fix: Input box appearing on other sessions erroneously
* stash
* fix: Don't leave orphaned child comments
* styling
* stash
* Enable comment toggling again
* Edit styling, merge conflicts
* fix: Cannot navigate from insights to comments
* Remove draft comment mark on click outside
* Fix: Empty comment sidebar, tsc
* Remove public toggle
* fix: All comments are recessed
fix: Comments should not be printed
* fix: Associated mark should be removed on comment delete
* Revert unused changes
* Empty state, basic RTL support
* Create dont toggle comment mark
* Make it feel more snappy
* Highlight active comment in text
* fix animation
* RTL support
* Add reply CTA
* Translations