Database
PostgreSQL schema
Schema
users
CREATE TABLE users (
id TEXT PRIMARY KEY, -- Google user ID
email TEXT UNIQUE NOT NULL,
name TEXT,
avatar TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);user_data
CREATE TABLE user_data (
user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
habits TEXT NOT NULL DEFAULT '[]', -- JSON string
days TEXT NOT NULL DEFAULT '{}', -- JSON string
reminders TEXT NOT NULL DEFAULT '{}',
custom_quotes TEXT NOT NULL DEFAULT '[]',
onboarding_completed INTEGER DEFAULT 0,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Dữ liệu lưu dạng JSON string trong cột TEXT — toàn bộ state push/pull cùng lúc (JSON blob pattern).
push_subscriptions
CREATE TABLE push_subscriptions (
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
endpoint TEXT UNIQUE NOT NULL,
keys_p256dh TEXT NOT NULL,
keys_auth TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);subscriptions
CREATE TABLE subscriptions (
user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
stripe_customer_id TEXT UNIQUE, -- Thực tế là LemonSqueezy ID
stripe_subscription_id TEXT, -- Legacy naming
plan TEXT DEFAULT 'free',
status TEXT DEFAULT 'active',
current_period_end TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Cascade Delete
Xóa user → tất cả dữ liệu liên quan tự động xóa theo (ON DELETE CASCADE).