feat(sessions): edit session acquire, release, and query endpoints #163
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Sub-issue of #125 (Context-Aware Part Subscription System).
Edit sessions are the server-side representation of a user's active editing context in Kindred Create. When a user enters Sketcher, PartDesign, or Assembly editing mode, the client acquires a session. When they exit (upward context transition), the client releases it.
This issue implements the core acquire/release/query lifecycle. Interference detection is a separate issue.
1. Database Migration
Create
migrations/023_edit_sessions.sql:The unique index on
(item_id, context_level, object_id)enforces the hard interference constraint at the database level.2. Context Levels
context_levelobject_idsketchSketch001partdesignBodyor feature nameassembly3. Database Layer
Create
internal/db/edit_sessions.go:Methods:
Acquire(ctx, session)— INSERT, returns error on unique constraint violation (hard interference)Release(ctx, sessionID)— DELETE by IDReleaseForWorkstation(ctx, workstationID)— DELETE all sessions for a workstation (disconnect cleanup)GetByID(ctx, id)— single lookupListForItem(ctx, itemID)— all active sessions on an itemListForUser(ctx, userID)— all active sessions for a userTouchHeartbeat(ctx, workstationID)— UPDATE last_heartbeat for all sessions of a workstationExpireStale(ctx, timeout)— DELETE WHERE last_heartbeat < now() - timeout, return released sessions4. API Endpoints
Create
internal/api/session_handlers.go:/api/items/{partNumber}/edit-sessions/api/items/{partNumber}/edit-sessions/{id}/api/items/{partNumber}/edit-sessions/api/edit-sessionsAcquire Request
dependency_coneis optional. If omitted and the DAG module is enabled, the server can compute it from the stored DAG usingGetForwardCone(). If no DAG exists, store empty (interference detection degrades to context-level-only).Acquire Response (success)
For this issue, interference is always "none" on success or a DB unique constraint error (hard block, 409). Soft interference detection comes in a follow-up issue.
Acquire Response (hard block)
HTTP 409:
Release
On release, broadcast
edit.session_releasedSSE event viaPublishToItem().On acquire, broadcast
edit.session_acquiredSSE event viaPublishToItem().The release endpoint also adds the client to the item's SSE watch list on acquire, and removes on release.
5. SSE Events
edit.session_acquired{item_id, part_number, user, workstation, context_level, object_id}edit.session_released{item_id, part_number, user, context_level, object_id}6. Routes
Acceptance Criteria
edit_sessionstable with unique indexPOST /edit-sessionsacquires session, returns session_idDELETE /edit-sessions/{id}releases session (owner or admin)GET /items/{pn}/edit-sessionslists active sessions for an itemGET /edit-sessionslists current user's sessions across all itemsedit.session_acquiredSSE event published on acquire (item-scoped)edit.session_releasedSSE event published on release (item-scoped)dependency_conearrayDepends On
Part Of
#125