36 lines
1.8 KiB
SQL
36 lines
1.8 KiB
SQL
-- Migration: Create user_sessions table (alias for sessions compatibility)
|
|
-- Description: Alternative sessions table for legacy compatibility
|
|
|
|
-- This is actually just a view or alias for the sessions table
|
|
-- The sessions table already exists and serves this purpose
|
|
|
|
-- If we really need a separate user_sessions table:
|
|
CREATE TABLE IF NOT EXISTS user_sessions (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL,
|
|
session_token VARCHAR(255) NOT NULL,
|
|
ip_address VARCHAR(45),
|
|
user_agent TEXT,
|
|
is_active BOOLEAN DEFAULT true,
|
|
last_activity TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
revoked_at TIMESTAMP WITH TIME ZONE,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT fk_user_sessions_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_user_sessions_token ON user_sessions(session_token);
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_is_active ON user_sessions(is_active) WHERE is_active = true;
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_expires_at ON user_sessions(expires_at);
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_last_activity ON user_sessions(last_activity DESC);
|
|
|
|
-- Comments
|
|
COMMENT ON TABLE user_sessions IS 'User sessions for authentication tracking (alternative to sessions table)';
|
|
COMMENT ON COLUMN user_sessions.session_token IS 'Unique session token (hashed)';
|
|
COMMENT ON COLUMN user_sessions.revoked_at IS 'Timestamp when session was revoked';
|
|
COMMENT ON COLUMN user_sessions.last_activity IS 'Last activity timestamp (updated periodically with debounce)';
|
|
|