CREATE TABLE user_devices ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, device_name TEXT, -- "iPhone 15", "Chrome/Windows" vb. user_agent TEXT, last_ip INET, last_seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_user_devices_user ON user_devices(user_id); CREATE TABLE access_tokens ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, device_id BIGINT REFERENCES user_devices(id) ON DELETE CASCADE, token_hash TEXT NOT NULL UNIQUE, -- SHA-256(token), düz token istemcide expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_access_tokens_hash ON access_tokens(token_hash); CREATE INDEX idx_access_tokens_user ON access_tokens(user_id); CREATE INDEX idx_access_tokens_expires ON access_tokens(expires_at); CREATE TABLE refresh_tokens ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, device_id BIGINT REFERENCES user_devices(id) ON DELETE CASCADE, token_hash TEXT NOT NULL UNIQUE, used_at TIMESTAMPTZ, -- NULL = henüz kullanılmadı revoked BOOLEAN NOT NULL DEFAULT FALSE, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_refresh_tokens_hash ON refresh_tokens(token_hash); CREATE INDEX idx_refresh_tokens_user ON refresh_tokens(user_id);