feat: sharing with access requests, tasks, owner/assignee and My work #9

Merged
KofTwentyTwo merged 1 commits from feature/sharing-tasks into develop 2026-10-14 00:09:32 +00:00
KofTwentyTwo commented 2026-10-13 23:31:41 +00:00 (Migrated from github.com)

Summary

Phases (h) and (i), qbit side, of QRun-IO/qqq#1136 (spec §4 rows 15 to 18, §6.4, §7.3, §7.4): sharing, tasks and reminders, and owner/assignee.

Sharing:

  • SharingService:
    • link returns the canonical app URL, using frontendBaseUrl when it's set;
    • preview reports per recipient whether they can read the record (true, false or unknown);
    • share sends to 1–25 recipients with a message. Readers are notified and made followers. Non-readers and unknowns get a notification with no record data (no label, no message) that links to the access-request page.
  • collaboration_share records each send, and markOpened is recipient-only.
  • AccessRequestService:
    • Any signed-in user can request access. The response is identical whether or not the record exists, and duplicates are reused.
    • Approvers are notified: collaboration.admin, the table's approver permission, and the record owner. Finding permission holders uses an optional PermissionHolderDirectory.
    • Mark granted and Decline record the outcome and notify the requester; they never change permissions.
  • collaboration_access_request rows are visible to the requester and collaboration.admin only, and show only the table and id.

Tasks:

  • collaboration_task and TasksService: create, update, complete, reopen, cancel, list, and mine (due date first).
  • The assignee must be able to read the record.
  • The hidden collaborationSendTaskReminders process sends one reminder and one overdue notice.
  • Mark done and Reopen record actions.

Owner/assignee:

  • collaboration_record_assignment and AssignmentService (assign, get, myRecords), for host tables without their own owner/assignee columns. Tables with their own columns use core RecordOwnership (QRun-IO/qqq phase i PR).
  • Bulk Assign to and Take ownership actions.

My work: MyWorkService.summary() returns open tasks, records assigned to me per table, and unread mentions (collaboration_mention.readAt plus markMentionsRead).

Also: home cards for access requests, open and overdue tasks, and shares this week; parent cleanup for tasks, assignments and shares; DDL for all of it. Endpoints come in the UI API PR.

Test plan

  • ./mvnw -o verify: 84 tests, 96.9% instruction and 100% class coverage, checkstyle clean.
  • CircleCI test_only.

🤖 Generated with Claude Code

## Summary Phases (h) and (i), qbit side, of QRun-IO/qqq#1136 (spec §4 rows 15 to 18, §6.4, §7.3, §7.4): sharing, tasks and reminders, and owner/assignee. **Sharing:** - `SharingService`: - `link` returns the canonical app URL, using `frontendBaseUrl` when it's set; - `preview` reports per recipient whether they can read the record (true, false or unknown); - `share` sends to 1–25 recipients with a message. Readers are notified and made followers. Non-readers and unknowns get a notification with **no record data** (no label, no message) that links to the access-request page. - `collaboration_share` records each send, and `markOpened` is recipient-only. - `AccessRequestService`: - Any signed-in user can request access. The response is identical whether or not the record exists, and duplicates are reused. - Approvers are notified: `collaboration.admin`, the table's approver permission, and the record owner. Finding permission holders uses an optional `PermissionHolderDirectory`. - **Mark granted** and **Decline** record the outcome and notify the requester; they never change permissions. - `collaboration_access_request` rows are visible to the requester and `collaboration.admin` only, and show only the table and id. **Tasks:** - `collaboration_task` and `TasksService`: create, update, complete, reopen, cancel, list, and mine (due date first). - The assignee must be able to read the record. - The hidden `collaborationSendTaskReminders` process sends one reminder and one overdue notice. - **Mark done** and **Reopen** record actions. **Owner/assignee:** - `collaboration_record_assignment` and `AssignmentService` (assign, get, myRecords), for host tables without their own owner/assignee columns. Tables with their own columns use core `RecordOwnership` (QRun-IO/qqq phase i PR). - Bulk **Assign to** and **Take ownership** actions. **My work:** `MyWorkService.summary()` returns open tasks, records assigned to me per table, and unread mentions (`collaboration_mention.readAt` plus `markMentionsRead`). **Also:** home cards for access requests, open and overdue tasks, and shares this week; parent cleanup for tasks, assignments and shares; DDL for all of it. Endpoints come in the UI API PR. ## Test plan - [x] `./mvnw -o verify`: 84 tests, 96.9% instruction and 100% class coverage, checkstyle clean. - [ ] CircleCI `test_only`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.