Phase 3: individual defense assignments with invite codes

- progress V5 defense_sessions: per student+lab individual task (md), status
  machine waiting -> started -> ready, one-time 6-digit codes
- 30-min timer with server-side lazy expiry (syncTimeouts: started->ready by
  timeout), countdown JS on student page
- admin: assign task dialog (+prefill existing via data-md), CSV import
  (studentNo;task, \n for newlines) resolved via identity students,
  issue/reset code buttons, defense status column
- student: code entry form (code hidden until start), assignment md,
  'Готов к сдаче', waiting-for-teacher note
- gateway: /api/v1/defenses,/api/v1/defenses/** routes
- web api client + admin/student controllers wired
This commit is contained in:
2026-09-12 00:54:10 +03:00
parent e1da254599
commit d6fc47794e
14 changed files with 634 additions and 6 deletions

View File

@@ -0,0 +1,16 @@
-- Defense sessions: individual task + invite code + 30-minute timer.
CREATE TABLE defense_sessions (
id uuid PRIMARY KEY DEFAULT uuidv7(),
student_id uuid NOT NULL,
lab_id uuid NOT NULL,
assignment_md text NOT NULL DEFAULT '',
status varchar(16) NOT NULL DEFAULT 'waiting', -- waiting | started | ready
code varchar(6),
started_at timestamptz,
ready_at timestamptz,
ready_reason varchar(16), -- button | timeout
CONSTRAINT defense_session_unique UNIQUE (student_id, lab_id)
);
CREATE INDEX defense_sessions_lab_idx ON defense_sessions (lab_id);