Initial commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
-- PostgreSQL schema initialization for core models
|
||||
-- Derived from Sequelize models: User, Group, Friendship, FriendRequest, and the User<->Group join table
|
||||
|
||||
-- Drop tables in dependency order
|
||||
DROP TABLE IF EXISTS "UserGroups" CASCADE;
|
||||
DROP TABLE IF EXISTS friend_requests CASCADE;
|
||||
DROP TABLE IF EXISTS friendships CASCADE;
|
||||
DROP TABLE IF EXISTS groups CASCADE;
|
||||
DROP TABLE IF EXISTS users CASCADE;
|
||||
|
||||
-- users table
|
||||
CREATE TABLE users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
"email" VARCHAR(255) NOT NULL UNIQUE,
|
||||
"avatarUrl" VARCHAR(255) NOT NULL,
|
||||
score INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
-- groups table
|
||||
CREATE TABLE groups (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
-- friendships table
|
||||
-- In-model hook ensures user1Id < user2Id at application level; we also add a DB check for safety.
|
||||
CREATE TABLE friendships (
|
||||
id SERIAL PRIMARY KEY,
|
||||
"user1Id" INTEGER NOT NULL,
|
||||
"user2Id" INTEGER NOT NULL,
|
||||
CONSTRAINT friendships_user_order_chk CHECK ("user1Id" < "user2Id"),
|
||||
CONSTRAINT friendships_user_pair_uniq UNIQUE ("user1Id", "user2Id"),
|
||||
CONSTRAINT friendships_user1_fk FOREIGN KEY ("user1Id") REFERENCES users(id) ON DELETE CASCADE,
|
||||
CONSTRAINT friendships_user2_fk FOREIGN KEY ("user2Id") REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- friend_requests table (with Sequelize default timestamps)
|
||||
CREATE TABLE friend_requests (
|
||||
id SERIAL PRIMARY KEY,
|
||||
status VARCHAR(50) NOT NULL DEFAULT 'PENDING',
|
||||
"fromUserId" INTEGER NOT NULL,
|
||||
"toUserId" INTEGER NOT NULL,
|
||||
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT friend_requests_from_fk FOREIGN KEY ("fromUserId") REFERENCES users(id) ON DELETE CASCADE,
|
||||
CONSTRAINT friend_requests_to_fk FOREIGN KEY ("toUserId") REFERENCES users(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Optional: keep updatedAt current via trigger (Sequelize usually updates it in app code)
|
||||
-- You can uncomment the below if you want DB-side auto update
|
||||
-- CREATE OR REPLACE FUNCTION set_updated_at()
|
||||
-- RETURNS TRIGGER AS $$
|
||||
-- BEGIN
|
||||
-- NEW."updatedAt" = NOW();
|
||||
-- RETURN NEW;
|
||||
-- END;
|
||||
-- $$ LANGUAGE plpgsql;
|
||||
-- CREATE TRIGGER friend_requests_set_updated_at
|
||||
-- BEFORE UPDATE ON friend_requests
|
||||
-- FOR EACH ROW
|
||||
-- EXECUTE FUNCTION set_updated_at();
|
||||
|
||||
-- User <-> Group many-to-many join table
|
||||
CREATE TABLE "UserGroups" (
|
||||
"userId" INTEGER NOT NULL,
|
||||
"groupId" INTEGER NOT NULL,
|
||||
CONSTRAINT usergroups_user_fk FOREIGN KEY ("userId") REFERENCES users(id) ON DELETE CASCADE,
|
||||
CONSTRAINT usergroups_group_fk FOREIGN KEY ("groupId") REFERENCES groups(id) ON DELETE CASCADE,
|
||||
CONSTRAINT usergroups_user_group_uniq UNIQUE ("userId", "groupId")
|
||||
);
|
||||
|
||||
-- Helpful indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_friend_requests_from ON friend_requests ("fromUserId");
|
||||
CREATE INDEX IF NOT EXISTS idx_friend_requests_to ON friend_requests ("toUserId");
|
||||
CREATE INDEX IF NOT EXISTS idx_friendships_user1 ON friendships ("user1Id");
|
||||
CREATE INDEX IF NOT EXISTS idx_friendships_user2 ON friendships ("user2Id");
|
||||
Reference in New Issue
Block a user