Steadii Docs

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).

On this page