39 lines
976 B
PL/PgSQL
39 lines
976 B
PL/PgSQL
-- CreateTable
|
|
CREATE TABLE "Donation" (
|
|
"id" SERIAL NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"sats" INTEGER NOT NULL,
|
|
"userId" INTEGER NOT NULL,
|
|
|
|
PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Donation" ADD FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
CREATE OR REPLACE FUNCTION donate(sats INTEGER, user_id INTEGER)
|
|
RETURNS INTEGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
DECLARE
|
|
user_sats INTEGER;
|
|
BEGIN
|
|
PERFORM ASSERT_SERIALIZED();
|
|
|
|
SELECT msats / 1000
|
|
INTO user_sats
|
|
FROM users WHERE id = user_id;
|
|
|
|
IF sats > user_sats THEN
|
|
RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS';
|
|
END IF;
|
|
|
|
UPDATE users SET msats = msats - (sats * 1000) WHERE id = user_id;
|
|
|
|
INSERT INTO "Donate" (sats, "userId", created_at, updated_at)
|
|
VALUES (sats, user_id, now_utc(), now_utc());
|
|
|
|
RETURN sats;
|
|
END;
|
|
$$; |