Skip to content

Commit 477ae0c

Browse files
authored
Merge pull request #9 from waterbustech/migrate/data-schema
feat: new db schema with indexes and optimized types
2 parents fa38a71 + 1f9d8a2 commit 477ae0c

File tree

17 files changed

+409
-321
lines changed

17 files changed

+409
-321
lines changed

README.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,18 @@ This project uses the following technologies:
5353
- [Rust](https://www.rust-lang.org/) `1.82+`
5454
- [PostgreSQL](https://www.postgresql.org/) `16+`
5555
- [Redis](https://redis.io/) `7+`
56+
- [Diesel CLI](https://diesel.rs/)
5657

58+
- Install `Diesel CLI`:
59+
60+
```bash
61+
cargo install diesel_cli --no-default-features --features postgres
62+
```
5763

5864
## ⚡️ Quick Start
5965

6066
Get up and running with Waterbus in just a few steps.
6167

62-
### 🗂️ Create db schema
63-
64-
- Connect to your PostgreSQL database and run the schema file:
65-
66-
```bash
67-
psql -h <postgres-host> -U <postgres-user> -d <database-name> -f schema.sql
68-
```
69-
7068
### 🛠 Local Build
7169

7270
- Start by cloning the Waterbus server repository:
@@ -82,6 +80,12 @@ cd waterbus-rs
8280
mv example.env .env
8381
```
8482

83+
- Initialize the database
84+
85+
```bash
86+
diesel migration run
87+
```
88+
8589
- Build & Run the Server
8690

8791
```bash

diesel.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# see https://diesel.rs/guides/configuring-diesel-cli
33

44
[print_schema]
5-
# file = "src/core/database/schema.rs"
5+
file = "signalling/src/core/database/schema.rs"
66
custom_type_derives = ["diesel::query_builder::QueryId"]
77

88
[migrations_directory]

example.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ CLIENT_SECRET_KEY=
33
SERVER_SECRET_KEY=
44
TLS_ENABLED=false
55

6-
DATABASE_URI=postgres://postgres:password@localhost:5432/database
6+
DATABASE_URL=postgres://postgres:password@localhost:5432/database
77

88
REDIS_URIS=redis://127.0.0.1:6379?protocol=resp3,redis://127.0.0.1:6380?protocol=resp3,redis://127.0.0.1:6381?protocol=resp3,redis://127.0.0.1:6382?protocol=resp3,redis://127.0.0.1:6383?protocol=resp3,redis://127.0.0.1:6384?protocol=resp3
99

migrations/2025-04-18-044620_create_all_tables/down.sql

Lines changed: 0 additions & 10 deletions
This file was deleted.

migrations/2025-04-18-044620_create_all_tables/up.sql

Lines changed: 0 additions & 65 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
DROP TRIGGER IF EXISTS trigger_update_room_latest_message ON messages;
2+
DROP TRIGGER IF EXISTS trigger_users_updated_at ON users;
3+
DROP TRIGGER IF EXISTS trigger_rooms_updated_at ON rooms;
4+
DROP TRIGGER IF EXISTS trigger_messages_updated_at ON messages;
5+
6+
DROP FUNCTION IF EXISTS update_room_latest_message();
7+
DROP FUNCTION IF EXISTS update_updated_at_column();
8+
9+
DROP INDEX IF EXISTS idx_users_user_name;
10+
DROP INDEX IF EXISTS idx_users_external_id;
11+
DROP INDEX IF EXISTS idx_users_last_seen;
12+
DROP INDEX IF EXISTS idx_users_created_at;
13+
DROP INDEX IF EXISTS idx_users_deleted_at;
14+
15+
DROP INDEX IF EXISTS idx_rooms_code;
16+
DROP INDEX IF EXISTS idx_rooms_latest_message;
17+
DROP INDEX IF EXISTS idx_rooms_status_type;
18+
DROP INDEX IF EXISTS idx_rooms_created_at;
19+
DROP INDEX IF EXISTS idx_rooms_deleted_at;
20+
21+
DROP INDEX IF EXISTS idx_members_user_room;
22+
DROP INDEX IF EXISTS idx_members_user_id;
23+
DROP INDEX IF EXISTS idx_members_room_id;
24+
DROP INDEX IF EXISTS idx_members_role;
25+
DROP INDEX IF EXISTS idx_members_created_at;
26+
DROP INDEX IF EXISTS idx_members_deleted_at;
27+
28+
DROP INDEX IF EXISTS idx_messages_room_created;
29+
DROP INDEX IF EXISTS idx_messages_created_by;
30+
DROP INDEX IF EXISTS idx_messages_type_status;
31+
DROP INDEX IF EXISTS idx_messages_created_at;
32+
DROP INDEX IF EXISTS idx_messages_room_id;
33+
DROP INDEX IF EXISTS idx_messages_deleted_at;
34+
35+
DROP INDEX IF EXISTS idx_participants_room_id;
36+
DROP INDEX IF EXISTS idx_participants_user_id;
37+
DROP INDEX IF EXISTS idx_participants_node_id;
38+
DROP INDEX IF EXISTS idx_participants_status;
39+
DROP INDEX IF EXISTS idx_participants_created_at;
40+
DROP INDEX IF EXISTS idx_participants_deleted_at;
41+
42+
DROP TABLE IF EXISTS participants;
43+
DROP TABLE IF EXISTS messages;
44+
DROP TABLE IF EXISTS members;
45+
DROP TABLE IF EXISTS rooms;
46+
DROP TABLE IF EXISTS users;
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
CREATE TABLE users (
2+
id SERIAL PRIMARY KEY,
3+
full_name VARCHAR(255),
4+
user_name VARCHAR(50) NOT NULL,
5+
bio TEXT,
6+
external_id VARCHAR(100) NOT NULL,
7+
avatar VARCHAR(500),
8+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
9+
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
10+
deleted_at TIMESTAMP,
11+
last_seen_at TIMESTAMP
12+
);
13+
14+
CREATE TABLE rooms (
15+
id SERIAL PRIMARY KEY,
16+
title VARCHAR(255) NOT NULL,
17+
password VARCHAR(255),
18+
avatar VARCHAR(500),
19+
latest_message_created_at TIMESTAMP,
20+
code VARCHAR(20) NOT NULL UNIQUE,
21+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
22+
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
23+
deleted_at TIMESTAMP,
24+
latest_message_id INTEGER,
25+
status SMALLINT NOT NULL DEFAULT 1,
26+
type SMALLINT NOT NULL DEFAULT 1
27+
);
28+
29+
CREATE TABLE members (
30+
id SERIAL PRIMARY KEY,
31+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
32+
deleted_at TIMESTAMP,
33+
soft_deleted_at TIMESTAMP,
34+
user_id INTEGER NOT NULL,
35+
room_id INTEGER NOT NULL,
36+
role SMALLINT NOT NULL DEFAULT 1,
37+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
38+
FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE
39+
);
40+
41+
CREATE TABLE messages (
42+
id SERIAL PRIMARY KEY,
43+
data TEXT NOT NULL,
44+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
45+
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
46+
deleted_at TIMESTAMP,
47+
created_by_id INTEGER NOT NULL,
48+
room_id INTEGER NOT NULL,
49+
type SMALLINT NOT NULL DEFAULT 1,
50+
status SMALLINT NOT NULL DEFAULT 1,
51+
FOREIGN KEY (created_by_id) REFERENCES users(id) ON DELETE CASCADE,
52+
FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE
53+
);
54+
55+
CREATE TABLE participants (
56+
id SERIAL PRIMARY KEY,
57+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
58+
deleted_at TIMESTAMP,
59+
user_id INTEGER NOT NULL,
60+
room_id INTEGER NOT NULL,
61+
node_id VARCHAR(100),
62+
status SMALLINT NOT NULL DEFAULT 1,
63+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
64+
FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE
65+
);
66+
67+
-- Users table indexes
68+
CREATE UNIQUE INDEX idx_users_user_name ON users(user_name) WHERE deleted_at IS NULL;
69+
CREATE UNIQUE INDEX idx_users_external_id ON users(external_id) WHERE deleted_at IS NULL;
70+
CREATE INDEX idx_users_last_seen ON users(last_seen_at) WHERE deleted_at IS NULL;
71+
CREATE INDEX idx_users_created_at ON users(created_at);
72+
CREATE INDEX idx_users_deleted_at ON users(deleted_at) WHERE deleted_at IS NOT NULL;
73+
74+
-- Rooms table indexes
75+
CREATE UNIQUE INDEX idx_rooms_code ON rooms(code) WHERE deleted_at IS NULL;
76+
CREATE INDEX idx_rooms_latest_message ON rooms(latest_message_created_at) WHERE deleted_at IS NULL;
77+
CREATE INDEX idx_rooms_status_type ON rooms(status, type) WHERE deleted_at IS NULL;
78+
CREATE INDEX idx_rooms_created_at ON rooms(created_at);
79+
CREATE INDEX idx_rooms_deleted_at ON rooms(deleted_at) WHERE deleted_at IS NOT NULL;
80+
81+
-- Members table indexes
82+
CREATE UNIQUE INDEX idx_members_user_room ON members(user_id, room_id) WHERE deleted_at IS NULL AND soft_deleted_at IS NULL;
83+
CREATE INDEX idx_members_user_id ON members(user_id) WHERE deleted_at IS NULL;
84+
CREATE INDEX idx_members_room_id ON members(room_id) WHERE deleted_at IS NULL;
85+
CREATE INDEX idx_members_role ON members(role) WHERE deleted_at IS NULL;
86+
CREATE INDEX idx_members_created_at ON members(created_at);
87+
CREATE INDEX idx_members_deleted_at ON members(deleted_at) WHERE deleted_at IS NOT NULL;
88+
89+
-- Messages table indexes
90+
CREATE INDEX idx_messages_room_created ON messages(room_id, created_at) WHERE deleted_at IS NULL;
91+
CREATE INDEX idx_messages_created_by ON messages(created_by_id) WHERE deleted_at IS NULL;
92+
CREATE INDEX idx_messages_type_status ON messages(type, status) WHERE deleted_at IS NULL;
93+
CREATE INDEX idx_messages_created_at ON messages(created_at);
94+
CREATE INDEX idx_messages_room_id ON messages(room_id) WHERE deleted_at IS NULL;
95+
CREATE INDEX idx_messages_deleted_at ON messages(deleted_at) WHERE deleted_at IS NOT NULL;
96+
97+
-- Participants table indexes
98+
CREATE INDEX idx_participants_room_id ON participants(room_id) WHERE deleted_at IS NULL;
99+
CREATE INDEX idx_participants_user_id ON participants(user_id) WHERE deleted_at IS NULL;
100+
CREATE INDEX idx_participants_node_id ON participants(node_id) WHERE deleted_at IS NULL;
101+
CREATE INDEX idx_participants_status ON participants(status) WHERE deleted_at IS NULL;
102+
CREATE INDEX idx_participants_created_at ON participants(created_at);
103+
CREATE INDEX idx_participants_deleted_at ON participants(deleted_at) WHERE deleted_at IS NOT NULL;
104+
105+
-- Update latest message trigger for rooms
106+
CREATE OR REPLACE FUNCTION update_room_latest_message()
107+
RETURNS TRIGGER AS $$
108+
BEGIN
109+
IF TG_OP = 'INSERT' THEN
110+
UPDATE rooms
111+
SET latest_message_id = NEW.id,
112+
latest_message_created_at = NEW.created_at,
113+
updated_at = CURRENT_TIMESTAMP
114+
WHERE id = NEW.room_id;
115+
RETURN NEW;
116+
END IF;
117+
RETURN NULL;
118+
END;
119+
$$ LANGUAGE plpgsql;
120+
121+
CREATE TRIGGER trigger_update_room_latest_message
122+
AFTER INSERT ON messages
123+
FOR EACH ROW
124+
EXECUTE FUNCTION update_room_latest_message();
125+
126+
-- Update updated_at column triggers
127+
CREATE OR REPLACE FUNCTION update_updated_at_column()
128+
RETURNS TRIGGER AS $$
129+
BEGIN
130+
NEW.updated_at = CURRENT_TIMESTAMP;
131+
RETURN NEW;
132+
END;
133+
$$ LANGUAGE plpgsql;
134+
135+
CREATE TRIGGER trigger_users_updated_at
136+
BEFORE UPDATE ON users
137+
FOR EACH ROW
138+
EXECUTE FUNCTION update_updated_at_column();
139+
140+
CREATE TRIGGER trigger_rooms_updated_at
141+
BEFORE UPDATE ON rooms
142+
FOR EACH ROW
143+
EXECUTE FUNCTION update_updated_at_column();
144+
145+
CREATE TRIGGER trigger_messages_updated_at
146+
BEFORE UPDATE ON messages
147+
FOR EACH ROW
148+
EXECUTE FUNCTION update_updated_at_column();

schema.sql

Lines changed: 0 additions & 65 deletions
This file was deleted.

0 commit comments

Comments
 (0)