tradein/auth 2: Schema — tradein_users + tradein_sessions (SQL 192_*) #2551

Closed
opened 2026-07-30 06:17:21 +00:00 by lekss361 · 0 comments
Owner

Часть эпика #2549 (шаг 2/8). Parallel-safe с шагом 1. Worker: database-expert.

Scope

Один файл tradein-mvp/backend/data/sql/192_tradein_users_auth.sql (перепроверить NN на дубль непосредственно перед PRls data/sql полностью, были коллизии 108_/084_ ×2):

  • tradein_users: id bigint identity PK, username text UNIQUE NOT NULL, password_hash text NULL, role text NOT NULL CHECK (role IN ('admin','manager','employee')), manager_id bigint REFERENCES tradein_users(id) ON DELETE SET NULL, display_name/org_name/email text, is_active boolean NOT NULL DEFAULT true, created_at/updated_at timestamptz.
  • CHECK: employee → manager_id NOT NULL допустим НО НЕ обязателен (миграция user1/user3-10 = employee без org, см. эпик); admin/manager → manager_id IS NULL.
  • tradein_sessions: token text PK (opaque random), user_id bigint NOT NULL REFERENCES tradein_users(id) ON DELETE CASCADE, created_at/expires_at/last_seen_at timestamptz, ip_address inet, user_agent text. Индексы: expires_at (cleanup), user_id.

Требования

  • Idempotent (CREATE TABLE IF NOT EXISTS), BEGIN/COMMIT — SQL авто-применяется на прод при деплое (strict exit-1).
  • EXPLAIN: DELETE FROM tradein_sessions WHERE expires_at < now() должен ходить по индексу.

Что НЕ делать

Seed существующих юзеров — отдельный шаг 7. Никакого кода приложения.

Часть эпика #2549 (шаг 2/8). Parallel-safe с шагом 1. Worker: database-expert. ## Scope Один файл `tradein-mvp/backend/data/sql/192_tradein_users_auth.sql` (**перепроверить NN на дубль непосредственно перед PR** — `ls data/sql` полностью, были коллизии 108_*/084_* ×2): - `tradein_users`: id bigint identity PK, username text UNIQUE NOT NULL, password_hash text NULL, role text NOT NULL CHECK (role IN ('admin','manager','employee')), manager_id bigint REFERENCES tradein_users(id) ON DELETE SET NULL, display_name/org_name/email text, is_active boolean NOT NULL DEFAULT true, created_at/updated_at timestamptz. - CHECK: employee → manager_id NOT NULL допустим НО НЕ обязателен (миграция user1/user3-10 = employee без org, см. эпик); admin/manager → manager_id IS NULL. - `tradein_sessions`: token text PK (opaque random), user_id bigint NOT NULL REFERENCES tradein_users(id) ON DELETE CASCADE, created_at/expires_at/last_seen_at timestamptz, ip_address inet, user_agent text. Индексы: expires_at (cleanup), user_id. ## Требования - Idempotent (`CREATE TABLE IF NOT EXISTS`), BEGIN/COMMIT — SQL авто-применяется на прод при деплое (strict exit-1). - `EXPLAIN`: `DELETE FROM tradein_sessions WHERE expires_at < now()` должен ходить по индексу. ## Что НЕ делать Seed существующих юзеров — отдельный шаг 7. Никакого кода приложения.
lekss361 added the
auth
scope/db
status/ready
tradein
labels 2026-07-30 06:23:36 +00:00
lekss361 added
status/wip
and removed
status/ready
labels 2026-07-30 06:39:11 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2551
No description provided.