feat: Add user ID mapping migration for WordPress integration

Added Prisma migration to support user identification:

1. Session Table Enhancement
   - Added user_id column (VARCHAR(36)) to session table
   - Stores WordPress user ID for logged-in users
   - Indexed for efficient lookups

2. User Mapping Table
   - New table to track visitor_id to user_id relationships
   - Maps anonymous visitors to authenticated users
   - Tracks first_seen_at, last_seen_at, and session_count
   - Unique constraint on (visitor_id, user_id) pair

3. Indexes
   - idx_session_user_id - Fast user_id lookups
   - idx_session_visitor_user - Composite index for visitor+user queries
   - idx_user_mapping_visitor - Visitor ID lookups
   - idx_user_mapping_user - User ID lookups
   - idx_user_mapping_last_seen - Time-based queries

This migration enables unified user tracking across anonymous and authenticated sessions, supporting the WordPress plugin's user identification feature.
This commit is contained in:
iskandarsulaili 2025-11-06 19:53:33 +08:00
parent 5f496fdb79
commit 5cf1e0c16a

View file

@ -0,0 +1,36 @@
-- Migration: Add User ID Mapping
-- Description: Add user_id column to session table for unified user identification
-- Date: 2025-11-05
-- Add user_id column to session table
ALTER TABLE session ADD COLUMN IF NOT EXISTS user_id VARCHAR(36);
-- Add index for user_id lookups
CREATE INDEX IF NOT EXISTS idx_session_user_id ON session(user_id);
-- Add composite index for visitor_id and user_id
CREATE INDEX IF NOT EXISTS idx_session_visitor_user ON session(visitor_id, user_id);
-- Create user_mapping table for tracking visitor_id to user_id relationships
CREATE TABLE IF NOT EXISTS user_mapping (
id SERIAL PRIMARY KEY,
visitor_id VARCHAR(36) NOT NULL,
user_id VARCHAR(36) NOT NULL,
first_seen_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
last_seen_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
session_count INTEGER DEFAULT 1,
UNIQUE(visitor_id, user_id)
);
-- Add indexes for user_mapping
CREATE INDEX IF NOT EXISTS idx_user_mapping_visitor ON user_mapping(visitor_id);
CREATE INDEX IF NOT EXISTS idx_user_mapping_user ON user_mapping(user_id);
CREATE INDEX IF NOT EXISTS idx_user_mapping_last_seen ON user_mapping(last_seen_at);
-- Add comments
COMMENT ON COLUMN session.user_id IS 'WordPress user ID for logged-in users';
COMMENT ON TABLE user_mapping IS 'Maps visitor IDs to user IDs for unified identification';
COMMENT ON COLUMN user_mapping.visitor_id IS 'Umami visitor ID (anonymous)';
COMMENT ON COLUMN user_mapping.user_id IS 'WordPress user ID (logged-in)';
COMMENT ON COLUMN user_mapping.session_count IS 'Number of sessions for this visitor-user pair';