-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema-terminal.sql
More file actions
71 lines (60 loc) · 2.24 KB
/
schema-terminal.sql
File metadata and controls
71 lines (60 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
-- InsForge: run from repo root with linked project:
-- npx @insforge/cli db import web3-terminal/schema-terminal.sql
CREATE TABLE IF NOT EXISTS terminal_wallets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
username TEXT NOT NULL UNIQUE,
balance NUMERIC(20, 8) NOT NULL DEFAULT 100 CHECK (balance >= 0),
created_at TIMESTAMPTZ DEFAULT NOW(),
last_active_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS terminal_transfers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
from_wallet_id UUID NOT NULL REFERENCES terminal_wallets(id),
to_wallet_id UUID NOT NULL REFERENCES terminal_wallets(id),
amount NUMERIC(20, 8) NOT NULL CHECK (amount > 0),
from_username TEXT NOT NULL,
to_username TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE OR REPLACE FUNCTION terminal_transfer(
p_from_id UUID,
p_to_username TEXT,
p_amount NUMERIC
) RETURNS JSONB AS $$
DECLARE
b_from NUMERIC;
v_to_id UUID;
v_from_name TEXT;
v_to_name TEXT;
BEGIN
IF p_amount IS NULL OR p_amount <= 0 THEN
RETURN jsonb_build_object('ok', false, 'error', 'amount must be positive');
END IF;
SELECT balance, username INTO b_from, v_from_name
FROM terminal_wallets WHERE id = p_from_id FOR UPDATE;
IF NOT FOUND THEN
RETURN jsonb_build_object('ok', false, 'error', 'wallet not found');
END IF;
IF b_from < p_amount THEN
RETURN jsonb_build_object('ok', false, 'error', 'insufficient balance');
END IF;
SELECT id, username INTO v_to_id, v_to_name
FROM terminal_wallets WHERE lower(username) = lower(trim(p_to_username));
IF NOT FOUND THEN
RETURN jsonb_build_object('ok', false, 'error', 'recipient not found');
END IF;
IF v_to_id = p_from_id THEN
RETURN jsonb_build_object('ok', false, 'error', 'cannot transfer to yourself');
END IF;
UPDATE terminal_wallets
SET balance = balance - p_amount, last_active_at = NOW()
WHERE id = p_from_id;
UPDATE terminal_wallets
SET balance = balance + p_amount, last_active_at = NOW()
WHERE id = v_to_id;
INSERT INTO terminal_transfers (
from_wallet_id, to_wallet_id, amount, from_username, to_username
) VALUES (p_from_id, v_to_id, p_amount, v_from_name, v_to_name);
RETURN jsonb_build_object('ok', true, 'to_username', v_to_name);
END;
$$ LANGUAGE plpgsql;