Extend /api/internal/support-action: access/participant/user/assignment ops (Elazar GO 2026-09-22)
Elazar GO relayed by support-evolutiva-cc, same brief as mars (coder-mars-cc sibling, not yet shipped there either - checked, mars route still ticket-ops only as of 2026-09-22). New ops: access-list, access-approve{id,pickUserId?}, access-reject, access-request-info, practica-participant-remove/add{practicaId,userId,slot} (blocked on SOP-PLUTO-16 db-pluto-cc NULL asistenteId - this is PLUTO-744 remove-asistente gap, now ticketed), user-roles-set, user-create, user-restore, user-lookup{email|legajo|name}, assignment-set{studentId,comisionId}, JTP reassign. idempotencyKey required on every sending/mutating op (mars pattern: supportActionIdempotency table, ON CONFLICT DO NOTHING, store response for replay) - new migration needed, DDL not mine to apply. Design: existing *-actions.ts exports are 'use server' + session-gated (approveAccessRequest, addUserRole, addAlumnoAssignment, createUserFromForm, reactivateInactiveUser) - cannot call directly from a bearer route. Extract *Core(actorUserId, reason) per op mirroring support-reply-core.ts, leave cap check in the thin action wrapper, route passes SUPPORT_SYSTEM_USER_ID. Slices, each its own push: (a) reads - user-lookup, access-list, no idempotency/email/audit gate; (b) non-sending mutations with existing cores - roles, assignment, user-restore, needs migration applied first; (c) sending mutations - access-approve/reject/request-info, user-create, audit-general-cc Class-A gate before push (email path); (d) participant remove/add, new path per PLUTO-744. Reply to support per slice: commit + deploymentId + per-op live-call result against elazarphotos@gmail.com, noting any op not exercisable without prod state.
Activity
-
Progress since open: (a) reads shipped 742640d/v2.23.102 (access-list, user-lookup). (b) non-sending mutations shipped 7f97e63/v2.23.104 (user-roles-set, assignment-set{studentId,comisionId,jtpId} — covers the brief's assignment-set + per-student jtpId pairing; no separate JTP-roster-reassign op is in the brief, none built). (c) sending mutations shipped b41dce5/v2.23.105 (access-approve/reject/request-info, user-create) — Class-A, audit-general-cc GO with 2 conditions, both resolved by reuse of admin-batch.ts. user-restore dropped per decision 3 (soft-deleted twin never auto-restored, escalates to Elazar instead). Remaining: (d) practica-participant-remove/add = PLUTO-744, decision-blocked (is removal a product feature at all) not technically blocked — requested a support-ticket count from db-pluto-cc 2026-09-23 to give Elazar real demand data before eq_add-ing the product decision.
-
Only remaining scope is (d)=PLUTO-744, now blocked on eq#117 (Elazar decision, demand=1/11 tickets).