From 5cf1e0c16ae562c85fd231b38c0e205d69e60fa1 Mon Sep 17 00:00:00 2001 From: iskandarsulaili Date: Thu, 6 Nov 2025 19:53:33 +0800 Subject: [PATCH] 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. --- .../19_add_user_id_mapping/migration.sql | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 prisma/migrations/19_add_user_id_mapping/migration.sql diff --git a/prisma/migrations/19_add_user_id_mapping/migration.sql b/prisma/migrations/19_add_user_id_mapping/migration.sql new file mode 100644 index 00000000..b29cb756 --- /dev/null +++ b/prisma/migrations/19_add_user_id_mapping/migration.sql @@ -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'; +