wallet_grant_welcome_once¶
Сигнатура: wallet_grant_welcome_once("p_tg_user_id" bigint, "p_tg_username" "text", "p_amount" numeric, "p_lang" "text" DEFAULT NULL::"text") RETURNS "jsonb"
Язык: sql
Security: DEFINER
Тело функции¶
declare
u public.users;
v_balance numeric;
v_already boolean;
v_wallet_res jsonb;
begin
-- защита от кривых значений
if p_amount is null or p_amount <= 0 then
return jsonb_build_object(
'ok', false,
'error', 'INVALID_AMOUNT'
);
end if;
-- 1) ensure_user: создаём/обновляем пользователя + кошелёк (без баланса)
select * into u
from public.ensure_user(p_tg_user_id, p_tg_username);
-- 2) при желании — обновляем язык, если прилетел
if p_lang is not null then
update public.users
set lang = p_lang
where id = u.id;
end if;
-- 3) проверяем, выдавали ли уже welcome-бонус
select exists(
select 1
from public.wallet_tx
where user_id = u.id
and kind = 'welcome'
) into v_already;
if v_already then
-- просто возвращаем текущий баланс
select balance into v_balance
from public.wallets
where user_id = u.id;
return jsonb_build_object(
'ok', true,
'welcome_applied', false,
'user_id', u.id,
'balance', coalesce(v_balance, 0)
);
end if;
-- 4) выдаём welcome-кредиты (один раз)
v_wallet_res := public.wallet_credit(
u.id,
p_amount,
'welcome',
jsonb_build_object('source', 'onboarding')
);
-- wallet_credit уже вернёт { ok, tx_id, balance } — просто расширим ответ
return v_wallet_res || jsonb_build_object(
'welcome_applied', true,
'user_id', u.id,
'granted', p_amount
);
end;