feat: add friends!
This commit is contained in:
parent
ac3e7e242b
commit
e8b8b49643
13 changed files with 439 additions and 39 deletions
4
migrations/2025-07-07-131320_add_friends/down.sql
Normal file
4
migrations/2025-07-07-131320_add_friends/down.sql
Normal file
|
@ -0,0 +1,4 @@
|
|||
-- This file should undo anything in `up.sql`
|
||||
DROP TABLE friend_requests;
|
||||
DROP FUNCTION check_friend_request;
|
||||
DROP TABLE friends;
|
35
migrations/2025-07-07-131320_add_friends/up.sql
Normal file
35
migrations/2025-07-07-131320_add_friends/up.sql
Normal file
|
@ -0,0 +1,35 @@
|
|||
-- Your SQL goes here
|
||||
CREATE TABLE friends (
|
||||
uuid1 UUID REFERENCES users(uuid),
|
||||
uuid2 UUID REFERENCES users(uuid),
|
||||
accepted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
PRIMARY KEY (uuid1, uuid2),
|
||||
CHECK (uuid1 < uuid2)
|
||||
);
|
||||
|
||||
CREATE TABLE friend_requests (
|
||||
sender UUID REFERENCES users(uuid),
|
||||
receiver UUID REFERENCES users(uuid),
|
||||
requested_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
PRIMARY KEY (sender, receiver),
|
||||
CHECK (sender <> receiver)
|
||||
);
|
||||
|
||||
-- Create a function to check for existing friendships
|
||||
CREATE FUNCTION check_friend_request()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM friends
|
||||
WHERE (uuid1, uuid2) = (LEAST(NEW.sender, NEW.receiver), GREATEST(NEW.sender, NEW.receiver))
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Users are already friends';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create the trigger
|
||||
CREATE TRIGGER prevent_friend_request_conflict
|
||||
BEFORE INSERT OR UPDATE ON friend_requests
|
||||
FOR EACH ROW EXECUTE FUNCTION check_friend_request();
|
Loading…
Add table
Add a link
Reference in a new issue