Skip to content

Commit 8dfbd0f

Browse files
authored
Create postgre_queries_triggers.sql
1 parent 199d039 commit 8dfbd0f

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

postgre_queries_triggers.sql

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
-- Users Table
2+
CREATE TABLE users (
3+
id SERIAL PRIMARY KEY,
4+
username VARCHAR(50) UNIQUE NOT NULL,
5+
email VARCHAR(100) UNIQUE NOT NULL,
6+
password_hash VARCHAR(255) NOT NULL,
7+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
8+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
9+
);
10+
11+
CREATE INDEX idx_users_email ON users(email);
12+
13+
-- Groups Table
14+
CREATE TABLE groups (
15+
id SERIAL PRIMARY KEY,
16+
name VARCHAR(100) NOT NULL,
17+
description TEXT,
18+
created_by INTEGER REFERENCES users(id),
19+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
20+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
21+
);
22+
23+
CREATE INDEX idx_groups_created_by ON groups(created_by);
24+
25+
-- User_Group Table (for many-to-many relationship between users and groups)
26+
CREATE TABLE user_group (
27+
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
28+
group_id INTEGER REFERENCES groups(id) ON DELETE CASCADE,
29+
role VARCHAR(20) DEFAULT 'MEMBER',
30+
joined_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
31+
PRIMARY KEY (user_id, group_id)
32+
);
33+
34+
CREATE INDEX idx_user_group_user_id ON user_group(user_id);
35+
CREATE INDEX idx_user_group_group_id ON user_group(group_id);
36+
37+
-- Expenses Table
38+
CREATE TABLE expenses (
39+
id SERIAL PRIMARY KEY,
40+
group_id INTEGER REFERENCES groups(id) ON DELETE CASCADE,
41+
payer_id INTEGER REFERENCES users(id),
42+
amount DECIMAL(10, 2) NOT NULL,
43+
description TEXT NOT NULL,
44+
date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
45+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
46+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
47+
);
48+
49+
CREATE INDEX idx_expenses_group_id ON expenses(group_id);
50+
CREATE INDEX idx_expenses_payer_id ON expenses(payer_id);
51+
52+
-- Expense_Splits Table
53+
CREATE TABLE expense_splits (
54+
id SERIAL PRIMARY KEY,
55+
expense_id INTEGER REFERENCES expenses(id) ON DELETE CASCADE,
56+
user_id INTEGER REFERENCES users(id),
57+
amount DECIMAL(10, 2) NOT NULL,
58+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
59+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
60+
);
61+
62+
CREATE INDEX idx_expense_splits_expense_id ON expense_splits(expense_id);
63+
CREATE INDEX idx_expense_splits_user_id ON expense_splits(user_id);
64+
65+
-- Settlements Table
66+
CREATE TABLE settlements (
67+
id SERIAL PRIMARY KEY,
68+
payer_id INTEGER REFERENCES users(id),
69+
payee_id INTEGER REFERENCES users(id),
70+
amount DECIMAL(10, 2) NOT NULL,
71+
group_id INTEGER REFERENCES groups(id),
72+
settled_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
73+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
74+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
75+
);
76+
77+
CREATE INDEX idx_settlements_payer_id ON settlements(payer_id);
78+
CREATE INDEX idx_settlements_payee_id ON settlements(payee_id);
79+
CREATE INDEX idx_settlements_group_id ON settlements(group_id);
80+
81+
-- Categories Table
82+
CREATE TABLE categories (
83+
id SERIAL PRIMARY KEY,
84+
name VARCHAR(50) UNIQUE NOT NULL,
85+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
86+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
87+
);
88+
89+
-- Add category_id to Expenses Table
90+
ALTER TABLE expenses
91+
ADD COLUMN category_id INTEGER REFERENCES categories(id);
92+
93+
CREATE INDEX idx_expenses_category_id ON expenses(category_id);
94+
95+
-- Create a function to update the updated_at timestamp
96+
CREATE OR REPLACE FUNCTION update_modified_column()
97+
RETURNS TRIGGER AS $$
98+
BEGIN
99+
NEW.updated_at = now();
100+
RETURN NEW;
101+
END;
102+
$$ language 'plpgsql';
103+
104+
-- Create triggers to automatically update the updated_at column
105+
CREATE TRIGGER update_user_modtime BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_modified_column();
106+
CREATE TRIGGER update_group_modtime BEFORE UPDATE ON groups FOR EACH ROW EXECUTE FUNCTION update_modified_column();
107+
CREATE TRIGGER update_expense_modtime BEFORE UPDATE ON expenses FOR EACH ROW EXECUTE FUNCTION update_modified_column();
108+
CREATE TRIGGER update_expense_split_modtime BEFORE UPDATE ON expense_splits FOR EACH ROW EXECUTE FUNCTION update_modified_column();
109+
CREATE TRIGGER update_settlement_modtime BEFORE UPDATE ON settlements FOR EACH ROW EXECUTE FUNCTION update_modified_column();
110+
CREATE TRIGGER update_category_modtime BEFORE UPDATE ON categories FOR EACH ROW EXECUTE FUNCTION update_modified_column();

0 commit comments

Comments
 (0)