DispelEvilBot/sql/R__functions_shop.sql

75 lines
1.8 KiB
PL/PgSQL

-- Магазин: списки и покупки.
CREATE OR REPLACE FUNCTION bot.get_titles_list()
RETURNS TABLE(i integer, n character varying, p bigint)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT id_title, title, price
FROM bot.titles
WHERE visible = true
ORDER BY price DESC;
END;
$$;
CREATE OR REPLACE FUNCTION bot.get_donats_list()
RETURNS TABLE(i integer, n character varying, p bigint)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT id_donat, title, price
FROM bot.donats
WHERE visible = true
ORDER BY price DESC;
END;
$$;
CREATE OR REPLACE FUNCTION bot.buy_title(p_id_user bigint, p_id_title integer)
RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
v_money bigint;
v_price bigint;
BEGIN
SELECT sum(amount) INTO v_money FROM bot.money WHERE id_user = p_id_user;
SELECT price INTO v_price FROM bot.titles WHERE id_title = p_id_title;
IF v_money IS NULL OR v_money < v_price THEN
RETURN -1;
END IF;
CALL bot.money_action(p_id_user, -1 * v_price, 2);
UPDATE bot.de_users SET id_title = p_id_title WHERE id_user = p_id_user;
RETURN 1;
END;
$$;
CREATE OR REPLACE FUNCTION bot.buy_donat(p_id_user bigint, p_id_donat integer)
RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
v_money bigint;
v_price bigint;
v_promo varchar;
BEGIN
SELECT sum(amount) INTO v_money FROM bot.money WHERE id_user = p_id_user;
SELECT price INTO v_price FROM bot.donats WHERE id_donat = p_id_donat;
IF v_money IS NULL OR v_money < v_price THEN
RETURN '-1';
END IF;
CALL bot.money_action(p_id_user, -1 * v_price, 2);
v_promo := md5(random()::text);
INSERT INTO bot.user_donats (id_user, id_donat, promo, stat)
VALUES (p_id_user, p_id_donat, v_promo, false);
RETURN v_promo;
END;
$$;