Перейти к содержанию

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;