Update referral points pricing
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
-- PolyWeather balanced referral points program.
|
||||
-- Run once before deploying referral point rewards.
|
||||
|
||||
alter table public.referral_rewards
|
||||
add column if not exists reward_points integer not null default 0;
|
||||
|
||||
alter table public.referral_rewards
|
||||
alter column reward_days set default 0;
|
||||
|
||||
alter table public.referral_rewards
|
||||
drop constraint if exists referral_rewards_reward_days_check;
|
||||
|
||||
alter table public.referral_rewards
|
||||
add constraint referral_rewards_reward_days_check
|
||||
check (reward_days >= 0 and reward_days <= 30);
|
||||
|
||||
alter table public.referral_rewards
|
||||
drop constraint if exists referral_rewards_reward_points_check;
|
||||
|
||||
alter table public.referral_rewards
|
||||
add constraint referral_rewards_reward_points_check
|
||||
check (reward_points >= 0 and reward_points <= 100000);
|
||||
|
||||
create index if not exists idx_referral_rewards_referrer_month_points
|
||||
on public.referral_rewards(referrer_user_id, created_at desc)
|
||||
include (id, reward_points);
|
||||
|
||||
create table if not exists public.points_ledger (
|
||||
id bigserial primary key,
|
||||
user_id uuid not null references auth.users(id) on delete cascade,
|
||||
delta integer not null check (delta <> 0),
|
||||
source text not null,
|
||||
reason text not null,
|
||||
payment_intent_id text,
|
||||
referral_attribution_id bigint references public.referral_attributions(id) on delete set null,
|
||||
metadata jsonb not null default '{}'::jsonb,
|
||||
created_at timestamptz not null default now()
|
||||
);
|
||||
|
||||
create index if not exists idx_points_ledger_user_created
|
||||
on public.points_ledger(user_id, created_at desc);
|
||||
|
||||
create index if not exists idx_points_ledger_referral
|
||||
on public.points_ledger(referral_attribution_id)
|
||||
where referral_attribution_id is not null;
|
||||
|
||||
alter table public.points_ledger enable row level security;
|
||||
|
||||
drop policy if exists points_ledger_select_own on public.points_ledger;
|
||||
create policy points_ledger_select_own
|
||||
on public.points_ledger
|
||||
for select
|
||||
to authenticated
|
||||
using (auth.uid() = user_id);
|
||||
|
||||
analyze public.referral_rewards;
|
||||
analyze public.points_ledger;
|
||||
@@ -0,0 +1,94 @@
|
||||
-- Verify the balanced referral-points migration.
|
||||
-- Run after scripts/supabase/referral_points_rewards_20260530.sql.
|
||||
|
||||
with checks(check_name, ok) as (
|
||||
values
|
||||
(
|
||||
'referral_rewards.reward_points column',
|
||||
exists (
|
||||
select 1
|
||||
from information_schema.columns
|
||||
where table_schema = 'public'
|
||||
and table_name = 'referral_rewards'
|
||||
and column_name = 'reward_points'
|
||||
and is_nullable = 'NO'
|
||||
)
|
||||
),
|
||||
(
|
||||
'referral_rewards.reward_points check',
|
||||
exists (
|
||||
select 1
|
||||
from pg_constraint c
|
||||
join pg_class t on t.oid = c.conrelid
|
||||
join pg_namespace n on n.oid = t.relnamespace
|
||||
where n.nspname = 'public'
|
||||
and t.relname = 'referral_rewards'
|
||||
and c.conname = 'referral_rewards_reward_points_check'
|
||||
)
|
||||
),
|
||||
(
|
||||
'referral_rewards monthly reward index includes points',
|
||||
exists (
|
||||
select 1
|
||||
from pg_indexes
|
||||
where schemaname = 'public'
|
||||
and tablename = 'referral_rewards'
|
||||
and indexname = 'idx_referral_rewards_referrer_month'
|
||||
and indexdef ilike '%reward_points%'
|
||||
)
|
||||
),
|
||||
(
|
||||
'points_ledger table',
|
||||
exists (
|
||||
select 1
|
||||
from information_schema.tables
|
||||
where table_schema = 'public'
|
||||
and table_name = 'points_ledger'
|
||||
)
|
||||
),
|
||||
(
|
||||
'points_ledger user index',
|
||||
exists (
|
||||
select 1
|
||||
from pg_indexes
|
||||
where schemaname = 'public'
|
||||
and tablename = 'points_ledger'
|
||||
and indexname = 'idx_points_ledger_user_created'
|
||||
)
|
||||
),
|
||||
(
|
||||
'points_ledger referral index',
|
||||
exists (
|
||||
select 1
|
||||
from pg_indexes
|
||||
where schemaname = 'public'
|
||||
and tablename = 'points_ledger'
|
||||
and indexname = 'idx_points_ledger_referral'
|
||||
)
|
||||
),
|
||||
(
|
||||
'points_ledger RLS enabled',
|
||||
exists (
|
||||
select 1
|
||||
from pg_class t
|
||||
join pg_namespace n on n.oid = t.relnamespace
|
||||
where n.nspname = 'public'
|
||||
and t.relname = 'points_ledger'
|
||||
and t.relrowsecurity
|
||||
)
|
||||
),
|
||||
(
|
||||
'points_ledger own-row select policy',
|
||||
exists (
|
||||
select 1
|
||||
from pg_policies
|
||||
where schemaname = 'public'
|
||||
and tablename = 'points_ledger'
|
||||
and policyname = 'points_ledger_select_own'
|
||||
and cmd = 'SELECT'
|
||||
)
|
||||
)
|
||||
)
|
||||
select check_name, ok
|
||||
from checks
|
||||
order by check_name;
|
||||
@@ -392,7 +392,8 @@ create table if not exists public.referral_rewards (
|
||||
referred_user_id uuid not null references auth.users(id) on delete cascade,
|
||||
payment_intent_id text not null,
|
||||
tx_hash text,
|
||||
reward_days integer not null default 3 check (reward_days > 0 and reward_days <= 30),
|
||||
reward_days integer not null default 0 check (reward_days >= 0 and reward_days <= 30),
|
||||
reward_points integer not null default 0 check (reward_points >= 0 and reward_points <= 100000),
|
||||
created_at timestamptz not null default now()
|
||||
);
|
||||
|
||||
@@ -401,7 +402,35 @@ create unique index if not exists uq_referral_rewards_attribution
|
||||
|
||||
create index if not exists idx_referral_rewards_referrer_month
|
||||
on public.referral_rewards(referrer_user_id, created_at desc)
|
||||
include (id, reward_days);
|
||||
include (id, reward_days, reward_points);
|
||||
|
||||
create table if not exists public.points_ledger (
|
||||
id bigserial primary key,
|
||||
user_id uuid not null references auth.users(id) on delete cascade,
|
||||
delta integer not null check (delta <> 0),
|
||||
source text not null,
|
||||
reason text not null,
|
||||
payment_intent_id text,
|
||||
referral_attribution_id bigint references public.referral_attributions(id) on delete set null,
|
||||
metadata jsonb not null default '{}'::jsonb,
|
||||
created_at timestamptz not null default now()
|
||||
);
|
||||
|
||||
create index if not exists idx_points_ledger_user_created
|
||||
on public.points_ledger(user_id, created_at desc);
|
||||
|
||||
create index if not exists idx_points_ledger_referral
|
||||
on public.points_ledger(referral_attribution_id)
|
||||
where referral_attribution_id is not null;
|
||||
|
||||
alter table public.points_ledger enable row level security;
|
||||
|
||||
drop policy if exists points_ledger_select_own on public.points_ledger;
|
||||
create policy points_ledger_select_own
|
||||
on public.points_ledger
|
||||
for select
|
||||
to authenticated
|
||||
using (auth.uid() = user_id);
|
||||
|
||||
create table if not exists public.wallet_link_challenges (
|
||||
id bigserial primary key,
|
||||
|
||||
@@ -77,7 +77,8 @@ create table if not exists public.referral_rewards (
|
||||
referred_user_id uuid not null references auth.users(id) on delete cascade,
|
||||
payment_intent_id text not null,
|
||||
tx_hash text,
|
||||
reward_days integer not null default 3 check (reward_days > 0 and reward_days <= 30),
|
||||
reward_days integer not null default 0 check (reward_days >= 0 and reward_days <= 30),
|
||||
reward_points integer not null default 0 check (reward_points >= 0 and reward_points <= 100000),
|
||||
created_at timestamptz not null default now()
|
||||
);
|
||||
|
||||
@@ -86,7 +87,7 @@ create unique index if not exists uq_referral_rewards_attribution
|
||||
|
||||
create index if not exists idx_referral_rewards_referrer_month
|
||||
on public.referral_rewards(referrer_user_id, created_at desc)
|
||||
include (id, reward_days);
|
||||
include (id, reward_days, reward_points);
|
||||
|
||||
analyze public.trial_claims;
|
||||
analyze public.trial_claim_wallets;
|
||||
|
||||
Reference in New Issue
Block a user